1*74fe6c29SRuslan Bukin /* 2*74fe6c29SRuslan Bukin * Copyright (c) 2014-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_sync.h" 32*74fe6c29SRuslan Bukin #include "pt_opcodes.h" 33*74fe6c29SRuslan Bukin 34*74fe6c29SRuslan Bukin #include "intel-pt.h" 35*74fe6c29SRuslan Bukin 36*74fe6c29SRuslan Bukin 37*74fe6c29SRuslan Bukin /* A test fixture for sync tests. */ 38*74fe6c29SRuslan Bukin struct sync_fixture { 39*74fe6c29SRuslan Bukin /* The trace buffer. */ 40*74fe6c29SRuslan Bukin uint8_t buffer[1024]; 41*74fe6c29SRuslan Bukin 42*74fe6c29SRuslan Bukin /* A trace configuration. */ 43*74fe6c29SRuslan Bukin struct pt_config config; 44*74fe6c29SRuslan Bukin 45*74fe6c29SRuslan Bukin /* The test fixture initialization and finalization functions. */ 46*74fe6c29SRuslan Bukin struct ptunit_result (*init)(struct sync_fixture *); 47*74fe6c29SRuslan Bukin struct ptunit_result (*fini)(struct sync_fixture *); 48*74fe6c29SRuslan Bukin }; 49*74fe6c29SRuslan Bukin 50*74fe6c29SRuslan Bukin static struct ptunit_result sfix_init(struct sync_fixture *sfix) 51*74fe6c29SRuslan Bukin { 52*74fe6c29SRuslan Bukin memset(sfix->buffer, 0xcd, sizeof(sfix->buffer)); 53*74fe6c29SRuslan Bukin 54*74fe6c29SRuslan Bukin memset(&sfix->config, 0, sizeof(sfix->config)); 55*74fe6c29SRuslan Bukin sfix->config.size = sizeof(sfix->config); 56*74fe6c29SRuslan Bukin sfix->config.begin = sfix->buffer; 57*74fe6c29SRuslan Bukin sfix->config.end = sfix->buffer + sizeof(sfix->buffer); 58*74fe6c29SRuslan Bukin 59*74fe6c29SRuslan Bukin return ptu_passed(); 60*74fe6c29SRuslan Bukin } 61*74fe6c29SRuslan Bukin 62*74fe6c29SRuslan Bukin static void sfix_encode_psb(uint8_t *pos) 63*74fe6c29SRuslan Bukin { 64*74fe6c29SRuslan Bukin int i; 65*74fe6c29SRuslan Bukin 66*74fe6c29SRuslan Bukin *pos++ = pt_opc_psb; 67*74fe6c29SRuslan Bukin *pos++ = pt_ext_psb; 68*74fe6c29SRuslan Bukin 69*74fe6c29SRuslan Bukin for (i = 0; i < pt_psb_repeat_count; ++i) { 70*74fe6c29SRuslan Bukin *pos++ = pt_psb_hi; 71*74fe6c29SRuslan Bukin *pos++ = pt_psb_lo; 72*74fe6c29SRuslan Bukin } 73*74fe6c29SRuslan Bukin } 74*74fe6c29SRuslan Bukin 75*74fe6c29SRuslan Bukin 76*74fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_null(struct sync_fixture *sfix) 77*74fe6c29SRuslan Bukin { 78*74fe6c29SRuslan Bukin const uint8_t *sync; 79*74fe6c29SRuslan Bukin int errcode; 80*74fe6c29SRuslan Bukin 81*74fe6c29SRuslan Bukin errcode = pt_sync_forward(NULL, sfix->config.begin, &sfix->config); 82*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 83*74fe6c29SRuslan Bukin 84*74fe6c29SRuslan Bukin errcode = pt_sync_forward(&sync, NULL, &sfix->config); 85*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 86*74fe6c29SRuslan Bukin 87*74fe6c29SRuslan Bukin errcode = pt_sync_forward(&sync, sfix->config.begin, NULL); 88*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 89*74fe6c29SRuslan Bukin 90*74fe6c29SRuslan Bukin return ptu_passed(); 91*74fe6c29SRuslan Bukin } 92*74fe6c29SRuslan Bukin 93*74fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_null(struct sync_fixture *sfix) 94*74fe6c29SRuslan Bukin { 95*74fe6c29SRuslan Bukin const uint8_t *sync; 96*74fe6c29SRuslan Bukin int errcode; 97*74fe6c29SRuslan Bukin 98*74fe6c29SRuslan Bukin errcode = pt_sync_backward(NULL, sfix->config.begin, &sfix->config); 99*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 100*74fe6c29SRuslan Bukin 101*74fe6c29SRuslan Bukin errcode = pt_sync_backward(&sync, NULL, &sfix->config); 102*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 103*74fe6c29SRuslan Bukin 104*74fe6c29SRuslan Bukin errcode = pt_sync_backward(&sync, sfix->config.begin, NULL); 105*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 106*74fe6c29SRuslan Bukin 107*74fe6c29SRuslan Bukin return ptu_passed(); 108*74fe6c29SRuslan Bukin } 109*74fe6c29SRuslan Bukin 110*74fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_empty(struct sync_fixture *sfix) 111*74fe6c29SRuslan Bukin { 112*74fe6c29SRuslan Bukin const uint8_t *sync; 113*74fe6c29SRuslan Bukin int errcode; 114*74fe6c29SRuslan Bukin 115*74fe6c29SRuslan Bukin sfix->config.end = sfix->config.begin; 116*74fe6c29SRuslan Bukin 117*74fe6c29SRuslan Bukin errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config); 118*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_eos); 119*74fe6c29SRuslan Bukin 120*74fe6c29SRuslan Bukin return ptu_passed(); 121*74fe6c29SRuslan Bukin } 122*74fe6c29SRuslan Bukin 123*74fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_empty(struct sync_fixture *sfix) 124*74fe6c29SRuslan Bukin { 125*74fe6c29SRuslan Bukin const uint8_t *sync; 126*74fe6c29SRuslan Bukin int errcode; 127*74fe6c29SRuslan Bukin 128*74fe6c29SRuslan Bukin sfix->config.end = sfix->config.begin; 129*74fe6c29SRuslan Bukin 130*74fe6c29SRuslan Bukin errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config); 131*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_eos); 132*74fe6c29SRuslan Bukin 133*74fe6c29SRuslan Bukin return ptu_passed(); 134*74fe6c29SRuslan Bukin } 135*74fe6c29SRuslan Bukin 136*74fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_none(struct sync_fixture *sfix) 137*74fe6c29SRuslan Bukin { 138*74fe6c29SRuslan Bukin const uint8_t *sync; 139*74fe6c29SRuslan Bukin int errcode; 140*74fe6c29SRuslan Bukin 141*74fe6c29SRuslan Bukin errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config); 142*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_eos); 143*74fe6c29SRuslan Bukin 144*74fe6c29SRuslan Bukin return ptu_passed(); 145*74fe6c29SRuslan Bukin } 146*74fe6c29SRuslan Bukin 147*74fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_none(struct sync_fixture *sfix) 148*74fe6c29SRuslan Bukin { 149*74fe6c29SRuslan Bukin const uint8_t *sync; 150*74fe6c29SRuslan Bukin int errcode; 151*74fe6c29SRuslan Bukin 152*74fe6c29SRuslan Bukin errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config); 153*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_eos); 154*74fe6c29SRuslan Bukin 155*74fe6c29SRuslan Bukin return ptu_passed(); 156*74fe6c29SRuslan Bukin } 157*74fe6c29SRuslan Bukin 158*74fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_here(struct sync_fixture *sfix) 159*74fe6c29SRuslan Bukin { 160*74fe6c29SRuslan Bukin const uint8_t *sync; 161*74fe6c29SRuslan Bukin int errcode; 162*74fe6c29SRuslan Bukin 163*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.begin); 164*74fe6c29SRuslan Bukin 165*74fe6c29SRuslan Bukin errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config); 166*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 167*74fe6c29SRuslan Bukin ptu_ptr_eq(sync, sfix->config.begin); 168*74fe6c29SRuslan Bukin 169*74fe6c29SRuslan Bukin return ptu_passed(); 170*74fe6c29SRuslan Bukin } 171*74fe6c29SRuslan Bukin 172*74fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_here(struct sync_fixture *sfix) 173*74fe6c29SRuslan Bukin { 174*74fe6c29SRuslan Bukin const uint8_t *sync; 175*74fe6c29SRuslan Bukin int errcode; 176*74fe6c29SRuslan Bukin 177*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.end - ptps_psb); 178*74fe6c29SRuslan Bukin 179*74fe6c29SRuslan Bukin errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config); 180*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 181*74fe6c29SRuslan Bukin ptu_ptr_eq(sync, sfix->config.end - ptps_psb); 182*74fe6c29SRuslan Bukin 183*74fe6c29SRuslan Bukin return ptu_passed(); 184*74fe6c29SRuslan Bukin } 185*74fe6c29SRuslan Bukin 186*74fe6c29SRuslan Bukin static struct ptunit_result sync_fwd(struct sync_fixture *sfix) 187*74fe6c29SRuslan Bukin { 188*74fe6c29SRuslan Bukin const uint8_t *sync; 189*74fe6c29SRuslan Bukin int errcode; 190*74fe6c29SRuslan Bukin 191*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.begin + 0x23); 192*74fe6c29SRuslan Bukin 193*74fe6c29SRuslan Bukin errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config); 194*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 195*74fe6c29SRuslan Bukin ptu_ptr_eq(sync, sfix->config.begin + 0x23); 196*74fe6c29SRuslan Bukin 197*74fe6c29SRuslan Bukin return ptu_passed(); 198*74fe6c29SRuslan Bukin } 199*74fe6c29SRuslan Bukin 200*74fe6c29SRuslan Bukin static struct ptunit_result sync_bwd(struct sync_fixture *sfix) 201*74fe6c29SRuslan Bukin { 202*74fe6c29SRuslan Bukin const uint8_t *sync; 203*74fe6c29SRuslan Bukin int errcode; 204*74fe6c29SRuslan Bukin 205*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.begin + 0x23); 206*74fe6c29SRuslan Bukin 207*74fe6c29SRuslan Bukin errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config); 208*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 209*74fe6c29SRuslan Bukin ptu_ptr_eq(sync, sfix->config.begin + 0x23); 210*74fe6c29SRuslan Bukin 211*74fe6c29SRuslan Bukin return ptu_passed(); 212*74fe6c29SRuslan Bukin } 213*74fe6c29SRuslan Bukin 214*74fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_past(struct sync_fixture *sfix) 215*74fe6c29SRuslan Bukin { 216*74fe6c29SRuslan Bukin const uint8_t *sync; 217*74fe6c29SRuslan Bukin int errcode; 218*74fe6c29SRuslan Bukin 219*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.begin); 220*74fe6c29SRuslan Bukin 221*74fe6c29SRuslan Bukin errcode = pt_sync_forward(&sync, sfix->config.begin + ptps_psb, 222*74fe6c29SRuslan Bukin &sfix->config); 223*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_eos); 224*74fe6c29SRuslan Bukin 225*74fe6c29SRuslan Bukin return ptu_passed(); 226*74fe6c29SRuslan Bukin } 227*74fe6c29SRuslan Bukin 228*74fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_past(struct sync_fixture *sfix) 229*74fe6c29SRuslan Bukin { 230*74fe6c29SRuslan Bukin const uint8_t *sync; 231*74fe6c29SRuslan Bukin int errcode; 232*74fe6c29SRuslan Bukin 233*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.end - ptps_psb); 234*74fe6c29SRuslan Bukin 235*74fe6c29SRuslan Bukin errcode = pt_sync_backward(&sync, sfix->config.end - ptps_psb, 236*74fe6c29SRuslan Bukin &sfix->config); 237*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_eos); 238*74fe6c29SRuslan Bukin 239*74fe6c29SRuslan Bukin return ptu_passed(); 240*74fe6c29SRuslan Bukin } 241*74fe6c29SRuslan Bukin 242*74fe6c29SRuslan Bukin static struct ptunit_result sync_fwd_cutoff(struct sync_fixture *sfix) 243*74fe6c29SRuslan Bukin { 244*74fe6c29SRuslan Bukin const uint8_t *sync; 245*74fe6c29SRuslan Bukin int errcode; 246*74fe6c29SRuslan Bukin 247*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.begin); 248*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.end - ptps_psb); 249*74fe6c29SRuslan Bukin sfix->config.begin += 1; 250*74fe6c29SRuslan Bukin sfix->config.end -= 1; 251*74fe6c29SRuslan Bukin 252*74fe6c29SRuslan Bukin errcode = pt_sync_forward(&sync, sfix->config.begin, &sfix->config); 253*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_eos); 254*74fe6c29SRuslan Bukin 255*74fe6c29SRuslan Bukin return ptu_passed(); 256*74fe6c29SRuslan Bukin } 257*74fe6c29SRuslan Bukin 258*74fe6c29SRuslan Bukin static struct ptunit_result sync_bwd_cutoff(struct sync_fixture *sfix) 259*74fe6c29SRuslan Bukin { 260*74fe6c29SRuslan Bukin const uint8_t *sync; 261*74fe6c29SRuslan Bukin int errcode; 262*74fe6c29SRuslan Bukin 263*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.begin); 264*74fe6c29SRuslan Bukin sfix_encode_psb(sfix->config.end - ptps_psb); 265*74fe6c29SRuslan Bukin sfix->config.begin += 1; 266*74fe6c29SRuslan Bukin sfix->config.end -= 1; 267*74fe6c29SRuslan Bukin 268*74fe6c29SRuslan Bukin errcode = pt_sync_backward(&sync, sfix->config.end, &sfix->config); 269*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_eos); 270*74fe6c29SRuslan Bukin 271*74fe6c29SRuslan Bukin return ptu_passed(); 272*74fe6c29SRuslan Bukin } 273*74fe6c29SRuslan Bukin 274*74fe6c29SRuslan Bukin int main(int argc, char **argv) 275*74fe6c29SRuslan Bukin { 276*74fe6c29SRuslan Bukin struct sync_fixture sfix; 277*74fe6c29SRuslan Bukin struct ptunit_suite suite; 278*74fe6c29SRuslan Bukin 279*74fe6c29SRuslan Bukin sfix.init = sfix_init; 280*74fe6c29SRuslan Bukin sfix.fini = NULL; 281*74fe6c29SRuslan Bukin 282*74fe6c29SRuslan Bukin suite = ptunit_mk_suite(argc, argv); 283*74fe6c29SRuslan Bukin 284*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_fwd_null, sfix); 285*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_bwd_null, sfix); 286*74fe6c29SRuslan Bukin 287*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_fwd_empty, sfix); 288*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_bwd_empty, sfix); 289*74fe6c29SRuslan Bukin 290*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_fwd_none, sfix); 291*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_bwd_none, sfix); 292*74fe6c29SRuslan Bukin 293*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_fwd_here, sfix); 294*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_bwd_here, sfix); 295*74fe6c29SRuslan Bukin 296*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_fwd, sfix); 297*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_bwd, sfix); 298*74fe6c29SRuslan Bukin 299*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_fwd_past, sfix); 300*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_bwd_past, sfix); 301*74fe6c29SRuslan Bukin 302*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_fwd_cutoff, sfix); 303*74fe6c29SRuslan Bukin ptu_run_f(suite, sync_bwd_cutoff, sfix); 304*74fe6c29SRuslan Bukin 305*74fe6c29SRuslan Bukin return ptunit_report(&suite); 306*74fe6c29SRuslan Bukin } 307