1*74fe6c29SRuslan Bukin /* 2*74fe6c29SRuslan Bukin * Copyright (c) 2013-2018, Intel Corporation 3*74fe6c29SRuslan Bukin * 4*74fe6c29SRuslan Bukin * Redistribution and use in source and binary forms, with or without 5*74fe6c29SRuslan Bukin * modification, are permitted provided that the following conditions are met: 6*74fe6c29SRuslan Bukin * 7*74fe6c29SRuslan Bukin * * Redistributions of source code must retain the above copyright notice, 8*74fe6c29SRuslan Bukin * this list of conditions and the following disclaimer. 9*74fe6c29SRuslan Bukin * * Redistributions in binary form must reproduce the above copyright notice, 10*74fe6c29SRuslan Bukin * this list of conditions and the following disclaimer in the documentation 11*74fe6c29SRuslan Bukin * and/or other materials provided with the distribution. 12*74fe6c29SRuslan Bukin * * Neither the name of Intel Corporation nor the names of its contributors 13*74fe6c29SRuslan Bukin * may be used to endorse or promote products derived from this software 14*74fe6c29SRuslan Bukin * without specific prior written permission. 15*74fe6c29SRuslan Bukin * 16*74fe6c29SRuslan Bukin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17*74fe6c29SRuslan Bukin * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*74fe6c29SRuslan Bukin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*74fe6c29SRuslan Bukin * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 20*74fe6c29SRuslan Bukin * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21*74fe6c29SRuslan Bukin * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22*74fe6c29SRuslan Bukin * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23*74fe6c29SRuslan Bukin * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24*74fe6c29SRuslan Bukin * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25*74fe6c29SRuslan Bukin * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26*74fe6c29SRuslan Bukin * POSSIBILITY OF SUCH DAMAGE. 27*74fe6c29SRuslan Bukin */ 28*74fe6c29SRuslan Bukin 29*74fe6c29SRuslan Bukin #include "ptunit.h" 30*74fe6c29SRuslan Bukin 31*74fe6c29SRuslan Bukin #include "pt_cpu.h" 32*74fe6c29SRuslan Bukin #include "pt_cpuid.h" 33*74fe6c29SRuslan Bukin 34*74fe6c29SRuslan Bukin #include "intel-pt.h" 35*74fe6c29SRuslan Bukin 36*74fe6c29SRuslan Bukin #include <stdlib.h> 37*74fe6c29SRuslan Bukin 38*74fe6c29SRuslan Bukin 39*74fe6c29SRuslan Bukin void pt_cpuid(uint32_t leaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, 40*74fe6c29SRuslan Bukin uint32_t *edx) 41*74fe6c29SRuslan Bukin { 42*74fe6c29SRuslan Bukin (void) leaf; 43*74fe6c29SRuslan Bukin (void) eax; 44*74fe6c29SRuslan Bukin (void) ebx; 45*74fe6c29SRuslan Bukin (void) ecx; 46*74fe6c29SRuslan Bukin (void) edx; 47*74fe6c29SRuslan Bukin } 48*74fe6c29SRuslan Bukin 49*74fe6c29SRuslan Bukin 50*74fe6c29SRuslan Bukin static struct ptunit_result cpu_valid(void) 51*74fe6c29SRuslan Bukin { 52*74fe6c29SRuslan Bukin struct pt_cpu cpu; 53*74fe6c29SRuslan Bukin int error; 54*74fe6c29SRuslan Bukin 55*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6/44/2"); 56*74fe6c29SRuslan Bukin ptu_int_eq(error, 0); 57*74fe6c29SRuslan Bukin ptu_int_eq(cpu.vendor, pcv_intel); 58*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.family, 6); 59*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.model, 44); 60*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.stepping, 2); 61*74fe6c29SRuslan Bukin 62*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "0xf/0x2c/0xf"); 63*74fe6c29SRuslan Bukin ptu_int_eq(error, 0); 64*74fe6c29SRuslan Bukin ptu_int_eq(cpu.vendor, pcv_intel); 65*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.family, 0xf); 66*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.model, 0x2c); 67*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.stepping, 0xf); 68*74fe6c29SRuslan Bukin 69*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "022/054/017"); 70*74fe6c29SRuslan Bukin ptu_int_eq(error, 0); 71*74fe6c29SRuslan Bukin ptu_int_eq(cpu.vendor, pcv_intel); 72*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.family, 022); 73*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.model, 054); 74*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.stepping, 017); 75*74fe6c29SRuslan Bukin 76*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6/44"); 77*74fe6c29SRuslan Bukin ptu_int_eq(error, 0); 78*74fe6c29SRuslan Bukin ptu_int_eq(cpu.vendor, pcv_intel); 79*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.family, 6); 80*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.model, 44); 81*74fe6c29SRuslan Bukin ptu_uint_eq(cpu.stepping, 0); 82*74fe6c29SRuslan Bukin 83*74fe6c29SRuslan Bukin return ptu_passed(); 84*74fe6c29SRuslan Bukin } 85*74fe6c29SRuslan Bukin 86*74fe6c29SRuslan Bukin static struct ptunit_result cpu_null(void) 87*74fe6c29SRuslan Bukin { 88*74fe6c29SRuslan Bukin struct pt_cpu cpu; 89*74fe6c29SRuslan Bukin int error; 90*74fe6c29SRuslan Bukin 91*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, NULL); 92*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 93*74fe6c29SRuslan Bukin 94*74fe6c29SRuslan Bukin error = pt_cpu_parse(NULL, ""); 95*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 96*74fe6c29SRuslan Bukin 97*74fe6c29SRuslan Bukin error = pt_cpu_parse(NULL, NULL); 98*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 99*74fe6c29SRuslan Bukin 100*74fe6c29SRuslan Bukin return ptu_passed(); 101*74fe6c29SRuslan Bukin } 102*74fe6c29SRuslan Bukin 103*74fe6c29SRuslan Bukin static struct ptunit_result cpu_incomplete(void) 104*74fe6c29SRuslan Bukin { 105*74fe6c29SRuslan Bukin struct pt_cpu cpu; 106*74fe6c29SRuslan Bukin int error; 107*74fe6c29SRuslan Bukin 108*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, ""); 109*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 110*74fe6c29SRuslan Bukin 111*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6"); 112*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 113*74fe6c29SRuslan Bukin 114*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6/"); 115*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 116*74fe6c29SRuslan Bukin 117*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6//2"); 118*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 119*74fe6c29SRuslan Bukin 120*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "//"); 121*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 122*74fe6c29SRuslan Bukin 123*74fe6c29SRuslan Bukin return ptu_passed(); 124*74fe6c29SRuslan Bukin } 125*74fe6c29SRuslan Bukin 126*74fe6c29SRuslan Bukin static struct ptunit_result cpu_invalid(void) 127*74fe6c29SRuslan Bukin { 128*74fe6c29SRuslan Bukin struct pt_cpu cpu; 129*74fe6c29SRuslan Bukin int error; 130*74fe6c29SRuslan Bukin 131*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "e/44/2"); 132*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 133*74fe6c29SRuslan Bukin 134*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6/e/2"); 135*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 136*74fe6c29SRuslan Bukin 137*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6/44/e"); 138*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 139*74fe6c29SRuslan Bukin 140*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "65536/44/2"); 141*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 142*74fe6c29SRuslan Bukin 143*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6/256/2"); 144*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 145*74fe6c29SRuslan Bukin 146*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6/44/256"); 147*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 148*74fe6c29SRuslan Bukin 149*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "-1/44/2"); 150*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 151*74fe6c29SRuslan Bukin 152*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6/-1/2"); 153*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 154*74fe6c29SRuslan Bukin 155*74fe6c29SRuslan Bukin error = pt_cpu_parse(&cpu, "6/44/-1"); 156*74fe6c29SRuslan Bukin ptu_int_eq(error, -pte_invalid); 157*74fe6c29SRuslan Bukin 158*74fe6c29SRuslan Bukin return ptu_passed(); 159*74fe6c29SRuslan Bukin } 160*74fe6c29SRuslan Bukin 161*74fe6c29SRuslan Bukin int main(int argc, char **argv) 162*74fe6c29SRuslan Bukin { 163*74fe6c29SRuslan Bukin struct ptunit_suite suite; 164*74fe6c29SRuslan Bukin 165*74fe6c29SRuslan Bukin suite = ptunit_mk_suite(argc, argv); 166*74fe6c29SRuslan Bukin 167*74fe6c29SRuslan Bukin ptu_run(suite, cpu_valid); 168*74fe6c29SRuslan Bukin ptu_run(suite, cpu_null); 169*74fe6c29SRuslan Bukin ptu_run(suite, cpu_incomplete); 170*74fe6c29SRuslan Bukin ptu_run(suite, cpu_invalid); 171*74fe6c29SRuslan Bukin 172*74fe6c29SRuslan Bukin return ptunit_report(&suite); 173*74fe6c29SRuslan Bukin } 174