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_retstack.h" 32*74fe6c29SRuslan Bukin 33*74fe6c29SRuslan Bukin #include "intel-pt.h" 34*74fe6c29SRuslan Bukin 35*74fe6c29SRuslan Bukin 36*74fe6c29SRuslan Bukin static struct ptunit_result init(void) 37*74fe6c29SRuslan Bukin { 38*74fe6c29SRuslan Bukin struct pt_retstack retstack; 39*74fe6c29SRuslan Bukin int status; 40*74fe6c29SRuslan Bukin 41*74fe6c29SRuslan Bukin memset(&retstack, 0xcd, sizeof(retstack)); 42*74fe6c29SRuslan Bukin 43*74fe6c29SRuslan Bukin pt_retstack_init(&retstack); 44*74fe6c29SRuslan Bukin 45*74fe6c29SRuslan Bukin status = pt_retstack_is_empty(&retstack); 46*74fe6c29SRuslan Bukin ptu_int_ne(status, 0); 47*74fe6c29SRuslan Bukin 48*74fe6c29SRuslan Bukin return ptu_passed(); 49*74fe6c29SRuslan Bukin } 50*74fe6c29SRuslan Bukin 51*74fe6c29SRuslan Bukin static struct ptunit_result init_null(void) 52*74fe6c29SRuslan Bukin { 53*74fe6c29SRuslan Bukin pt_retstack_init(NULL); 54*74fe6c29SRuslan Bukin 55*74fe6c29SRuslan Bukin return ptu_passed(); 56*74fe6c29SRuslan Bukin } 57*74fe6c29SRuslan Bukin 58*74fe6c29SRuslan Bukin static struct ptunit_result query(void) 59*74fe6c29SRuslan Bukin { 60*74fe6c29SRuslan Bukin struct pt_retstack retstack; 61*74fe6c29SRuslan Bukin uint64_t ip; 62*74fe6c29SRuslan Bukin int status; 63*74fe6c29SRuslan Bukin 64*74fe6c29SRuslan Bukin pt_retstack_init(&retstack); 65*74fe6c29SRuslan Bukin 66*74fe6c29SRuslan Bukin status = pt_retstack_push(&retstack, 0x42ull); 67*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 68*74fe6c29SRuslan Bukin 69*74fe6c29SRuslan Bukin status = pt_retstack_is_empty(&retstack); 70*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 71*74fe6c29SRuslan Bukin 72*74fe6c29SRuslan Bukin status = pt_retstack_pop(&retstack, &ip); 73*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 74*74fe6c29SRuslan Bukin ptu_uint_eq(ip, 0x42ull); 75*74fe6c29SRuslan Bukin 76*74fe6c29SRuslan Bukin status = pt_retstack_is_empty(&retstack); 77*74fe6c29SRuslan Bukin ptu_int_ne(status, 0); 78*74fe6c29SRuslan Bukin 79*74fe6c29SRuslan Bukin return ptu_passed(); 80*74fe6c29SRuslan Bukin } 81*74fe6c29SRuslan Bukin 82*74fe6c29SRuslan Bukin static struct ptunit_result query_empty(void) 83*74fe6c29SRuslan Bukin { 84*74fe6c29SRuslan Bukin struct pt_retstack retstack; 85*74fe6c29SRuslan Bukin uint64_t ip; 86*74fe6c29SRuslan Bukin int status; 87*74fe6c29SRuslan Bukin 88*74fe6c29SRuslan Bukin pt_retstack_init(&retstack); 89*74fe6c29SRuslan Bukin 90*74fe6c29SRuslan Bukin ip = 0x42ull; 91*74fe6c29SRuslan Bukin status = pt_retstack_pop(&retstack, &ip); 92*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_retstack_empty); 93*74fe6c29SRuslan Bukin ptu_uint_eq(ip, 0x42ull); 94*74fe6c29SRuslan Bukin 95*74fe6c29SRuslan Bukin return ptu_passed(); 96*74fe6c29SRuslan Bukin } 97*74fe6c29SRuslan Bukin 98*74fe6c29SRuslan Bukin static struct ptunit_result query_null(void) 99*74fe6c29SRuslan Bukin { 100*74fe6c29SRuslan Bukin uint64_t ip; 101*74fe6c29SRuslan Bukin int status; 102*74fe6c29SRuslan Bukin 103*74fe6c29SRuslan Bukin ip = 0x42ull; 104*74fe6c29SRuslan Bukin status = pt_retstack_pop(NULL, &ip); 105*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_invalid); 106*74fe6c29SRuslan Bukin ptu_uint_eq(ip, 0x42ull); 107*74fe6c29SRuslan Bukin 108*74fe6c29SRuslan Bukin return ptu_passed(); 109*74fe6c29SRuslan Bukin } 110*74fe6c29SRuslan Bukin 111*74fe6c29SRuslan Bukin static struct ptunit_result pop(void) 112*74fe6c29SRuslan Bukin { 113*74fe6c29SRuslan Bukin struct pt_retstack retstack; 114*74fe6c29SRuslan Bukin int status; 115*74fe6c29SRuslan Bukin 116*74fe6c29SRuslan Bukin pt_retstack_init(&retstack); 117*74fe6c29SRuslan Bukin 118*74fe6c29SRuslan Bukin status = pt_retstack_push(&retstack, 0x42ull); 119*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 120*74fe6c29SRuslan Bukin 121*74fe6c29SRuslan Bukin status = pt_retstack_is_empty(&retstack); 122*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 123*74fe6c29SRuslan Bukin 124*74fe6c29SRuslan Bukin status = pt_retstack_pop(&retstack, NULL); 125*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 126*74fe6c29SRuslan Bukin 127*74fe6c29SRuslan Bukin status = pt_retstack_is_empty(&retstack); 128*74fe6c29SRuslan Bukin ptu_int_ne(status, 0); 129*74fe6c29SRuslan Bukin 130*74fe6c29SRuslan Bukin return ptu_passed(); 131*74fe6c29SRuslan Bukin } 132*74fe6c29SRuslan Bukin 133*74fe6c29SRuslan Bukin static struct ptunit_result pop_empty(void) 134*74fe6c29SRuslan Bukin { 135*74fe6c29SRuslan Bukin struct pt_retstack retstack; 136*74fe6c29SRuslan Bukin int status; 137*74fe6c29SRuslan Bukin 138*74fe6c29SRuslan Bukin pt_retstack_init(&retstack); 139*74fe6c29SRuslan Bukin 140*74fe6c29SRuslan Bukin status = pt_retstack_pop(&retstack, NULL); 141*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_retstack_empty); 142*74fe6c29SRuslan Bukin 143*74fe6c29SRuslan Bukin return ptu_passed(); 144*74fe6c29SRuslan Bukin } 145*74fe6c29SRuslan Bukin 146*74fe6c29SRuslan Bukin static struct ptunit_result pop_null(void) 147*74fe6c29SRuslan Bukin { 148*74fe6c29SRuslan Bukin int status; 149*74fe6c29SRuslan Bukin 150*74fe6c29SRuslan Bukin status = pt_retstack_pop(NULL, NULL); 151*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_invalid); 152*74fe6c29SRuslan Bukin 153*74fe6c29SRuslan Bukin return ptu_passed(); 154*74fe6c29SRuslan Bukin } 155*74fe6c29SRuslan Bukin 156*74fe6c29SRuslan Bukin static struct ptunit_result full(void) 157*74fe6c29SRuslan Bukin { 158*74fe6c29SRuslan Bukin struct pt_retstack retstack; 159*74fe6c29SRuslan Bukin uint64_t ip, idx; 160*74fe6c29SRuslan Bukin int status; 161*74fe6c29SRuslan Bukin 162*74fe6c29SRuslan Bukin pt_retstack_init(&retstack); 163*74fe6c29SRuslan Bukin 164*74fe6c29SRuslan Bukin for (idx = 0; idx < pt_retstack_size; ++idx) { 165*74fe6c29SRuslan Bukin status = pt_retstack_push(&retstack, idx); 166*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 167*74fe6c29SRuslan Bukin } 168*74fe6c29SRuslan Bukin 169*74fe6c29SRuslan Bukin status = pt_retstack_is_empty(&retstack); 170*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 171*74fe6c29SRuslan Bukin 172*74fe6c29SRuslan Bukin for (idx = pt_retstack_size; idx > 0;) { 173*74fe6c29SRuslan Bukin idx -= 1; 174*74fe6c29SRuslan Bukin 175*74fe6c29SRuslan Bukin status = pt_retstack_pop(&retstack, &ip); 176*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 177*74fe6c29SRuslan Bukin ptu_uint_eq(ip, idx); 178*74fe6c29SRuslan Bukin } 179*74fe6c29SRuslan Bukin 180*74fe6c29SRuslan Bukin status = pt_retstack_is_empty(&retstack); 181*74fe6c29SRuslan Bukin ptu_int_ne(status, 0); 182*74fe6c29SRuslan Bukin 183*74fe6c29SRuslan Bukin return ptu_passed(); 184*74fe6c29SRuslan Bukin } 185*74fe6c29SRuslan Bukin 186*74fe6c29SRuslan Bukin static struct ptunit_result overflow(void) 187*74fe6c29SRuslan Bukin { 188*74fe6c29SRuslan Bukin struct pt_retstack retstack; 189*74fe6c29SRuslan Bukin uint64_t ip, idx; 190*74fe6c29SRuslan Bukin int status; 191*74fe6c29SRuslan Bukin 192*74fe6c29SRuslan Bukin pt_retstack_init(&retstack); 193*74fe6c29SRuslan Bukin 194*74fe6c29SRuslan Bukin for (idx = 0; idx <= pt_retstack_size; ++idx) { 195*74fe6c29SRuslan Bukin status = pt_retstack_push(&retstack, idx); 196*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 197*74fe6c29SRuslan Bukin } 198*74fe6c29SRuslan Bukin 199*74fe6c29SRuslan Bukin status = pt_retstack_is_empty(&retstack); 200*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 201*74fe6c29SRuslan Bukin 202*74fe6c29SRuslan Bukin for (idx = pt_retstack_size; idx > 0; --idx) { 203*74fe6c29SRuslan Bukin status = pt_retstack_pop(&retstack, &ip); 204*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 205*74fe6c29SRuslan Bukin ptu_uint_eq(ip, idx); 206*74fe6c29SRuslan Bukin } 207*74fe6c29SRuslan Bukin 208*74fe6c29SRuslan Bukin status = pt_retstack_is_empty(&retstack); 209*74fe6c29SRuslan Bukin ptu_int_ne(status, 0); 210*74fe6c29SRuslan Bukin 211*74fe6c29SRuslan Bukin return ptu_passed(); 212*74fe6c29SRuslan Bukin } 213*74fe6c29SRuslan Bukin 214*74fe6c29SRuslan Bukin int main(int argc, char **argv) 215*74fe6c29SRuslan Bukin { 216*74fe6c29SRuslan Bukin struct ptunit_suite suite; 217*74fe6c29SRuslan Bukin 218*74fe6c29SRuslan Bukin suite = ptunit_mk_suite(argc, argv); 219*74fe6c29SRuslan Bukin 220*74fe6c29SRuslan Bukin ptu_run(suite, init); 221*74fe6c29SRuslan Bukin ptu_run(suite, init_null); 222*74fe6c29SRuslan Bukin ptu_run(suite, query); 223*74fe6c29SRuslan Bukin ptu_run(suite, query_empty); 224*74fe6c29SRuslan Bukin ptu_run(suite, query_null); 225*74fe6c29SRuslan Bukin ptu_run(suite, pop); 226*74fe6c29SRuslan Bukin ptu_run(suite, pop_empty); 227*74fe6c29SRuslan Bukin ptu_run(suite, pop_null); 228*74fe6c29SRuslan Bukin ptu_run(suite, full); 229*74fe6c29SRuslan Bukin ptu_run(suite, overflow); 230*74fe6c29SRuslan Bukin 231*74fe6c29SRuslan Bukin return ptunit_report(&suite); 232*74fe6c29SRuslan Bukin } 233