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_threads.h" 30*74fe6c29SRuslan Bukin #include "ptunit_mkfile.h" 31*74fe6c29SRuslan Bukin 32*74fe6c29SRuslan Bukin #include "pt_section.h" 33*74fe6c29SRuslan Bukin #include "pt_block_cache.h" 34*74fe6c29SRuslan Bukin 35*74fe6c29SRuslan Bukin #include "intel-pt.h" 36*74fe6c29SRuslan Bukin 37*74fe6c29SRuslan Bukin #include <stdlib.h> 38*74fe6c29SRuslan Bukin #include <stdio.h> 39*74fe6c29SRuslan Bukin 40*74fe6c29SRuslan Bukin 41*74fe6c29SRuslan Bukin 42*74fe6c29SRuslan Bukin struct pt_image_section_cache { 43*74fe6c29SRuslan Bukin int map; 44*74fe6c29SRuslan Bukin }; 45*74fe6c29SRuslan Bukin 46*74fe6c29SRuslan Bukin extern int pt_iscache_notify_map(struct pt_image_section_cache *iscache, 47*74fe6c29SRuslan Bukin struct pt_section *section); 48*74fe6c29SRuslan Bukin extern int pt_iscache_notify_resize(struct pt_image_section_cache *iscache, 49*74fe6c29SRuslan Bukin struct pt_section *section, uint64_t size); 50*74fe6c29SRuslan Bukin 51*74fe6c29SRuslan Bukin int pt_iscache_notify_map(struct pt_image_section_cache *iscache, 52*74fe6c29SRuslan Bukin struct pt_section *section) 53*74fe6c29SRuslan Bukin { 54*74fe6c29SRuslan Bukin if (!iscache) 55*74fe6c29SRuslan Bukin return -pte_internal; 56*74fe6c29SRuslan Bukin 57*74fe6c29SRuslan Bukin if (iscache->map <= 0) 58*74fe6c29SRuslan Bukin return iscache->map; 59*74fe6c29SRuslan Bukin 60*74fe6c29SRuslan Bukin /* Avoid recursion. */ 61*74fe6c29SRuslan Bukin iscache->map = 0; 62*74fe6c29SRuslan Bukin 63*74fe6c29SRuslan Bukin return pt_section_map_share(section); 64*74fe6c29SRuslan Bukin } 65*74fe6c29SRuslan Bukin 66*74fe6c29SRuslan Bukin int pt_iscache_notify_resize(struct pt_image_section_cache *iscache, 67*74fe6c29SRuslan Bukin struct pt_section *section, uint64_t size) 68*74fe6c29SRuslan Bukin { 69*74fe6c29SRuslan Bukin uint64_t memsize; 70*74fe6c29SRuslan Bukin int errcode; 71*74fe6c29SRuslan Bukin 72*74fe6c29SRuslan Bukin if (!iscache) 73*74fe6c29SRuslan Bukin return -pte_internal; 74*74fe6c29SRuslan Bukin 75*74fe6c29SRuslan Bukin if (iscache->map <= 0) 76*74fe6c29SRuslan Bukin return iscache->map; 77*74fe6c29SRuslan Bukin 78*74fe6c29SRuslan Bukin /* Avoid recursion. */ 79*74fe6c29SRuslan Bukin iscache->map = 0; 80*74fe6c29SRuslan Bukin 81*74fe6c29SRuslan Bukin errcode = pt_section_memsize(section, &memsize); 82*74fe6c29SRuslan Bukin if (errcode < 0) 83*74fe6c29SRuslan Bukin return errcode; 84*74fe6c29SRuslan Bukin 85*74fe6c29SRuslan Bukin if (size != memsize) 86*74fe6c29SRuslan Bukin return -pte_internal; 87*74fe6c29SRuslan Bukin 88*74fe6c29SRuslan Bukin return pt_section_map_share(section); 89*74fe6c29SRuslan Bukin } 90*74fe6c29SRuslan Bukin 91*74fe6c29SRuslan Bukin struct pt_block_cache *pt_bcache_alloc(uint64_t nentries) 92*74fe6c29SRuslan Bukin { 93*74fe6c29SRuslan Bukin struct pt_block_cache *bcache; 94*74fe6c29SRuslan Bukin 95*74fe6c29SRuslan Bukin if (!nentries || (UINT32_MAX < nentries)) 96*74fe6c29SRuslan Bukin return NULL; 97*74fe6c29SRuslan Bukin 98*74fe6c29SRuslan Bukin /* The cache is not really used by tests. It suffices to allocate only 99*74fe6c29SRuslan Bukin * the cache struct with the single default entry. 100*74fe6c29SRuslan Bukin * 101*74fe6c29SRuslan Bukin * We still set the number of entries to the requested size. 102*74fe6c29SRuslan Bukin */ 103*74fe6c29SRuslan Bukin bcache = malloc(sizeof(*bcache)); 104*74fe6c29SRuslan Bukin if (bcache) 105*74fe6c29SRuslan Bukin bcache->nentries = (uint32_t) nentries; 106*74fe6c29SRuslan Bukin 107*74fe6c29SRuslan Bukin return bcache; 108*74fe6c29SRuslan Bukin } 109*74fe6c29SRuslan Bukin 110*74fe6c29SRuslan Bukin void pt_bcache_free(struct pt_block_cache *bcache) 111*74fe6c29SRuslan Bukin { 112*74fe6c29SRuslan Bukin free(bcache); 113*74fe6c29SRuslan Bukin } 114*74fe6c29SRuslan Bukin 115*74fe6c29SRuslan Bukin /* A test fixture providing a temporary file and an initially NULL section. */ 116*74fe6c29SRuslan Bukin struct section_fixture { 117*74fe6c29SRuslan Bukin /* Threading support. */ 118*74fe6c29SRuslan Bukin struct ptunit_thrd_fixture thrd; 119*74fe6c29SRuslan Bukin 120*74fe6c29SRuslan Bukin /* A temporary file name. */ 121*74fe6c29SRuslan Bukin char *name; 122*74fe6c29SRuslan Bukin 123*74fe6c29SRuslan Bukin /* That file opened for writing. */ 124*74fe6c29SRuslan Bukin FILE *file; 125*74fe6c29SRuslan Bukin 126*74fe6c29SRuslan Bukin /* The section. */ 127*74fe6c29SRuslan Bukin struct pt_section *section; 128*74fe6c29SRuslan Bukin 129*74fe6c29SRuslan Bukin /* The test fixture initialization and finalization functions. */ 130*74fe6c29SRuslan Bukin struct ptunit_result (*init)(struct section_fixture *); 131*74fe6c29SRuslan Bukin struct ptunit_result (*fini)(struct section_fixture *); 132*74fe6c29SRuslan Bukin }; 133*74fe6c29SRuslan Bukin 134*74fe6c29SRuslan Bukin enum { 135*74fe6c29SRuslan Bukin #if defined(FEATURE_THREADS) 136*74fe6c29SRuslan Bukin 137*74fe6c29SRuslan Bukin num_threads = 4, 138*74fe6c29SRuslan Bukin 139*74fe6c29SRuslan Bukin #endif /* defined(FEATURE_THREADS) */ 140*74fe6c29SRuslan Bukin 141*74fe6c29SRuslan Bukin num_work = 0x4000 142*74fe6c29SRuslan Bukin }; 143*74fe6c29SRuslan Bukin 144*74fe6c29SRuslan Bukin static struct ptunit_result sfix_write_aux(struct section_fixture *sfix, 145*74fe6c29SRuslan Bukin const uint8_t *buffer, size_t size) 146*74fe6c29SRuslan Bukin { 147*74fe6c29SRuslan Bukin size_t written; 148*74fe6c29SRuslan Bukin 149*74fe6c29SRuslan Bukin written = fwrite(buffer, 1, size, sfix->file); 150*74fe6c29SRuslan Bukin ptu_uint_eq(written, size); 151*74fe6c29SRuslan Bukin 152*74fe6c29SRuslan Bukin fflush(sfix->file); 153*74fe6c29SRuslan Bukin 154*74fe6c29SRuslan Bukin return ptu_passed(); 155*74fe6c29SRuslan Bukin } 156*74fe6c29SRuslan Bukin 157*74fe6c29SRuslan Bukin #define sfix_write(sfix, buffer) \ 158*74fe6c29SRuslan Bukin ptu_check(sfix_write_aux, sfix, buffer, sizeof(buffer)) 159*74fe6c29SRuslan Bukin 160*74fe6c29SRuslan Bukin static struct ptunit_result create(struct section_fixture *sfix) 161*74fe6c29SRuslan Bukin { 162*74fe6c29SRuslan Bukin const char *name; 163*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc }; 164*74fe6c29SRuslan Bukin uint64_t offset, size; 165*74fe6c29SRuslan Bukin 166*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 167*74fe6c29SRuslan Bukin 168*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 169*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 170*74fe6c29SRuslan Bukin 171*74fe6c29SRuslan Bukin name = pt_section_filename(sfix->section); 172*74fe6c29SRuslan Bukin ptu_str_eq(name, sfix->name); 173*74fe6c29SRuslan Bukin 174*74fe6c29SRuslan Bukin offset = pt_section_offset(sfix->section); 175*74fe6c29SRuslan Bukin ptu_uint_eq(offset, 0x1ull); 176*74fe6c29SRuslan Bukin 177*74fe6c29SRuslan Bukin size = pt_section_size(sfix->section); 178*74fe6c29SRuslan Bukin ptu_uint_eq(size, 0x3ull); 179*74fe6c29SRuslan Bukin 180*74fe6c29SRuslan Bukin return ptu_passed(); 181*74fe6c29SRuslan Bukin } 182*74fe6c29SRuslan Bukin 183*74fe6c29SRuslan Bukin static struct ptunit_result create_bad_offset(struct section_fixture *sfix) 184*74fe6c29SRuslan Bukin { 185*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x10ull, 0x0ull); 186*74fe6c29SRuslan Bukin ptu_null(sfix->section); 187*74fe6c29SRuslan Bukin 188*74fe6c29SRuslan Bukin return ptu_passed(); 189*74fe6c29SRuslan Bukin } 190*74fe6c29SRuslan Bukin 191*74fe6c29SRuslan Bukin static struct ptunit_result create_truncated(struct section_fixture *sfix) 192*74fe6c29SRuslan Bukin { 193*74fe6c29SRuslan Bukin const char *name; 194*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0xcc, 0xcc, 0xcc, 0xcc }; 195*74fe6c29SRuslan Bukin uint64_t offset, size; 196*74fe6c29SRuslan Bukin 197*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 198*74fe6c29SRuslan Bukin 199*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, UINT64_MAX); 200*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 201*74fe6c29SRuslan Bukin 202*74fe6c29SRuslan Bukin name = pt_section_filename(sfix->section); 203*74fe6c29SRuslan Bukin ptu_str_eq(name, sfix->name); 204*74fe6c29SRuslan Bukin 205*74fe6c29SRuslan Bukin offset = pt_section_offset(sfix->section); 206*74fe6c29SRuslan Bukin ptu_uint_eq(offset, 0x1ull); 207*74fe6c29SRuslan Bukin 208*74fe6c29SRuslan Bukin size = pt_section_size(sfix->section); 209*74fe6c29SRuslan Bukin ptu_uint_eq(size, sizeof(bytes) - 1); 210*74fe6c29SRuslan Bukin 211*74fe6c29SRuslan Bukin return ptu_passed(); 212*74fe6c29SRuslan Bukin } 213*74fe6c29SRuslan Bukin 214*74fe6c29SRuslan Bukin static struct ptunit_result create_empty(struct section_fixture *sfix) 215*74fe6c29SRuslan Bukin { 216*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x0ull, 0x10ull); 217*74fe6c29SRuslan Bukin ptu_null(sfix->section); 218*74fe6c29SRuslan Bukin 219*74fe6c29SRuslan Bukin return ptu_passed(); 220*74fe6c29SRuslan Bukin } 221*74fe6c29SRuslan Bukin 222*74fe6c29SRuslan Bukin static struct ptunit_result filename_null(void) 223*74fe6c29SRuslan Bukin { 224*74fe6c29SRuslan Bukin const char *name; 225*74fe6c29SRuslan Bukin 226*74fe6c29SRuslan Bukin name = pt_section_filename(NULL); 227*74fe6c29SRuslan Bukin ptu_null(name); 228*74fe6c29SRuslan Bukin 229*74fe6c29SRuslan Bukin return ptu_passed(); 230*74fe6c29SRuslan Bukin } 231*74fe6c29SRuslan Bukin 232*74fe6c29SRuslan Bukin static struct ptunit_result size_null(void) 233*74fe6c29SRuslan Bukin { 234*74fe6c29SRuslan Bukin uint64_t size; 235*74fe6c29SRuslan Bukin 236*74fe6c29SRuslan Bukin size = pt_section_size(NULL); 237*74fe6c29SRuslan Bukin ptu_uint_eq(size, 0ull); 238*74fe6c29SRuslan Bukin 239*74fe6c29SRuslan Bukin return ptu_passed(); 240*74fe6c29SRuslan Bukin } 241*74fe6c29SRuslan Bukin 242*74fe6c29SRuslan Bukin static struct ptunit_result memsize_null(struct section_fixture *sfix) 243*74fe6c29SRuslan Bukin { 244*74fe6c29SRuslan Bukin uint64_t size; 245*74fe6c29SRuslan Bukin int errcode; 246*74fe6c29SRuslan Bukin 247*74fe6c29SRuslan Bukin errcode = pt_section_memsize(NULL, &size); 248*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 249*74fe6c29SRuslan Bukin 250*74fe6c29SRuslan Bukin errcode = pt_section_memsize(sfix->section, NULL); 251*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 252*74fe6c29SRuslan Bukin 253*74fe6c29SRuslan Bukin errcode = pt_section_memsize(NULL, NULL); 254*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 255*74fe6c29SRuslan Bukin 256*74fe6c29SRuslan Bukin return ptu_passed(); 257*74fe6c29SRuslan Bukin } 258*74fe6c29SRuslan Bukin 259*74fe6c29SRuslan Bukin static struct ptunit_result offset_null(void) 260*74fe6c29SRuslan Bukin { 261*74fe6c29SRuslan Bukin uint64_t offset; 262*74fe6c29SRuslan Bukin 263*74fe6c29SRuslan Bukin offset = pt_section_offset(NULL); 264*74fe6c29SRuslan Bukin ptu_uint_eq(offset, 0ull); 265*74fe6c29SRuslan Bukin 266*74fe6c29SRuslan Bukin return ptu_passed(); 267*74fe6c29SRuslan Bukin } 268*74fe6c29SRuslan Bukin 269*74fe6c29SRuslan Bukin static struct ptunit_result get_null(void) 270*74fe6c29SRuslan Bukin { 271*74fe6c29SRuslan Bukin int errcode; 272*74fe6c29SRuslan Bukin 273*74fe6c29SRuslan Bukin errcode = pt_section_get(NULL); 274*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 275*74fe6c29SRuslan Bukin 276*74fe6c29SRuslan Bukin return ptu_passed(); 277*74fe6c29SRuslan Bukin } 278*74fe6c29SRuslan Bukin 279*74fe6c29SRuslan Bukin static struct ptunit_result put_null(void) 280*74fe6c29SRuslan Bukin { 281*74fe6c29SRuslan Bukin int errcode; 282*74fe6c29SRuslan Bukin 283*74fe6c29SRuslan Bukin errcode = pt_section_put(NULL); 284*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 285*74fe6c29SRuslan Bukin 286*74fe6c29SRuslan Bukin return ptu_passed(); 287*74fe6c29SRuslan Bukin } 288*74fe6c29SRuslan Bukin 289*74fe6c29SRuslan Bukin static struct ptunit_result attach_null(void) 290*74fe6c29SRuslan Bukin { 291*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache; 292*74fe6c29SRuslan Bukin struct pt_section section; 293*74fe6c29SRuslan Bukin int errcode; 294*74fe6c29SRuslan Bukin 295*74fe6c29SRuslan Bukin errcode = pt_section_attach(NULL, &iscache); 296*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 297*74fe6c29SRuslan Bukin 298*74fe6c29SRuslan Bukin errcode = pt_section_attach(§ion, NULL); 299*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 300*74fe6c29SRuslan Bukin 301*74fe6c29SRuslan Bukin errcode = pt_section_attach(NULL, NULL); 302*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 303*74fe6c29SRuslan Bukin 304*74fe6c29SRuslan Bukin return ptu_passed(); 305*74fe6c29SRuslan Bukin } 306*74fe6c29SRuslan Bukin 307*74fe6c29SRuslan Bukin static struct ptunit_result detach_null(void) 308*74fe6c29SRuslan Bukin { 309*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache; 310*74fe6c29SRuslan Bukin struct pt_section section; 311*74fe6c29SRuslan Bukin int errcode; 312*74fe6c29SRuslan Bukin 313*74fe6c29SRuslan Bukin errcode = pt_section_detach(NULL, &iscache); 314*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 315*74fe6c29SRuslan Bukin 316*74fe6c29SRuslan Bukin errcode = pt_section_detach(§ion, NULL); 317*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 318*74fe6c29SRuslan Bukin 319*74fe6c29SRuslan Bukin errcode = pt_section_detach(NULL, NULL); 320*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 321*74fe6c29SRuslan Bukin 322*74fe6c29SRuslan Bukin return ptu_passed(); 323*74fe6c29SRuslan Bukin } 324*74fe6c29SRuslan Bukin 325*74fe6c29SRuslan Bukin static struct ptunit_result map_null(void) 326*74fe6c29SRuslan Bukin { 327*74fe6c29SRuslan Bukin int errcode; 328*74fe6c29SRuslan Bukin 329*74fe6c29SRuslan Bukin errcode = pt_section_map(NULL); 330*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 331*74fe6c29SRuslan Bukin 332*74fe6c29SRuslan Bukin return ptu_passed(); 333*74fe6c29SRuslan Bukin } 334*74fe6c29SRuslan Bukin 335*74fe6c29SRuslan Bukin static struct ptunit_result unmap_null(void) 336*74fe6c29SRuslan Bukin { 337*74fe6c29SRuslan Bukin int errcode; 338*74fe6c29SRuslan Bukin 339*74fe6c29SRuslan Bukin errcode = pt_section_unmap(NULL); 340*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 341*74fe6c29SRuslan Bukin 342*74fe6c29SRuslan Bukin return ptu_passed(); 343*74fe6c29SRuslan Bukin } 344*74fe6c29SRuslan Bukin 345*74fe6c29SRuslan Bukin static struct ptunit_result cache_null(void) 346*74fe6c29SRuslan Bukin { 347*74fe6c29SRuslan Bukin struct pt_block_cache *bcache; 348*74fe6c29SRuslan Bukin 349*74fe6c29SRuslan Bukin bcache = pt_section_bcache(NULL); 350*74fe6c29SRuslan Bukin ptu_null(bcache); 351*74fe6c29SRuslan Bukin 352*74fe6c29SRuslan Bukin return ptu_passed(); 353*74fe6c29SRuslan Bukin } 354*74fe6c29SRuslan Bukin 355*74fe6c29SRuslan Bukin static struct ptunit_result get_overflow(struct section_fixture *sfix) 356*74fe6c29SRuslan Bukin { 357*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 358*74fe6c29SRuslan Bukin int errcode; 359*74fe6c29SRuslan Bukin 360*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 361*74fe6c29SRuslan Bukin 362*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 363*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 364*74fe6c29SRuslan Bukin 365*74fe6c29SRuslan Bukin sfix->section->ucount = UINT16_MAX; 366*74fe6c29SRuslan Bukin 367*74fe6c29SRuslan Bukin errcode = pt_section_get(sfix->section); 368*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_overflow); 369*74fe6c29SRuslan Bukin 370*74fe6c29SRuslan Bukin sfix->section->ucount = 1; 371*74fe6c29SRuslan Bukin 372*74fe6c29SRuslan Bukin return ptu_passed(); 373*74fe6c29SRuslan Bukin } 374*74fe6c29SRuslan Bukin 375*74fe6c29SRuslan Bukin static struct ptunit_result attach_overflow(struct section_fixture *sfix) 376*74fe6c29SRuslan Bukin { 377*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache; 378*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 379*74fe6c29SRuslan Bukin int errcode; 380*74fe6c29SRuslan Bukin 381*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 382*74fe6c29SRuslan Bukin 383*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 384*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 385*74fe6c29SRuslan Bukin 386*74fe6c29SRuslan Bukin sfix->section->acount = UINT16_MAX; 387*74fe6c29SRuslan Bukin 388*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &iscache); 389*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_overflow); 390*74fe6c29SRuslan Bukin 391*74fe6c29SRuslan Bukin sfix->section->acount = 0; 392*74fe6c29SRuslan Bukin 393*74fe6c29SRuslan Bukin return ptu_passed(); 394*74fe6c29SRuslan Bukin } 395*74fe6c29SRuslan Bukin 396*74fe6c29SRuslan Bukin static struct ptunit_result attach_bad_ucount(struct section_fixture *sfix) 397*74fe6c29SRuslan Bukin { 398*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache; 399*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 400*74fe6c29SRuslan Bukin int errcode; 401*74fe6c29SRuslan Bukin 402*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 403*74fe6c29SRuslan Bukin 404*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 405*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 406*74fe6c29SRuslan Bukin 407*74fe6c29SRuslan Bukin sfix->section->acount = 2; 408*74fe6c29SRuslan Bukin 409*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &iscache); 410*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 411*74fe6c29SRuslan Bukin 412*74fe6c29SRuslan Bukin sfix->section->acount = 0; 413*74fe6c29SRuslan Bukin 414*74fe6c29SRuslan Bukin return ptu_passed(); 415*74fe6c29SRuslan Bukin } 416*74fe6c29SRuslan Bukin 417*74fe6c29SRuslan Bukin static struct ptunit_result map_change(struct section_fixture *sfix) 418*74fe6c29SRuslan Bukin { 419*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 420*74fe6c29SRuslan Bukin int errcode; 421*74fe6c29SRuslan Bukin 422*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 423*74fe6c29SRuslan Bukin 424*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 425*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 426*74fe6c29SRuslan Bukin 427*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 428*74fe6c29SRuslan Bukin 429*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 430*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_bad_image); 431*74fe6c29SRuslan Bukin 432*74fe6c29SRuslan Bukin return ptu_passed(); 433*74fe6c29SRuslan Bukin } 434*74fe6c29SRuslan Bukin 435*74fe6c29SRuslan Bukin static struct ptunit_result map_put(struct section_fixture *sfix) 436*74fe6c29SRuslan Bukin { 437*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 438*74fe6c29SRuslan Bukin int errcode; 439*74fe6c29SRuslan Bukin 440*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 441*74fe6c29SRuslan Bukin 442*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 443*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 444*74fe6c29SRuslan Bukin 445*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 446*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 447*74fe6c29SRuslan Bukin 448*74fe6c29SRuslan Bukin errcode = pt_section_put(sfix->section); 449*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 450*74fe6c29SRuslan Bukin 451*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 452*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 453*74fe6c29SRuslan Bukin 454*74fe6c29SRuslan Bukin return ptu_passed(); 455*74fe6c29SRuslan Bukin } 456*74fe6c29SRuslan Bukin 457*74fe6c29SRuslan Bukin static struct ptunit_result unmap_nomap(struct section_fixture *sfix) 458*74fe6c29SRuslan Bukin { 459*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 460*74fe6c29SRuslan Bukin int errcode; 461*74fe6c29SRuslan Bukin 462*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 463*74fe6c29SRuslan Bukin 464*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 465*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 466*74fe6c29SRuslan Bukin 467*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 468*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_nomap); 469*74fe6c29SRuslan Bukin 470*74fe6c29SRuslan Bukin return ptu_passed(); 471*74fe6c29SRuslan Bukin } 472*74fe6c29SRuslan Bukin 473*74fe6c29SRuslan Bukin static struct ptunit_result map_overflow(struct section_fixture *sfix) 474*74fe6c29SRuslan Bukin { 475*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 476*74fe6c29SRuslan Bukin int errcode; 477*74fe6c29SRuslan Bukin 478*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 479*74fe6c29SRuslan Bukin 480*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 481*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 482*74fe6c29SRuslan Bukin 483*74fe6c29SRuslan Bukin sfix->section->mcount = UINT16_MAX; 484*74fe6c29SRuslan Bukin 485*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 486*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_overflow); 487*74fe6c29SRuslan Bukin 488*74fe6c29SRuslan Bukin sfix->section->mcount = 0; 489*74fe6c29SRuslan Bukin 490*74fe6c29SRuslan Bukin return ptu_passed(); 491*74fe6c29SRuslan Bukin } 492*74fe6c29SRuslan Bukin 493*74fe6c29SRuslan Bukin static struct ptunit_result get_put(struct section_fixture *sfix) 494*74fe6c29SRuslan Bukin { 495*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 496*74fe6c29SRuslan Bukin int errcode; 497*74fe6c29SRuslan Bukin 498*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 499*74fe6c29SRuslan Bukin 500*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 501*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 502*74fe6c29SRuslan Bukin 503*74fe6c29SRuslan Bukin errcode = pt_section_get(sfix->section); 504*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 505*74fe6c29SRuslan Bukin 506*74fe6c29SRuslan Bukin errcode = pt_section_get(sfix->section); 507*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 508*74fe6c29SRuslan Bukin 509*74fe6c29SRuslan Bukin errcode = pt_section_put(sfix->section); 510*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 511*74fe6c29SRuslan Bukin 512*74fe6c29SRuslan Bukin errcode = pt_section_put(sfix->section); 513*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 514*74fe6c29SRuslan Bukin 515*74fe6c29SRuslan Bukin return ptu_passed(); 516*74fe6c29SRuslan Bukin } 517*74fe6c29SRuslan Bukin 518*74fe6c29SRuslan Bukin static struct ptunit_result attach_detach(struct section_fixture *sfix) 519*74fe6c29SRuslan Bukin { 520*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache; 521*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 522*74fe6c29SRuslan Bukin int errcode; 523*74fe6c29SRuslan Bukin 524*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 525*74fe6c29SRuslan Bukin 526*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 527*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 528*74fe6c29SRuslan Bukin 529*74fe6c29SRuslan Bukin sfix->section->ucount += 2; 530*74fe6c29SRuslan Bukin 531*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &iscache); 532*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 533*74fe6c29SRuslan Bukin 534*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &iscache); 535*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 536*74fe6c29SRuslan Bukin 537*74fe6c29SRuslan Bukin errcode = pt_section_detach(sfix->section, &iscache); 538*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 539*74fe6c29SRuslan Bukin 540*74fe6c29SRuslan Bukin errcode = pt_section_detach(sfix->section, &iscache); 541*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 542*74fe6c29SRuslan Bukin 543*74fe6c29SRuslan Bukin sfix->section->ucount -= 2; 544*74fe6c29SRuslan Bukin 545*74fe6c29SRuslan Bukin return ptu_passed(); 546*74fe6c29SRuslan Bukin } 547*74fe6c29SRuslan Bukin 548*74fe6c29SRuslan Bukin static struct ptunit_result attach_bad_iscache(struct section_fixture *sfix) 549*74fe6c29SRuslan Bukin { 550*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache, bad; 551*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 552*74fe6c29SRuslan Bukin int errcode; 553*74fe6c29SRuslan Bukin 554*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 555*74fe6c29SRuslan Bukin 556*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 557*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 558*74fe6c29SRuslan Bukin 559*74fe6c29SRuslan Bukin sfix->section->ucount += 2; 560*74fe6c29SRuslan Bukin 561*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &iscache); 562*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 563*74fe6c29SRuslan Bukin 564*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &bad); 565*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 566*74fe6c29SRuslan Bukin 567*74fe6c29SRuslan Bukin errcode = pt_section_detach(sfix->section, &iscache); 568*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 569*74fe6c29SRuslan Bukin 570*74fe6c29SRuslan Bukin sfix->section->ucount -= 2; 571*74fe6c29SRuslan Bukin 572*74fe6c29SRuslan Bukin return ptu_passed(); 573*74fe6c29SRuslan Bukin } 574*74fe6c29SRuslan Bukin 575*74fe6c29SRuslan Bukin static struct ptunit_result detach_bad_iscache(struct section_fixture *sfix) 576*74fe6c29SRuslan Bukin { 577*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache, bad; 578*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 579*74fe6c29SRuslan Bukin int errcode; 580*74fe6c29SRuslan Bukin 581*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 582*74fe6c29SRuslan Bukin 583*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 584*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 585*74fe6c29SRuslan Bukin 586*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &iscache); 587*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 588*74fe6c29SRuslan Bukin 589*74fe6c29SRuslan Bukin errcode = pt_section_detach(sfix->section, &bad); 590*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 591*74fe6c29SRuslan Bukin 592*74fe6c29SRuslan Bukin errcode = pt_section_detach(sfix->section, &iscache); 593*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 594*74fe6c29SRuslan Bukin 595*74fe6c29SRuslan Bukin return ptu_passed(); 596*74fe6c29SRuslan Bukin } 597*74fe6c29SRuslan Bukin 598*74fe6c29SRuslan Bukin static struct ptunit_result map_unmap(struct section_fixture *sfix) 599*74fe6c29SRuslan Bukin { 600*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 601*74fe6c29SRuslan Bukin int errcode; 602*74fe6c29SRuslan Bukin 603*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 604*74fe6c29SRuslan Bukin 605*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 606*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 607*74fe6c29SRuslan Bukin 608*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 609*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 610*74fe6c29SRuslan Bukin 611*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 612*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 613*74fe6c29SRuslan Bukin 614*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 615*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 616*74fe6c29SRuslan Bukin 617*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 618*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 619*74fe6c29SRuslan Bukin 620*74fe6c29SRuslan Bukin return ptu_passed(); 621*74fe6c29SRuslan Bukin } 622*74fe6c29SRuslan Bukin 623*74fe6c29SRuslan Bukin static struct ptunit_result attach_map(struct section_fixture *sfix) 624*74fe6c29SRuslan Bukin { 625*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache; 626*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 627*74fe6c29SRuslan Bukin int errcode; 628*74fe6c29SRuslan Bukin 629*74fe6c29SRuslan Bukin iscache.map = 0; 630*74fe6c29SRuslan Bukin 631*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 632*74fe6c29SRuslan Bukin 633*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 634*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 635*74fe6c29SRuslan Bukin 636*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &iscache); 637*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 638*74fe6c29SRuslan Bukin 639*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 640*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 641*74fe6c29SRuslan Bukin 642*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 643*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 644*74fe6c29SRuslan Bukin 645*74fe6c29SRuslan Bukin ptu_uint_eq(sfix->section->mcount, 2); 646*74fe6c29SRuslan Bukin 647*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 648*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 649*74fe6c29SRuslan Bukin 650*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 651*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 652*74fe6c29SRuslan Bukin 653*74fe6c29SRuslan Bukin errcode = pt_section_detach(sfix->section, &iscache); 654*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 655*74fe6c29SRuslan Bukin 656*74fe6c29SRuslan Bukin return ptu_passed(); 657*74fe6c29SRuslan Bukin } 658*74fe6c29SRuslan Bukin 659*74fe6c29SRuslan Bukin static struct ptunit_result attach_bad_map(struct section_fixture *sfix) 660*74fe6c29SRuslan Bukin { 661*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache; 662*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 663*74fe6c29SRuslan Bukin int errcode; 664*74fe6c29SRuslan Bukin 665*74fe6c29SRuslan Bukin iscache.map = -pte_eos; 666*74fe6c29SRuslan Bukin 667*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 668*74fe6c29SRuslan Bukin 669*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 670*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 671*74fe6c29SRuslan Bukin 672*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &iscache); 673*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 674*74fe6c29SRuslan Bukin 675*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 676*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_eos); 677*74fe6c29SRuslan Bukin 678*74fe6c29SRuslan Bukin errcode = pt_section_detach(sfix->section, &iscache); 679*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 680*74fe6c29SRuslan Bukin 681*74fe6c29SRuslan Bukin return ptu_passed(); 682*74fe6c29SRuslan Bukin } 683*74fe6c29SRuslan Bukin 684*74fe6c29SRuslan Bukin static struct ptunit_result attach_map_overflow(struct section_fixture *sfix) 685*74fe6c29SRuslan Bukin { 686*74fe6c29SRuslan Bukin struct pt_image_section_cache iscache; 687*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 688*74fe6c29SRuslan Bukin int errcode; 689*74fe6c29SRuslan Bukin 690*74fe6c29SRuslan Bukin iscache.map = 1; 691*74fe6c29SRuslan Bukin 692*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 693*74fe6c29SRuslan Bukin 694*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 695*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 696*74fe6c29SRuslan Bukin 697*74fe6c29SRuslan Bukin errcode = pt_section_attach(sfix->section, &iscache); 698*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 699*74fe6c29SRuslan Bukin 700*74fe6c29SRuslan Bukin sfix->section->mcount = UINT16_MAX - 1; 701*74fe6c29SRuslan Bukin 702*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 703*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_overflow); 704*74fe6c29SRuslan Bukin 705*74fe6c29SRuslan Bukin errcode = pt_section_detach(sfix->section, &iscache); 706*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 707*74fe6c29SRuslan Bukin 708*74fe6c29SRuslan Bukin return ptu_passed(); 709*74fe6c29SRuslan Bukin } 710*74fe6c29SRuslan Bukin 711*74fe6c29SRuslan Bukin static struct ptunit_result read(struct section_fixture *sfix) 712*74fe6c29SRuslan Bukin { 713*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 714*74fe6c29SRuslan Bukin uint8_t buffer[] = { 0xcc, 0xcc, 0xcc }; 715*74fe6c29SRuslan Bukin int status; 716*74fe6c29SRuslan Bukin 717*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 718*74fe6c29SRuslan Bukin 719*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 720*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 721*74fe6c29SRuslan Bukin 722*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 723*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 724*74fe6c29SRuslan Bukin 725*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 2, 0x0ull); 726*74fe6c29SRuslan Bukin ptu_int_eq(status, 2); 727*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], bytes[1]); 728*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[1], bytes[2]); 729*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[2], 0xcc); 730*74fe6c29SRuslan Bukin 731*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 732*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 733*74fe6c29SRuslan Bukin 734*74fe6c29SRuslan Bukin return ptu_passed(); 735*74fe6c29SRuslan Bukin } 736*74fe6c29SRuslan Bukin 737*74fe6c29SRuslan Bukin static struct ptunit_result read_null(struct section_fixture *sfix) 738*74fe6c29SRuslan Bukin { 739*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 740*74fe6c29SRuslan Bukin uint8_t buffer[] = { 0xcc }; 741*74fe6c29SRuslan Bukin int status; 742*74fe6c29SRuslan Bukin 743*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 744*74fe6c29SRuslan Bukin 745*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 746*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 747*74fe6c29SRuslan Bukin 748*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 749*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 750*74fe6c29SRuslan Bukin 751*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, NULL, 1, 0x0ull); 752*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal); 753*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], 0xcc); 754*74fe6c29SRuslan Bukin 755*74fe6c29SRuslan Bukin status = pt_section_read(NULL, buffer, 1, 0x0ull); 756*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_internal); 757*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], 0xcc); 758*74fe6c29SRuslan Bukin 759*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 760*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 761*74fe6c29SRuslan Bukin 762*74fe6c29SRuslan Bukin return ptu_passed(); 763*74fe6c29SRuslan Bukin } 764*74fe6c29SRuslan Bukin 765*74fe6c29SRuslan Bukin static struct ptunit_result read_offset(struct section_fixture *sfix) 766*74fe6c29SRuslan Bukin { 767*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 768*74fe6c29SRuslan Bukin uint8_t buffer[] = { 0xcc, 0xcc, 0xcc }; 769*74fe6c29SRuslan Bukin int status; 770*74fe6c29SRuslan Bukin 771*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 772*74fe6c29SRuslan Bukin 773*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 774*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 775*74fe6c29SRuslan Bukin 776*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 777*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 778*74fe6c29SRuslan Bukin 779*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 2, 0x1ull); 780*74fe6c29SRuslan Bukin ptu_int_eq(status, 2); 781*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], bytes[2]); 782*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[1], bytes[3]); 783*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[2], 0xcc); 784*74fe6c29SRuslan Bukin 785*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 786*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 787*74fe6c29SRuslan Bukin 788*74fe6c29SRuslan Bukin return ptu_passed(); 789*74fe6c29SRuslan Bukin } 790*74fe6c29SRuslan Bukin 791*74fe6c29SRuslan Bukin static struct ptunit_result read_truncated(struct section_fixture *sfix) 792*74fe6c29SRuslan Bukin { 793*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc, 0xcc }; 794*74fe6c29SRuslan Bukin int status; 795*74fe6c29SRuslan Bukin 796*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 797*74fe6c29SRuslan Bukin 798*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 799*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 800*74fe6c29SRuslan Bukin 801*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 802*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 803*74fe6c29SRuslan Bukin 804*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 2, 0x2ull); 805*74fe6c29SRuslan Bukin ptu_int_eq(status, 1); 806*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], bytes[3]); 807*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[1], 0xcc); 808*74fe6c29SRuslan Bukin 809*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 810*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 811*74fe6c29SRuslan Bukin 812*74fe6c29SRuslan Bukin return ptu_passed(); 813*74fe6c29SRuslan Bukin } 814*74fe6c29SRuslan Bukin 815*74fe6c29SRuslan Bukin static struct ptunit_result read_from_truncated(struct section_fixture *sfix) 816*74fe6c29SRuslan Bukin { 817*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc, 0xcc }; 818*74fe6c29SRuslan Bukin int status; 819*74fe6c29SRuslan Bukin 820*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 821*74fe6c29SRuslan Bukin 822*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x2ull, 0x10ull); 823*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 824*74fe6c29SRuslan Bukin 825*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 826*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 827*74fe6c29SRuslan Bukin 828*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 2, 0x1ull); 829*74fe6c29SRuslan Bukin ptu_int_eq(status, 1); 830*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], bytes[3]); 831*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[1], 0xcc); 832*74fe6c29SRuslan Bukin 833*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 834*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 835*74fe6c29SRuslan Bukin 836*74fe6c29SRuslan Bukin return ptu_passed(); 837*74fe6c29SRuslan Bukin } 838*74fe6c29SRuslan Bukin 839*74fe6c29SRuslan Bukin static struct ptunit_result read_nomem(struct section_fixture *sfix) 840*74fe6c29SRuslan Bukin { 841*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc }; 842*74fe6c29SRuslan Bukin int status; 843*74fe6c29SRuslan Bukin 844*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 845*74fe6c29SRuslan Bukin 846*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 847*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 848*74fe6c29SRuslan Bukin 849*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 850*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 851*74fe6c29SRuslan Bukin 852*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 1, 0x3ull); 853*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_nomap); 854*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], 0xcc); 855*74fe6c29SRuslan Bukin 856*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 857*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 858*74fe6c29SRuslan Bukin 859*74fe6c29SRuslan Bukin return ptu_passed(); 860*74fe6c29SRuslan Bukin } 861*74fe6c29SRuslan Bukin 862*74fe6c29SRuslan Bukin static struct ptunit_result read_overflow(struct section_fixture *sfix) 863*74fe6c29SRuslan Bukin { 864*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc }; 865*74fe6c29SRuslan Bukin int status; 866*74fe6c29SRuslan Bukin 867*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 868*74fe6c29SRuslan Bukin 869*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 870*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 871*74fe6c29SRuslan Bukin 872*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 873*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 874*74fe6c29SRuslan Bukin 875*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 1, 876*74fe6c29SRuslan Bukin 0xffffffffffff0000ull); 877*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_nomap); 878*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], 0xcc); 879*74fe6c29SRuslan Bukin 880*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 881*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 882*74fe6c29SRuslan Bukin 883*74fe6c29SRuslan Bukin return ptu_passed(); 884*74fe6c29SRuslan Bukin } 885*74fe6c29SRuslan Bukin 886*74fe6c29SRuslan Bukin static struct ptunit_result read_overflow_32bit(struct section_fixture *sfix) 887*74fe6c29SRuslan Bukin { 888*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc }; 889*74fe6c29SRuslan Bukin int status; 890*74fe6c29SRuslan Bukin 891*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 892*74fe6c29SRuslan Bukin 893*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 894*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 895*74fe6c29SRuslan Bukin 896*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 897*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 898*74fe6c29SRuslan Bukin 899*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 1, 900*74fe6c29SRuslan Bukin 0xff00000000ull); 901*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_nomap); 902*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], 0xcc); 903*74fe6c29SRuslan Bukin 904*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 905*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 906*74fe6c29SRuslan Bukin 907*74fe6c29SRuslan Bukin return ptu_passed(); 908*74fe6c29SRuslan Bukin } 909*74fe6c29SRuslan Bukin 910*74fe6c29SRuslan Bukin static struct ptunit_result read_nomap(struct section_fixture *sfix) 911*74fe6c29SRuslan Bukin { 912*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }, buffer[] = { 0xcc }; 913*74fe6c29SRuslan Bukin int status; 914*74fe6c29SRuslan Bukin 915*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 916*74fe6c29SRuslan Bukin 917*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 918*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 919*74fe6c29SRuslan Bukin 920*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 1, 0x0ull); 921*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_nomap); 922*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], 0xcc); 923*74fe6c29SRuslan Bukin 924*74fe6c29SRuslan Bukin return ptu_passed(); 925*74fe6c29SRuslan Bukin } 926*74fe6c29SRuslan Bukin 927*74fe6c29SRuslan Bukin static struct ptunit_result read_unmap_map(struct section_fixture *sfix) 928*74fe6c29SRuslan Bukin { 929*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 930*74fe6c29SRuslan Bukin uint8_t buffer[] = { 0xcc, 0xcc, 0xcc }; 931*74fe6c29SRuslan Bukin int status; 932*74fe6c29SRuslan Bukin 933*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 934*74fe6c29SRuslan Bukin 935*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 936*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 937*74fe6c29SRuslan Bukin 938*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 939*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 940*74fe6c29SRuslan Bukin 941*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 2, 0x0ull); 942*74fe6c29SRuslan Bukin ptu_int_eq(status, 2); 943*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], bytes[1]); 944*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[1], bytes[2]); 945*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[2], 0xcc); 946*74fe6c29SRuslan Bukin 947*74fe6c29SRuslan Bukin memset(buffer, 0xcc, sizeof(buffer)); 948*74fe6c29SRuslan Bukin 949*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 950*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 951*74fe6c29SRuslan Bukin 952*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 2, 0x0ull); 953*74fe6c29SRuslan Bukin ptu_int_eq(status, -pte_nomap); 954*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], 0xcc); 955*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[1], 0xcc); 956*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[2], 0xcc); 957*74fe6c29SRuslan Bukin 958*74fe6c29SRuslan Bukin status = pt_section_map(sfix->section); 959*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 960*74fe6c29SRuslan Bukin 961*74fe6c29SRuslan Bukin status = pt_section_read(sfix->section, buffer, 2, 0x0ull); 962*74fe6c29SRuslan Bukin ptu_int_eq(status, 2); 963*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[0], bytes[1]); 964*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[1], bytes[2]); 965*74fe6c29SRuslan Bukin ptu_uint_eq(buffer[2], 0xcc); 966*74fe6c29SRuslan Bukin 967*74fe6c29SRuslan Bukin status = pt_section_unmap(sfix->section); 968*74fe6c29SRuslan Bukin ptu_int_eq(status, 0); 969*74fe6c29SRuslan Bukin 970*74fe6c29SRuslan Bukin return ptu_passed(); 971*74fe6c29SRuslan Bukin } 972*74fe6c29SRuslan Bukin 973*74fe6c29SRuslan Bukin static int worker_read(void *arg) 974*74fe6c29SRuslan Bukin { 975*74fe6c29SRuslan Bukin struct section_fixture *sfix; 976*74fe6c29SRuslan Bukin int it, errcode; 977*74fe6c29SRuslan Bukin 978*74fe6c29SRuslan Bukin sfix = arg; 979*74fe6c29SRuslan Bukin if (!sfix) 980*74fe6c29SRuslan Bukin return -pte_internal; 981*74fe6c29SRuslan Bukin 982*74fe6c29SRuslan Bukin for (it = 0; it < num_work; ++it) { 983*74fe6c29SRuslan Bukin uint8_t buffer[] = { 0xcc, 0xcc, 0xcc }; 984*74fe6c29SRuslan Bukin int read; 985*74fe6c29SRuslan Bukin 986*74fe6c29SRuslan Bukin errcode = pt_section_get(sfix->section); 987*74fe6c29SRuslan Bukin if (errcode < 0) 988*74fe6c29SRuslan Bukin return errcode; 989*74fe6c29SRuslan Bukin 990*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 991*74fe6c29SRuslan Bukin if (errcode < 0) 992*74fe6c29SRuslan Bukin goto out_put; 993*74fe6c29SRuslan Bukin 994*74fe6c29SRuslan Bukin read = pt_section_read(sfix->section, buffer, 2, 0x0ull); 995*74fe6c29SRuslan Bukin if (read < 0) 996*74fe6c29SRuslan Bukin goto out_unmap; 997*74fe6c29SRuslan Bukin 998*74fe6c29SRuslan Bukin errcode = -pte_invalid; 999*74fe6c29SRuslan Bukin if ((read != 2) || (buffer[0] != 0x2) || (buffer[1] != 0x4)) 1000*74fe6c29SRuslan Bukin goto out_unmap; 1001*74fe6c29SRuslan Bukin 1002*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 1003*74fe6c29SRuslan Bukin if (errcode < 0) 1004*74fe6c29SRuslan Bukin goto out_put; 1005*74fe6c29SRuslan Bukin 1006*74fe6c29SRuslan Bukin errcode = pt_section_put(sfix->section); 1007*74fe6c29SRuslan Bukin if (errcode < 0) 1008*74fe6c29SRuslan Bukin return errcode; 1009*74fe6c29SRuslan Bukin } 1010*74fe6c29SRuslan Bukin 1011*74fe6c29SRuslan Bukin return 0; 1012*74fe6c29SRuslan Bukin 1013*74fe6c29SRuslan Bukin out_unmap: 1014*74fe6c29SRuslan Bukin (void) pt_section_unmap(sfix->section); 1015*74fe6c29SRuslan Bukin 1016*74fe6c29SRuslan Bukin out_put: 1017*74fe6c29SRuslan Bukin (void) pt_section_put(sfix->section); 1018*74fe6c29SRuslan Bukin return errcode; 1019*74fe6c29SRuslan Bukin } 1020*74fe6c29SRuslan Bukin 1021*74fe6c29SRuslan Bukin static int worker_bcache(void *arg) 1022*74fe6c29SRuslan Bukin { 1023*74fe6c29SRuslan Bukin struct section_fixture *sfix; 1024*74fe6c29SRuslan Bukin int it, errcode; 1025*74fe6c29SRuslan Bukin 1026*74fe6c29SRuslan Bukin sfix = arg; 1027*74fe6c29SRuslan Bukin if (!sfix) 1028*74fe6c29SRuslan Bukin return -pte_internal; 1029*74fe6c29SRuslan Bukin 1030*74fe6c29SRuslan Bukin errcode = pt_section_get(sfix->section); 1031*74fe6c29SRuslan Bukin if (errcode < 0) 1032*74fe6c29SRuslan Bukin return errcode; 1033*74fe6c29SRuslan Bukin 1034*74fe6c29SRuslan Bukin for (it = 0; it < num_work; ++it) { 1035*74fe6c29SRuslan Bukin struct pt_block_cache *bcache; 1036*74fe6c29SRuslan Bukin 1037*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 1038*74fe6c29SRuslan Bukin if (errcode < 0) 1039*74fe6c29SRuslan Bukin goto out_put; 1040*74fe6c29SRuslan Bukin 1041*74fe6c29SRuslan Bukin errcode = pt_section_request_bcache(sfix->section); 1042*74fe6c29SRuslan Bukin if (errcode < 0) 1043*74fe6c29SRuslan Bukin goto out_unmap; 1044*74fe6c29SRuslan Bukin 1045*74fe6c29SRuslan Bukin bcache = pt_section_bcache(sfix->section); 1046*74fe6c29SRuslan Bukin if (!bcache) { 1047*74fe6c29SRuslan Bukin errcode = -pte_nomem; 1048*74fe6c29SRuslan Bukin goto out_unmap; 1049*74fe6c29SRuslan Bukin } 1050*74fe6c29SRuslan Bukin 1051*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 1052*74fe6c29SRuslan Bukin if (errcode < 0) 1053*74fe6c29SRuslan Bukin goto out_put; 1054*74fe6c29SRuslan Bukin } 1055*74fe6c29SRuslan Bukin 1056*74fe6c29SRuslan Bukin return pt_section_put(sfix->section); 1057*74fe6c29SRuslan Bukin 1058*74fe6c29SRuslan Bukin out_unmap: 1059*74fe6c29SRuslan Bukin (void) pt_section_unmap(sfix->section); 1060*74fe6c29SRuslan Bukin 1061*74fe6c29SRuslan Bukin out_put: 1062*74fe6c29SRuslan Bukin (void) pt_section_put(sfix->section); 1063*74fe6c29SRuslan Bukin return errcode; 1064*74fe6c29SRuslan Bukin } 1065*74fe6c29SRuslan Bukin 1066*74fe6c29SRuslan Bukin static struct ptunit_result stress(struct section_fixture *sfix, 1067*74fe6c29SRuslan Bukin int (*worker)(void *)) 1068*74fe6c29SRuslan Bukin { 1069*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 1070*74fe6c29SRuslan Bukin int errcode; 1071*74fe6c29SRuslan Bukin 1072*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 1073*74fe6c29SRuslan Bukin 1074*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 1075*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 1076*74fe6c29SRuslan Bukin 1077*74fe6c29SRuslan Bukin #if defined(FEATURE_THREADS) 1078*74fe6c29SRuslan Bukin { 1079*74fe6c29SRuslan Bukin int thrd; 1080*74fe6c29SRuslan Bukin 1081*74fe6c29SRuslan Bukin for (thrd = 0; thrd < num_threads; ++thrd) 1082*74fe6c29SRuslan Bukin ptu_test(ptunit_thrd_create, &sfix->thrd, worker, sfix); 1083*74fe6c29SRuslan Bukin } 1084*74fe6c29SRuslan Bukin #endif /* defined(FEATURE_THREADS) */ 1085*74fe6c29SRuslan Bukin 1086*74fe6c29SRuslan Bukin errcode = worker(sfix); 1087*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1088*74fe6c29SRuslan Bukin 1089*74fe6c29SRuslan Bukin return ptu_passed(); 1090*74fe6c29SRuslan Bukin } 1091*74fe6c29SRuslan Bukin 1092*74fe6c29SRuslan Bukin static struct ptunit_result init_no_bcache(struct section_fixture *sfix) 1093*74fe6c29SRuslan Bukin { 1094*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 1095*74fe6c29SRuslan Bukin struct pt_block_cache *bcache; 1096*74fe6c29SRuslan Bukin int errcode; 1097*74fe6c29SRuslan Bukin 1098*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 1099*74fe6c29SRuslan Bukin 1100*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 1101*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 1102*74fe6c29SRuslan Bukin 1103*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 1104*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1105*74fe6c29SRuslan Bukin 1106*74fe6c29SRuslan Bukin bcache = pt_section_bcache(sfix->section); 1107*74fe6c29SRuslan Bukin ptu_null(bcache); 1108*74fe6c29SRuslan Bukin 1109*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 1110*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1111*74fe6c29SRuslan Bukin 1112*74fe6c29SRuslan Bukin return ptu_passed(); 1113*74fe6c29SRuslan Bukin } 1114*74fe6c29SRuslan Bukin 1115*74fe6c29SRuslan Bukin static struct ptunit_result bcache_alloc_free(struct section_fixture *sfix) 1116*74fe6c29SRuslan Bukin { 1117*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 1118*74fe6c29SRuslan Bukin struct pt_block_cache *bcache; 1119*74fe6c29SRuslan Bukin int errcode; 1120*74fe6c29SRuslan Bukin 1121*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 1122*74fe6c29SRuslan Bukin 1123*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 1124*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 1125*74fe6c29SRuslan Bukin 1126*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 1127*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1128*74fe6c29SRuslan Bukin 1129*74fe6c29SRuslan Bukin errcode = pt_section_alloc_bcache(sfix->section); 1130*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1131*74fe6c29SRuslan Bukin 1132*74fe6c29SRuslan Bukin bcache = pt_section_bcache(sfix->section); 1133*74fe6c29SRuslan Bukin ptu_ptr(bcache); 1134*74fe6c29SRuslan Bukin ptu_uint_eq(bcache->nentries, sfix->section->size); 1135*74fe6c29SRuslan Bukin 1136*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 1137*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1138*74fe6c29SRuslan Bukin 1139*74fe6c29SRuslan Bukin bcache = pt_section_bcache(sfix->section); 1140*74fe6c29SRuslan Bukin ptu_null(bcache); 1141*74fe6c29SRuslan Bukin 1142*74fe6c29SRuslan Bukin return ptu_passed(); 1143*74fe6c29SRuslan Bukin } 1144*74fe6c29SRuslan Bukin 1145*74fe6c29SRuslan Bukin static struct ptunit_result bcache_alloc_twice(struct section_fixture *sfix) 1146*74fe6c29SRuslan Bukin { 1147*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 1148*74fe6c29SRuslan Bukin int errcode; 1149*74fe6c29SRuslan Bukin 1150*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 1151*74fe6c29SRuslan Bukin 1152*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 1153*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 1154*74fe6c29SRuslan Bukin 1155*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 1156*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1157*74fe6c29SRuslan Bukin 1158*74fe6c29SRuslan Bukin errcode = pt_section_alloc_bcache(sfix->section); 1159*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1160*74fe6c29SRuslan Bukin 1161*74fe6c29SRuslan Bukin errcode = pt_section_alloc_bcache(sfix->section); 1162*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1163*74fe6c29SRuslan Bukin 1164*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 1165*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1166*74fe6c29SRuslan Bukin 1167*74fe6c29SRuslan Bukin return ptu_passed(); 1168*74fe6c29SRuslan Bukin } 1169*74fe6c29SRuslan Bukin 1170*74fe6c29SRuslan Bukin static struct ptunit_result bcache_alloc_nomap(struct section_fixture *sfix) 1171*74fe6c29SRuslan Bukin { 1172*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 1173*74fe6c29SRuslan Bukin int errcode; 1174*74fe6c29SRuslan Bukin 1175*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 1176*74fe6c29SRuslan Bukin 1177*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 1178*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 1179*74fe6c29SRuslan Bukin 1180*74fe6c29SRuslan Bukin errcode = pt_section_alloc_bcache(sfix->section); 1181*74fe6c29SRuslan Bukin ptu_int_eq(errcode, -pte_internal); 1182*74fe6c29SRuslan Bukin 1183*74fe6c29SRuslan Bukin return ptu_passed(); 1184*74fe6c29SRuslan Bukin } 1185*74fe6c29SRuslan Bukin 1186*74fe6c29SRuslan Bukin static struct ptunit_result memsize_nomap(struct section_fixture *sfix) 1187*74fe6c29SRuslan Bukin { 1188*74fe6c29SRuslan Bukin uint64_t memsize; 1189*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 1190*74fe6c29SRuslan Bukin int errcode; 1191*74fe6c29SRuslan Bukin 1192*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 1193*74fe6c29SRuslan Bukin 1194*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 1195*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 1196*74fe6c29SRuslan Bukin 1197*74fe6c29SRuslan Bukin errcode = pt_section_memsize(sfix->section, &memsize); 1198*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1199*74fe6c29SRuslan Bukin ptu_uint_eq(memsize, 0ull); 1200*74fe6c29SRuslan Bukin 1201*74fe6c29SRuslan Bukin return ptu_passed(); 1202*74fe6c29SRuslan Bukin } 1203*74fe6c29SRuslan Bukin 1204*74fe6c29SRuslan Bukin static struct ptunit_result memsize_unmap(struct section_fixture *sfix) 1205*74fe6c29SRuslan Bukin { 1206*74fe6c29SRuslan Bukin uint64_t memsize; 1207*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 1208*74fe6c29SRuslan Bukin int errcode; 1209*74fe6c29SRuslan Bukin 1210*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 1211*74fe6c29SRuslan Bukin 1212*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 1213*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 1214*74fe6c29SRuslan Bukin 1215*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 1216*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1217*74fe6c29SRuslan Bukin 1218*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 1219*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1220*74fe6c29SRuslan Bukin 1221*74fe6c29SRuslan Bukin errcode = pt_section_memsize(sfix->section, &memsize); 1222*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1223*74fe6c29SRuslan Bukin ptu_uint_eq(memsize, 0ull); 1224*74fe6c29SRuslan Bukin 1225*74fe6c29SRuslan Bukin return ptu_passed(); 1226*74fe6c29SRuslan Bukin } 1227*74fe6c29SRuslan Bukin 1228*74fe6c29SRuslan Bukin static struct ptunit_result memsize_map_nobcache(struct section_fixture *sfix) 1229*74fe6c29SRuslan Bukin { 1230*74fe6c29SRuslan Bukin uint64_t memsize; 1231*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 1232*74fe6c29SRuslan Bukin int errcode; 1233*74fe6c29SRuslan Bukin 1234*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 1235*74fe6c29SRuslan Bukin 1236*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 1237*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 1238*74fe6c29SRuslan Bukin 1239*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 1240*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1241*74fe6c29SRuslan Bukin 1242*74fe6c29SRuslan Bukin memsize = 0xfefefefefefefefeull; 1243*74fe6c29SRuslan Bukin 1244*74fe6c29SRuslan Bukin errcode = pt_section_memsize(sfix->section, &memsize); 1245*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1246*74fe6c29SRuslan Bukin ptu_uint_ge(memsize, 0ull); 1247*74fe6c29SRuslan Bukin ptu_uint_le(memsize, 0x2000ull); 1248*74fe6c29SRuslan Bukin 1249*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 1250*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1251*74fe6c29SRuslan Bukin 1252*74fe6c29SRuslan Bukin return ptu_passed(); 1253*74fe6c29SRuslan Bukin } 1254*74fe6c29SRuslan Bukin 1255*74fe6c29SRuslan Bukin static struct ptunit_result memsize_map_bcache(struct section_fixture *sfix) 1256*74fe6c29SRuslan Bukin { 1257*74fe6c29SRuslan Bukin uint64_t memsize; 1258*74fe6c29SRuslan Bukin uint8_t bytes[] = { 0xcc, 0x2, 0x4, 0x6 }; 1259*74fe6c29SRuslan Bukin int errcode; 1260*74fe6c29SRuslan Bukin 1261*74fe6c29SRuslan Bukin sfix_write(sfix, bytes); 1262*74fe6c29SRuslan Bukin 1263*74fe6c29SRuslan Bukin sfix->section = pt_mk_section(sfix->name, 0x1ull, 0x3ull); 1264*74fe6c29SRuslan Bukin ptu_ptr(sfix->section); 1265*74fe6c29SRuslan Bukin 1266*74fe6c29SRuslan Bukin errcode = pt_section_map(sfix->section); 1267*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1268*74fe6c29SRuslan Bukin 1269*74fe6c29SRuslan Bukin errcode = pt_section_alloc_bcache(sfix->section); 1270*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1271*74fe6c29SRuslan Bukin 1272*74fe6c29SRuslan Bukin errcode = pt_section_memsize(sfix->section, &memsize); 1273*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1274*74fe6c29SRuslan Bukin ptu_uint_ge(memsize, 1275*74fe6c29SRuslan Bukin sfix->section->size * sizeof(struct pt_bcache_entry)); 1276*74fe6c29SRuslan Bukin 1277*74fe6c29SRuslan Bukin errcode = pt_section_unmap(sfix->section); 1278*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1279*74fe6c29SRuslan Bukin 1280*74fe6c29SRuslan Bukin return ptu_passed(); 1281*74fe6c29SRuslan Bukin } 1282*74fe6c29SRuslan Bukin 1283*74fe6c29SRuslan Bukin static struct ptunit_result sfix_init(struct section_fixture *sfix) 1284*74fe6c29SRuslan Bukin { 1285*74fe6c29SRuslan Bukin int errcode; 1286*74fe6c29SRuslan Bukin 1287*74fe6c29SRuslan Bukin sfix->section = NULL; 1288*74fe6c29SRuslan Bukin sfix->file = NULL; 1289*74fe6c29SRuslan Bukin sfix->name = NULL; 1290*74fe6c29SRuslan Bukin 1291*74fe6c29SRuslan Bukin errcode = ptunit_mkfile(&sfix->file, &sfix->name, "wb"); 1292*74fe6c29SRuslan Bukin ptu_int_eq(errcode, 0); 1293*74fe6c29SRuslan Bukin 1294*74fe6c29SRuslan Bukin ptu_test(ptunit_thrd_init, &sfix->thrd); 1295*74fe6c29SRuslan Bukin 1296*74fe6c29SRuslan Bukin return ptu_passed(); 1297*74fe6c29SRuslan Bukin } 1298*74fe6c29SRuslan Bukin 1299*74fe6c29SRuslan Bukin static struct ptunit_result sfix_fini(struct section_fixture *sfix) 1300*74fe6c29SRuslan Bukin { 1301*74fe6c29SRuslan Bukin int thrd; 1302*74fe6c29SRuslan Bukin 1303*74fe6c29SRuslan Bukin ptu_test(ptunit_thrd_fini, &sfix->thrd); 1304*74fe6c29SRuslan Bukin 1305*74fe6c29SRuslan Bukin for (thrd = 0; thrd < sfix->thrd.nthreads; ++thrd) 1306*74fe6c29SRuslan Bukin ptu_int_eq(sfix->thrd.result[thrd], 0); 1307*74fe6c29SRuslan Bukin 1308*74fe6c29SRuslan Bukin if (sfix->section) { 1309*74fe6c29SRuslan Bukin pt_section_put(sfix->section); 1310*74fe6c29SRuslan Bukin sfix->section = NULL; 1311*74fe6c29SRuslan Bukin } 1312*74fe6c29SRuslan Bukin 1313*74fe6c29SRuslan Bukin if (sfix->file) { 1314*74fe6c29SRuslan Bukin fclose(sfix->file); 1315*74fe6c29SRuslan Bukin sfix->file = NULL; 1316*74fe6c29SRuslan Bukin 1317*74fe6c29SRuslan Bukin if (sfix->name) 1318*74fe6c29SRuslan Bukin remove(sfix->name); 1319*74fe6c29SRuslan Bukin } 1320*74fe6c29SRuslan Bukin 1321*74fe6c29SRuslan Bukin if (sfix->name) { 1322*74fe6c29SRuslan Bukin free(sfix->name); 1323*74fe6c29SRuslan Bukin sfix->name = NULL; 1324*74fe6c29SRuslan Bukin } 1325*74fe6c29SRuslan Bukin 1326*74fe6c29SRuslan Bukin return ptu_passed(); 1327*74fe6c29SRuslan Bukin } 1328*74fe6c29SRuslan Bukin 1329*74fe6c29SRuslan Bukin int main(int argc, char **argv) 1330*74fe6c29SRuslan Bukin { 1331*74fe6c29SRuslan Bukin struct section_fixture sfix; 1332*74fe6c29SRuslan Bukin struct ptunit_suite suite; 1333*74fe6c29SRuslan Bukin 1334*74fe6c29SRuslan Bukin sfix.init = sfix_init; 1335*74fe6c29SRuslan Bukin sfix.fini = sfix_fini; 1336*74fe6c29SRuslan Bukin 1337*74fe6c29SRuslan Bukin suite = ptunit_mk_suite(argc, argv); 1338*74fe6c29SRuslan Bukin 1339*74fe6c29SRuslan Bukin ptu_run_f(suite, create, sfix); 1340*74fe6c29SRuslan Bukin ptu_run_f(suite, create_bad_offset, sfix); 1341*74fe6c29SRuslan Bukin ptu_run_f(suite, create_truncated, sfix); 1342*74fe6c29SRuslan Bukin ptu_run_f(suite, create_empty, sfix); 1343*74fe6c29SRuslan Bukin 1344*74fe6c29SRuslan Bukin ptu_run(suite, filename_null); 1345*74fe6c29SRuslan Bukin ptu_run(suite, offset_null); 1346*74fe6c29SRuslan Bukin ptu_run(suite, size_null); 1347*74fe6c29SRuslan Bukin ptu_run(suite, get_null); 1348*74fe6c29SRuslan Bukin ptu_run(suite, put_null); 1349*74fe6c29SRuslan Bukin ptu_run(suite, attach_null); 1350*74fe6c29SRuslan Bukin ptu_run(suite, detach_null); 1351*74fe6c29SRuslan Bukin ptu_run(suite, map_null); 1352*74fe6c29SRuslan Bukin ptu_run(suite, unmap_null); 1353*74fe6c29SRuslan Bukin ptu_run(suite, cache_null); 1354*74fe6c29SRuslan Bukin 1355*74fe6c29SRuslan Bukin ptu_run_f(suite, get_overflow, sfix); 1356*74fe6c29SRuslan Bukin ptu_run_f(suite, attach_overflow, sfix); 1357*74fe6c29SRuslan Bukin ptu_run_f(suite, attach_bad_ucount, sfix); 1358*74fe6c29SRuslan Bukin ptu_run_f(suite, map_change, sfix); 1359*74fe6c29SRuslan Bukin ptu_run_f(suite, map_put, sfix); 1360*74fe6c29SRuslan Bukin ptu_run_f(suite, unmap_nomap, sfix); 1361*74fe6c29SRuslan Bukin ptu_run_f(suite, map_overflow, sfix); 1362*74fe6c29SRuslan Bukin ptu_run_f(suite, get_put, sfix); 1363*74fe6c29SRuslan Bukin ptu_run_f(suite, attach_detach, sfix); 1364*74fe6c29SRuslan Bukin ptu_run_f(suite, attach_bad_iscache, sfix); 1365*74fe6c29SRuslan Bukin ptu_run_f(suite, detach_bad_iscache, sfix); 1366*74fe6c29SRuslan Bukin ptu_run_f(suite, map_unmap, sfix); 1367*74fe6c29SRuslan Bukin ptu_run_f(suite, attach_map, sfix); 1368*74fe6c29SRuslan Bukin ptu_run_f(suite, attach_bad_map, sfix); 1369*74fe6c29SRuslan Bukin ptu_run_f(suite, attach_map_overflow, sfix); 1370*74fe6c29SRuslan Bukin ptu_run_f(suite, read, sfix); 1371*74fe6c29SRuslan Bukin ptu_run_f(suite, read_null, sfix); 1372*74fe6c29SRuslan Bukin ptu_run_f(suite, read_offset, sfix); 1373*74fe6c29SRuslan Bukin ptu_run_f(suite, read_truncated, sfix); 1374*74fe6c29SRuslan Bukin ptu_run_f(suite, read_from_truncated, sfix); 1375*74fe6c29SRuslan Bukin ptu_run_f(suite, read_nomem, sfix); 1376*74fe6c29SRuslan Bukin ptu_run_f(suite, read_overflow, sfix); 1377*74fe6c29SRuslan Bukin ptu_run_f(suite, read_overflow_32bit, sfix); 1378*74fe6c29SRuslan Bukin ptu_run_f(suite, read_nomap, sfix); 1379*74fe6c29SRuslan Bukin ptu_run_f(suite, read_unmap_map, sfix); 1380*74fe6c29SRuslan Bukin 1381*74fe6c29SRuslan Bukin ptu_run_f(suite, init_no_bcache, sfix); 1382*74fe6c29SRuslan Bukin ptu_run_f(suite, bcache_alloc_free, sfix); 1383*74fe6c29SRuslan Bukin ptu_run_f(suite, bcache_alloc_twice, sfix); 1384*74fe6c29SRuslan Bukin ptu_run_f(suite, bcache_alloc_nomap, sfix); 1385*74fe6c29SRuslan Bukin 1386*74fe6c29SRuslan Bukin ptu_run_f(suite, memsize_null, sfix); 1387*74fe6c29SRuslan Bukin ptu_run_f(suite, memsize_nomap, sfix); 1388*74fe6c29SRuslan Bukin ptu_run_f(suite, memsize_unmap, sfix); 1389*74fe6c29SRuslan Bukin ptu_run_f(suite, memsize_map_nobcache, sfix); 1390*74fe6c29SRuslan Bukin ptu_run_f(suite, memsize_map_bcache, sfix); 1391*74fe6c29SRuslan Bukin 1392*74fe6c29SRuslan Bukin ptu_run_fp(suite, stress, sfix, worker_bcache); 1393*74fe6c29SRuslan Bukin ptu_run_fp(suite, stress, sfix, worker_read); 1394*74fe6c29SRuslan Bukin 1395*74fe6c29SRuslan Bukin return ptunit_report(&suite); 1396*74fe6c29SRuslan Bukin } 1397