1 /*
2 * Copyright (c) 2013-2018, Intel Corporation
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * * Redistributions of source code must retain the above copyright notice,
8 * this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright notice,
10 * this list of conditions and the following disclaimer in the documentation
11 * and/or other materials provided with the distribution.
12 * * Neither the name of Intel Corporation nor the names of its contributors
13 * may be used to endorse or promote products derived from this software
14 * without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "ptunit.h"
30
31 #include "pt_image.h"
32 #include "pt_section.h"
33 #include "pt_mapped_section.h"
34
35 #include "intel-pt.h"
36
37
38 struct image_fixture;
39
40 /* A test mapping. */
41 struct ifix_mapping {
42 /* The contents. */
43 uint8_t content[0x10];
44
45 /* The size - between 0 and sizeof(content). */
46 uint64_t size;
47
48 /* An artificial error code to be injected into pt_section_read().
49 *
50 * If @errcode is non-zero, pt_section_read() fails with @errcode.
51 */
52 int errcode;
53 };
54
55 /* A test file status - turned into a section status. */
56 struct ifix_status {
57 /* Delete indication:
58 * - zero if initialized and not (yet) deleted
59 * - non-zero if deleted and not (re-)initialized
60 */
61 int deleted;
62
63 /* Put with use-count of zero indication. */
64 int bad_put;
65
66 /* The test mapping to be used. */
67 struct ifix_mapping *mapping;
68
69 /* A link back to the test fixture providing this section. */
70 struct image_fixture *ifix;
71 };
72
73 enum {
74 ifix_nsecs = 5
75 };
76
77 /* A fake image section cache. */
78 struct pt_image_section_cache {
79 /* The cached sections. */
80 struct pt_section *section[ifix_nsecs];
81
82 /* Their load addresses. */
83 uint64_t laddr[ifix_nsecs];
84
85 /* The number of used sections. */
86 int nsecs;
87 };
88
89 extern int pt_iscache_lookup(struct pt_image_section_cache *iscache,
90 struct pt_section **section, uint64_t *laddr,
91 int isid);
92
93
94 /* A test fixture providing an image, test sections, and asids. */
95 struct image_fixture {
96 /* The image. */
97 struct pt_image image;
98
99 /* The test states. */
100 struct ifix_status status[ifix_nsecs];
101
102 /* The test mappings. */
103 struct ifix_mapping mapping[ifix_nsecs];
104
105 /* The sections. */
106 struct pt_section section[ifix_nsecs];
107
108 /* The asids. */
109 struct pt_asid asid[3];
110
111 /* The number of used sections/mappings/states. */
112 int nsecs;
113
114 /* An initially empty image as destination for image copies. */
115 struct pt_image copy;
116
117 /* A test section cache. */
118 struct pt_image_section_cache iscache;
119
120 /* The test fixture initialization and finalization functions. */
121 struct ptunit_result (*init)(struct image_fixture *);
122 struct ptunit_result (*fini)(struct image_fixture *);
123 };
124
ifix_init_section(struct pt_section * section,char * filename,struct ifix_status * status,struct ifix_mapping * mapping,struct image_fixture * ifix)125 static void ifix_init_section(struct pt_section *section, char *filename,
126 struct ifix_status *status,
127 struct ifix_mapping *mapping,
128 struct image_fixture *ifix)
129 {
130 uint8_t i;
131
132 memset(section, 0, sizeof(*section));
133
134 section->filename = filename;
135 section->status = status;
136 section->size = mapping->size = sizeof(mapping->content);
137 section->offset = 0x10;
138
139 for (i = 0; i < mapping->size; ++i)
140 mapping->content[i] = i;
141
142 status->deleted = 0;
143 status->bad_put = 0;
144 status->mapping = mapping;
145 status->ifix = ifix;
146 }
147
ifix_add_section(struct image_fixture * ifix,char * filename)148 static int ifix_add_section(struct image_fixture *ifix, char *filename)
149 {
150 int index;
151
152 if (!ifix)
153 return -pte_internal;
154
155 index = ifix->nsecs;
156 if (ifix_nsecs <= index)
157 return -pte_internal;
158
159 ifix_init_section(&ifix->section[index], filename, &ifix->status[index],
160 &ifix->mapping[index], ifix);
161
162 ifix->nsecs += 1;
163 return index;
164 }
165
ifix_cache_section(struct image_fixture * ifix,struct pt_section * section,uint64_t laddr)166 static int ifix_cache_section(struct image_fixture *ifix,
167 struct pt_section *section, uint64_t laddr)
168 {
169 int index;
170
171 if (!ifix)
172 return -pte_internal;
173
174 index = ifix->iscache.nsecs;
175 if (ifix_nsecs <= index)
176 return -pte_internal;
177
178 ifix->iscache.section[index] = section;
179 ifix->iscache.laddr[index] = laddr;
180
181 index += 1;
182 ifix->iscache.nsecs = index;
183
184 return index;
185 }
186
pt_section_filename(const struct pt_section * section)187 const char *pt_section_filename(const struct pt_section *section)
188 {
189 if (!section)
190 return NULL;
191
192 return section->filename;
193 }
194
pt_section_offset(const struct pt_section * section)195 uint64_t pt_section_offset(const struct pt_section *section)
196 {
197 if (!section)
198 return 0ull;
199
200 return section->offset;
201 }
202
pt_section_size(const struct pt_section * section)203 uint64_t pt_section_size(const struct pt_section *section)
204 {
205 if (!section)
206 return 0ull;
207
208 return section->size;
209 }
210
pt_mk_section(const char * file,uint64_t offset,uint64_t size)211 struct pt_section *pt_mk_section(const char *file, uint64_t offset,
212 uint64_t size)
213 {
214 (void) file;
215 (void) offset;
216 (void) size;
217
218 /* This function is not used by our tests. */
219 return NULL;
220 }
221
pt_section_get(struct pt_section * section)222 int pt_section_get(struct pt_section *section)
223 {
224 if (!section)
225 return -pte_internal;
226
227 section->ucount += 1;
228 return 0;
229 }
230
pt_section_put(struct pt_section * section)231 int pt_section_put(struct pt_section *section)
232 {
233 struct ifix_status *status;
234 uint16_t ucount;
235
236 if (!section)
237 return -pte_internal;
238
239 status = section->status;
240 if (!status)
241 return -pte_internal;
242
243 ucount = section->ucount;
244 if (!ucount) {
245 status->bad_put += 1;
246
247 return -pte_internal;
248 }
249
250 ucount = --section->ucount;
251 if (!ucount) {
252 status->deleted += 1;
253
254 if (status->deleted > 1)
255 return -pte_internal;
256 }
257
258 return 0;
259 }
260
pt_iscache_lookup(struct pt_image_section_cache * iscache,struct pt_section ** section,uint64_t * laddr,int isid)261 int pt_iscache_lookup(struct pt_image_section_cache *iscache,
262 struct pt_section **section, uint64_t *laddr, int isid)
263 {
264 if (!iscache || !section || !laddr)
265 return -pte_internal;
266
267 if (!isid || iscache->nsecs < isid)
268 return -pte_bad_image;
269
270 isid -= 1;
271
272 *section = iscache->section[isid];
273 *laddr = iscache->laddr[isid];
274
275 return pt_section_get(*section);
276 }
277
ifix_unmap(struct pt_section * section)278 static int ifix_unmap(struct pt_section *section)
279 {
280 uint16_t mcount;
281
282 if (!section)
283 return -pte_internal;
284
285 mcount = section->mcount;
286 if (!mcount)
287 return -pte_internal;
288
289 if (!section->mapping)
290 return -pte_internal;
291
292 mcount = --section->mcount;
293 if (!mcount)
294 section->mapping = NULL;
295
296 return 0;
297 }
298
ifix_read(const struct pt_section * section,uint8_t * buffer,uint16_t size,uint64_t offset)299 static int ifix_read(const struct pt_section *section, uint8_t *buffer,
300 uint16_t size, uint64_t offset)
301 {
302 struct ifix_mapping *mapping;
303 uint64_t begin, end;
304
305 if (!section || !buffer)
306 return -pte_internal;
307
308 begin = offset;
309 end = begin + size;
310
311 if (end < begin)
312 return -pte_nomap;
313
314 mapping = section->mapping;
315 if (!mapping)
316 return -pte_nomap;
317
318 if (mapping->errcode)
319 return mapping->errcode;
320
321 if (mapping->size <= begin)
322 return -pte_nomap;
323
324 if (mapping->size < end) {
325 end = mapping->size;
326 size = (uint16_t) (end - begin);
327 }
328
329 memcpy(buffer, &mapping->content[begin], size);
330
331 return size;
332 }
333
pt_section_map(struct pt_section * section)334 int pt_section_map(struct pt_section *section)
335 {
336 struct ifix_status *status;
337 uint16_t mcount;
338
339 if (!section)
340 return -pte_internal;
341
342 mcount = section->mcount++;
343 if (mcount)
344 return 0;
345
346 if (section->mapping)
347 return -pte_internal;
348
349 status = section->status;
350 if (!status)
351 return -pte_internal;
352
353 section->mapping = status->mapping;
354 section->unmap = ifix_unmap;
355 section->read = ifix_read;
356
357 return 0;
358 }
359
pt_section_on_map_lock(struct pt_section * section)360 int pt_section_on_map_lock(struct pt_section *section)
361 {
362 if (!section)
363 return -pte_internal;
364
365 return 0;
366 }
367
pt_section_unmap(struct pt_section * section)368 int pt_section_unmap(struct pt_section *section)
369 {
370 if (!section)
371 return -pte_internal;
372
373 if (!section->unmap)
374 return -pte_nomap;
375
376 return section->unmap(section);
377 }
378
pt_section_read(const struct pt_section * section,uint8_t * buffer,uint16_t size,uint64_t offset)379 int pt_section_read(const struct pt_section *section, uint8_t *buffer,
380 uint16_t size, uint64_t offset)
381 {
382 if (!section)
383 return -pte_internal;
384
385 if (!section->read)
386 return -pte_nomap;
387
388 return section->read(section, buffer, size, offset);
389 }
390
391 /* A test read memory callback. */
image_readmem_callback(uint8_t * buffer,size_t size,const struct pt_asid * asid,uint64_t ip,void * context)392 static int image_readmem_callback(uint8_t *buffer, size_t size,
393 const struct pt_asid *asid,
394 uint64_t ip, void *context)
395 {
396 const uint8_t *memory;
397 size_t idx;
398
399 (void) asid;
400
401 if (!buffer)
402 return -pte_invalid;
403
404 /* We use a constant offset of 0x3000. */
405 if (ip < 0x3000ull)
406 return -pte_nomap;
407
408 ip -= 0x3000ull;
409
410 memory = (const uint8_t *) context;
411 if (!memory)
412 return -pte_internal;
413
414 for (idx = 0; idx < size; ++idx)
415 buffer[idx] = memory[ip + idx];
416
417 return (int) idx;
418 }
419
init(void)420 static struct ptunit_result init(void)
421 {
422 struct pt_image image;
423
424 memset(&image, 0xcd, sizeof(image));
425
426 pt_image_init(&image, NULL);
427 ptu_null(image.name);
428 ptu_null(image.sections);
429 ptu_null((void *) (uintptr_t) image.readmem.callback);
430 ptu_null(image.readmem.context);
431
432 return ptu_passed();
433 }
434
init_name(struct image_fixture * ifix)435 static struct ptunit_result init_name(struct image_fixture *ifix)
436 {
437 memset(&ifix->image, 0xcd, sizeof(ifix->image));
438
439 pt_image_init(&ifix->image, "image-name");
440 ptu_str_eq(ifix->image.name, "image-name");
441 ptu_null(ifix->image.sections);
442 ptu_null((void *) (uintptr_t) ifix->image.readmem.callback);
443 ptu_null(ifix->image.readmem.context);
444
445 return ptu_passed();
446 }
447
init_null(void)448 static struct ptunit_result init_null(void)
449 {
450 pt_image_init(NULL, NULL);
451
452 return ptu_passed();
453 }
454
fini(void)455 static struct ptunit_result fini(void)
456 {
457 struct ifix_mapping mapping;
458 struct ifix_status status;
459 struct pt_section section;
460 struct pt_image image;
461 struct pt_asid asid;
462 int errcode;
463
464 pt_asid_init(&asid);
465 ifix_init_section(§ion, NULL, &status, &mapping, NULL);
466
467 pt_image_init(&image, NULL);
468 errcode = pt_image_add(&image, §ion, &asid, 0x0ull, 0);
469 ptu_int_eq(errcode, 0);
470
471 pt_image_fini(&image);
472 ptu_int_eq(section.ucount, 0);
473 ptu_int_eq(section.mcount, 0);
474 ptu_int_eq(status.deleted, 1);
475 ptu_int_eq(status.bad_put, 0);
476
477 return ptu_passed();
478 }
479
fini_empty(void)480 static struct ptunit_result fini_empty(void)
481 {
482 struct pt_image image;
483
484 pt_image_init(&image, NULL);
485 pt_image_fini(&image);
486
487 return ptu_passed();
488 }
489
fini_null(void)490 static struct ptunit_result fini_null(void)
491 {
492 pt_image_fini(NULL);
493
494 return ptu_passed();
495 }
496
name(struct image_fixture * ifix)497 static struct ptunit_result name(struct image_fixture *ifix)
498 {
499 const char *name;
500
501 pt_image_init(&ifix->image, "image-name");
502
503 name = pt_image_name(&ifix->image);
504 ptu_str_eq(name, "image-name");
505
506 return ptu_passed();
507 }
508
name_none(void)509 static struct ptunit_result name_none(void)
510 {
511 struct pt_image image;
512 const char *name;
513
514 pt_image_init(&image, NULL);
515
516 name = pt_image_name(&image);
517 ptu_null(name);
518
519 return ptu_passed();
520 }
521
name_null(void)522 static struct ptunit_result name_null(void)
523 {
524 const char *name;
525
526 name = pt_image_name(NULL);
527 ptu_null(name);
528
529 return ptu_passed();
530 }
531
read_empty(struct image_fixture * ifix)532 static struct ptunit_result read_empty(struct image_fixture *ifix)
533 {
534 struct pt_asid asid;
535 uint8_t buffer[] = { 0xcc, 0xcc };
536 int status, isid;
537
538 pt_asid_init(&asid);
539
540 isid = -1;
541 status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
542 &asid, 0x1000ull);
543 ptu_int_eq(status, -pte_nomap);
544 ptu_int_eq(isid, -1);
545 ptu_uint_eq(buffer[0], 0xcc);
546 ptu_uint_eq(buffer[1], 0xcc);
547
548 return ptu_passed();
549 }
550
overlap_front(struct image_fixture * ifix)551 static struct ptunit_result overlap_front(struct image_fixture *ifix)
552 {
553 uint8_t buffer[] = { 0xcc, 0xcc };
554 int status, isid;
555
556 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
557 0x1001ull, 1);
558 ptu_int_eq(status, 0);
559
560 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
561 0x1000ull, 2);
562 ptu_int_eq(status, 0);
563
564 isid = -1;
565 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
566 0x1010ull);
567 ptu_int_eq(status, 1);
568 ptu_int_eq(isid, 1);
569 ptu_uint_eq(buffer[0], 0x0f);
570 ptu_uint_eq(buffer[1], 0xcc);
571
572 buffer[0] = 0xcc;
573
574 isid = -1;
575 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
576 0x100full);
577 ptu_int_eq(status, 1);
578 ptu_int_eq(isid, 2);
579 ptu_uint_eq(buffer[0], 0x0f);
580 ptu_uint_eq(buffer[1], 0xcc);
581
582 return ptu_passed();
583 }
584
overlap_back(struct image_fixture * ifix)585 static struct ptunit_result overlap_back(struct image_fixture *ifix)
586 {
587 uint8_t buffer[] = { 0xcc, 0xcc };
588 int status, isid;
589
590 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
591 0x1000ull, 1);
592 ptu_int_eq(status, 0);
593
594 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
595 0x1001ull, 2);
596 ptu_int_eq(status, 0);
597
598 isid = -1;
599 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
600 0x1000ull);
601 ptu_int_eq(status, 1);
602 ptu_int_eq(isid, 1);
603 ptu_uint_eq(buffer[0], 0x00);
604 ptu_uint_eq(buffer[1], 0xcc);
605
606 isid = -1;
607 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
608 0x1010ull);
609 ptu_int_eq(status, 1);
610 ptu_int_eq(isid, 2);
611 ptu_uint_eq(buffer[0], 0x0f);
612 ptu_uint_eq(buffer[1], 0xcc);
613
614 isid = -1;
615 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
616 0x1001ull);
617 ptu_int_eq(status, 1);
618 ptu_int_eq(isid, 2);
619 ptu_uint_eq(buffer[0], 0x00);
620 ptu_uint_eq(buffer[1], 0xcc);
621
622 return ptu_passed();
623 }
624
overlap_multiple(struct image_fixture * ifix)625 static struct ptunit_result overlap_multiple(struct image_fixture *ifix)
626 {
627 uint8_t buffer[] = { 0xcc, 0xcc };
628 int status, isid;
629
630 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
631 0x1000ull, 1);
632 ptu_int_eq(status, 0);
633
634 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
635 0x1010ull, 2);
636 ptu_int_eq(status, 0);
637
638 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
639 0x1008ull, 3);
640 ptu_int_eq(status, 0);
641
642 isid = -1;
643 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
644 0x1007ull);
645 ptu_int_eq(status, 1);
646 ptu_int_eq(isid, 1);
647 ptu_uint_eq(buffer[0], 0x07);
648 ptu_uint_eq(buffer[1], 0xcc);
649
650 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
651 0x1008ull);
652 ptu_int_eq(status, 1);
653 ptu_int_eq(isid, 3);
654 ptu_uint_eq(buffer[0], 0x00);
655 ptu_uint_eq(buffer[1], 0xcc);
656
657 isid = -1;
658 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
659 0x1017ull);
660 ptu_int_eq(status, 1);
661 ptu_int_eq(isid, 3);
662 ptu_uint_eq(buffer[0], 0x0f);
663 ptu_uint_eq(buffer[1], 0xcc);
664
665 isid = -1;
666 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
667 0x1018ull);
668 ptu_int_eq(status, 1);
669 ptu_int_eq(isid, 2);
670 ptu_uint_eq(buffer[0], 0x08);
671 ptu_uint_eq(buffer[1], 0xcc);
672
673 return ptu_passed();
674 }
675
overlap_mid(struct image_fixture * ifix)676 static struct ptunit_result overlap_mid(struct image_fixture *ifix)
677 {
678 uint8_t buffer[] = { 0xcc, 0xcc };
679 int status, isid;
680
681 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
682 0x1000ull, 1);
683 ptu_int_eq(status, 0);
684
685 ifix->section[1].size = 0x8;
686 ifix->mapping[1].size = 0x8;
687 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
688 0x1004ull, 2);
689 ptu_int_eq(status, 0);
690
691 isid = -1;
692 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
693 0x1003ull);
694 ptu_int_eq(status, 1);
695 ptu_int_eq(isid, 1);
696 ptu_uint_eq(buffer[0], 0x03);
697 ptu_uint_eq(buffer[1], 0xcc);
698
699 isid = -1;
700 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
701 0x1004ull);
702 ptu_int_eq(status, 1);
703 ptu_int_eq(isid, 2);
704 ptu_uint_eq(buffer[0], 0x00);
705 ptu_uint_eq(buffer[1], 0xcc);
706
707 isid = -1;
708 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
709 0x100bull);
710 ptu_int_eq(status, 1);
711 ptu_int_eq(isid, 2);
712 ptu_uint_eq(buffer[0], 0x07);
713 ptu_uint_eq(buffer[1], 0xcc);
714
715 isid = -1;
716 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
717 0x100cull);
718 ptu_int_eq(status, 1);
719 ptu_int_eq(isid, 1);
720 ptu_uint_eq(buffer[0], 0x0c);
721 ptu_uint_eq(buffer[1], 0xcc);
722
723 return ptu_passed();
724 }
725
contained(struct image_fixture * ifix)726 static struct ptunit_result contained(struct image_fixture *ifix)
727 {
728 uint8_t buffer[] = { 0xcc, 0xcc };
729 int status, isid;
730
731 ifix->section[0].size = 0x8;
732 ifix->mapping[0].size = 0x8;
733 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
734 0x1004ull, 1);
735 ptu_int_eq(status, 0);
736
737 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
738 0x1000ull, 2);
739 ptu_int_eq(status, 0);
740
741 isid = -1;
742 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
743 0x1008ull);
744 ptu_int_eq(status, 1);
745 ptu_int_eq(isid, 2);
746 ptu_uint_eq(buffer[0], 0x08);
747 ptu_uint_eq(buffer[1], 0xcc);
748
749 return ptu_passed();
750 }
751
contained_multiple(struct image_fixture * ifix)752 static struct ptunit_result contained_multiple(struct image_fixture *ifix)
753 {
754 uint8_t buffer[] = { 0xcc, 0xcc };
755 int status, isid;
756
757 ifix->section[0].size = 0x2;
758 ifix->mapping[0].size = 0x2;
759 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
760 0x1004ull, 1);
761 ptu_int_eq(status, 0);
762
763 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
764 0x1008ull, 2);
765 ptu_int_eq(status, 0);
766
767 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
768 0x1000ull, 3);
769 ptu_int_eq(status, 0);
770
771 isid = -1;
772 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
773 0x1004ull);
774 ptu_int_eq(status, 1);
775 ptu_int_eq(isid, 3);
776 ptu_uint_eq(buffer[0], 0x04);
777 ptu_uint_eq(buffer[1], 0xcc);
778
779 isid = -1;
780 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
781 0x1008ull);
782 ptu_int_eq(status, 1);
783 ptu_int_eq(isid, 3);
784 ptu_uint_eq(buffer[0], 0x08);
785 ptu_uint_eq(buffer[1], 0xcc);
786
787 return ptu_passed();
788 }
789
contained_back(struct image_fixture * ifix)790 static struct ptunit_result contained_back(struct image_fixture *ifix)
791 {
792 uint8_t buffer[] = { 0xcc, 0xcc };
793 int status, isid;
794
795 ifix->section[0].size = 0x8;
796 ifix->mapping[0].size = 0x8;
797 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
798 0x1004ull, 1);
799 ptu_int_eq(status, 0);
800
801 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
802 0x100cull, 2);
803 ptu_int_eq(status, 0);
804
805 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
806 0x1000ull, 3);
807 ptu_int_eq(status, 0);
808
809 isid = -1;
810 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
811 0x1004ull);
812 ptu_int_eq(status, 1);
813 ptu_int_eq(isid, 3);
814 ptu_uint_eq(buffer[0], 0x04);
815 ptu_uint_eq(buffer[1], 0xcc);
816
817 isid = -1;
818 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
819 0x100cull);
820 ptu_int_eq(status, 1);
821 ptu_int_eq(isid, 3);
822 ptu_uint_eq(buffer[0], 0x0c);
823 ptu_uint_eq(buffer[1], 0xcc);
824
825 isid = -1;
826 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
827 0x100full);
828 ptu_int_eq(status, 1);
829 ptu_int_eq(isid, 3);
830 ptu_uint_eq(buffer[0], 0x0f);
831 ptu_uint_eq(buffer[1], 0xcc);
832
833 isid = -1;
834 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
835 0x1010ull);
836 ptu_int_eq(status, 1);
837 ptu_int_eq(isid, 2);
838 ptu_uint_eq(buffer[0], 0x04);
839 ptu_uint_eq(buffer[1], 0xcc);
840
841 return ptu_passed();
842 }
843
same(struct image_fixture * ifix)844 static struct ptunit_result same(struct image_fixture *ifix)
845 {
846 uint8_t buffer[] = { 0xcc, 0xcc };
847 int status, isid;
848
849 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
850 0x1000ull, 1);
851 ptu_int_eq(status, 0);
852
853 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
854 0x1000ull, 1);
855 ptu_int_eq(status, 0);
856
857 isid = -1;
858 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
859 0x1008ull);
860 ptu_int_eq(status, 1);
861 ptu_int_eq(isid, 1);
862 ptu_uint_eq(buffer[0], 0x08);
863 ptu_uint_eq(buffer[1], 0xcc);
864
865 return ptu_passed();
866 }
867
same_different_isid(struct image_fixture * ifix)868 static struct ptunit_result same_different_isid(struct image_fixture *ifix)
869 {
870 uint8_t buffer[] = { 0xcc, 0xcc };
871 int status, isid;
872
873 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
874 0x1000ull, 1);
875 ptu_int_eq(status, 0);
876
877 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
878 0x1000ull, 2);
879 ptu_int_eq(status, 0);
880
881 isid = -1;
882 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
883 0x1008ull);
884 ptu_int_eq(status, 1);
885 ptu_int_eq(isid, 2);
886 ptu_uint_eq(buffer[0], 0x08);
887 ptu_uint_eq(buffer[1], 0xcc);
888
889 return ptu_passed();
890 }
891
same_different_offset(struct image_fixture * ifix)892 static struct ptunit_result same_different_offset(struct image_fixture *ifix)
893 {
894 uint8_t buffer[] = { 0xcc, 0xcc }, i;
895 int status, isid, index;
896
897 /* Add another section from a different part of the same file as an
898 * existing section.
899 */
900 index = ifix_add_section(ifix, ifix->section[0].filename);
901 ptu_int_gt(index, 0);
902
903 ifix->section[index].offset = ifix->section[0].offset + 0x10;
904 ptu_uint_eq(ifix->section[index].size, ifix->section[0].size);
905
906 /* Change the content of the new section so we can distinguish them. */
907 for (i = 0; i < ifix->mapping[index].size; ++i)
908 ifix->mapping[index].content[i] += 0x10;
909
910
911 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
912 0x1000ull, 0);
913 ptu_int_eq(status, 0);
914
915 status = pt_image_add(&ifix->image, &ifix->section[index],
916 &ifix->asid[0], 0x1000ull, 0);
917 ptu_int_eq(status, 0);
918
919 isid = -1;
920 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
921 0x1000ull);
922 ptu_int_eq(status, 1);
923 ptu_int_eq(isid, 0);
924 ptu_uint_eq(buffer[0], 0x10);
925 ptu_uint_eq(buffer[1], 0xcc);
926
927 isid = -1;
928 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
929 0x100full);
930 ptu_int_eq(status, 1);
931 ptu_int_eq(isid, 0);
932 ptu_uint_eq(buffer[0], 0x1f);
933 ptu_uint_eq(buffer[1], 0xcc);
934
935 return ptu_passed();
936 }
937
adjacent(struct image_fixture * ifix)938 static struct ptunit_result adjacent(struct image_fixture *ifix)
939 {
940 uint8_t buffer[] = { 0xcc, 0xcc };
941 int status, isid;
942
943 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
944 0x1000ull, 1);
945 ptu_int_eq(status, 0);
946
947 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
948 0x1000ull - ifix->section[1].size, 2);
949 ptu_int_eq(status, 0);
950
951 status = pt_image_add(&ifix->image, &ifix->section[2], &ifix->asid[0],
952 0x1000ull + ifix->section[0].size, 3);
953 ptu_int_eq(status, 0);
954
955 isid = -1;
956 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
957 0x1000ull);
958 ptu_int_eq(status, 1);
959 ptu_int_eq(isid, 1);
960 ptu_uint_eq(buffer[0], 0x00);
961 ptu_uint_eq(buffer[1], 0xcc);
962
963 isid = -1;
964 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
965 0xfffull);
966 ptu_int_eq(status, 1);
967 ptu_int_eq(isid, 2);
968 ptu_uint_eq(buffer[0],
969 ifix->mapping[1].content[ifix->mapping[1].size - 1]);
970 ptu_uint_eq(buffer[1], 0xcc);
971
972 isid = -1;
973 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
974 0x1000ull + ifix->section[0].size);
975 ptu_int_eq(status, 1);
976 ptu_int_eq(isid, 3);
977 ptu_uint_eq(buffer[0], 0x00);
978 ptu_uint_eq(buffer[1], 0xcc);
979
980 return ptu_passed();
981 }
982
read_null(struct image_fixture * ifix)983 static struct ptunit_result read_null(struct image_fixture *ifix)
984 {
985 uint8_t buffer;
986 int status, isid;
987
988 status = pt_image_read(NULL, &isid, &buffer, 1, &ifix->asid[0],
989 0x1000ull);
990 ptu_int_eq(status, -pte_internal);
991
992 status = pt_image_read(&ifix->image, NULL, &buffer, 1, &ifix->asid[0],
993 0x1000ull);
994 ptu_int_eq(status, -pte_internal);
995
996 status = pt_image_read(&ifix->image, &isid, NULL, 1, &ifix->asid[0],
997 0x1000ull);
998 ptu_int_eq(status, -pte_internal);
999
1000 status = pt_image_read(&ifix->image, &isid, &buffer, 1, NULL,
1001 0x1000ull);
1002 ptu_int_eq(status, -pte_internal);
1003
1004 return ptu_passed();
1005 }
1006
read(struct image_fixture * ifix)1007 static struct ptunit_result read(struct image_fixture *ifix)
1008 {
1009 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1010 int status, isid;
1011
1012 isid = -1;
1013 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
1014 0x2003ull);
1015 ptu_int_eq(status, 2);
1016 ptu_int_eq(isid, 11);
1017 ptu_uint_eq(buffer[0], 0x03);
1018 ptu_uint_eq(buffer[1], 0x04);
1019 ptu_uint_eq(buffer[2], 0xcc);
1020
1021 return ptu_passed();
1022 }
1023
read_asid(struct image_fixture * ifix)1024 static struct ptunit_result read_asid(struct image_fixture *ifix)
1025 {
1026 uint8_t buffer[] = { 0xcc, 0xcc };
1027 int status, isid;
1028
1029 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
1030 0x1000ull, 1);
1031 ptu_int_eq(status, 0);
1032
1033 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[1],
1034 0x1008ull, 2);
1035 ptu_int_eq(status, 0);
1036
1037 isid = -1;
1038 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
1039 0x1009ull);
1040 ptu_int_eq(status, 1);
1041 ptu_int_eq(isid, 1);
1042 ptu_uint_eq(buffer[0], 0x09);
1043 ptu_uint_eq(buffer[1], 0xcc);
1044
1045 isid = -1;
1046 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[1],
1047 0x1009ull);
1048 ptu_int_eq(status, 1);
1049 ptu_int_eq(isid, 2);
1050 ptu_uint_eq(buffer[0], 0x01);
1051 ptu_uint_eq(buffer[1], 0xcc);
1052
1053 return ptu_passed();
1054 }
1055
read_bad_asid(struct image_fixture * ifix)1056 static struct ptunit_result read_bad_asid(struct image_fixture *ifix)
1057 {
1058 uint8_t buffer[] = { 0xcc, 0xcc };
1059 int status, isid;
1060
1061 isid = -1;
1062 status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
1063 &ifix->asid[0], 0x2003ull);
1064 ptu_int_eq(status, -pte_nomap);
1065 ptu_int_eq(isid, -1);
1066 ptu_uint_eq(buffer[0], 0xcc);
1067 ptu_uint_eq(buffer[1], 0xcc);
1068
1069 return ptu_passed();
1070 }
1071
read_null_asid(struct image_fixture * ifix)1072 static struct ptunit_result read_null_asid(struct image_fixture *ifix)
1073 {
1074 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1075 int status, isid;
1076
1077 isid = -1;
1078 status = pt_image_read(&ifix->image, &isid, buffer, 2, NULL, 0x2003ull);
1079 ptu_int_eq(status, -pte_internal);
1080 ptu_int_eq(isid, -1);
1081 ptu_uint_eq(buffer[0], 0xcc);
1082 ptu_uint_eq(buffer[1], 0xcc);
1083
1084 return ptu_passed();
1085 }
1086
read_callback(struct image_fixture * ifix)1087 static struct ptunit_result read_callback(struct image_fixture *ifix)
1088 {
1089 uint8_t memory[] = { 0xdd, 0x01, 0x02, 0xdd };
1090 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1091 int status, isid;
1092
1093 status = pt_image_set_callback(&ifix->image, image_readmem_callback,
1094 memory);
1095 ptu_int_eq(status, 0);
1096
1097 isid = -1;
1098 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1099 0x3001ull);
1100 ptu_int_eq(status, 2);
1101 ptu_int_eq(isid, 0);
1102 ptu_uint_eq(buffer[0], 0x01);
1103 ptu_uint_eq(buffer[1], 0x02);
1104 ptu_uint_eq(buffer[2], 0xcc);
1105
1106 return ptu_passed();
1107 }
1108
read_nomem(struct image_fixture * ifix)1109 static struct ptunit_result read_nomem(struct image_fixture *ifix)
1110 {
1111 uint8_t buffer[] = { 0xcc, 0xcc };
1112 int status, isid;
1113
1114 isid = -1;
1115 status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
1116 &ifix->asid[1], 0x1010ull);
1117 ptu_int_eq(status, -pte_nomap);
1118 ptu_int_eq(isid, -1);
1119 ptu_uint_eq(buffer[0], 0xcc);
1120 ptu_uint_eq(buffer[1], 0xcc);
1121
1122 return ptu_passed();
1123 }
1124
read_truncated(struct image_fixture * ifix)1125 static struct ptunit_result read_truncated(struct image_fixture *ifix)
1126 {
1127 uint8_t buffer[] = { 0xcc, 0xcc };
1128 int status, isid;
1129
1130 isid = -1;
1131 status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
1132 &ifix->asid[0], 0x100full);
1133 ptu_int_eq(status, 1);
1134 ptu_int_eq(isid, 10);
1135 ptu_uint_eq(buffer[0], 0x0f);
1136 ptu_uint_eq(buffer[1], 0xcc);
1137
1138 return ptu_passed();
1139 }
1140
read_error(struct image_fixture * ifix)1141 static struct ptunit_result read_error(struct image_fixture *ifix)
1142 {
1143 uint8_t buffer[] = { 0xcc };
1144 int status, isid;
1145
1146 ifix->mapping[0].errcode = -pte_nosync;
1147
1148 isid = -1;
1149 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
1150 0x1000ull);
1151 ptu_int_eq(status, -pte_nosync);
1152 ptu_int_eq(isid, 10);
1153 ptu_uint_eq(buffer[0], 0xcc);
1154
1155 return ptu_passed();
1156 }
1157
read_spurious_error(struct image_fixture * ifix)1158 static struct ptunit_result read_spurious_error(struct image_fixture *ifix)
1159 {
1160 uint8_t buffer[] = { 0xcc, 0xcc };
1161 int status, isid;
1162
1163 isid = -1;
1164 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
1165 0x1000ull);
1166 ptu_int_eq(status, 1);
1167 ptu_int_eq(isid, 10);
1168 ptu_uint_eq(buffer[0], 0x00);
1169 ptu_uint_eq(buffer[1], 0xcc);
1170
1171 ifix->mapping[0].errcode = -pte_nosync;
1172
1173 isid = -1;
1174 status = pt_image_read(&ifix->image, &isid, buffer, 1, &ifix->asid[0],
1175 0x1005ull);
1176 ptu_int_eq(status, -pte_nosync);
1177 ptu_int_eq(isid, 10);
1178 ptu_uint_eq(buffer[0], 0x00);
1179
1180 return ptu_passed();
1181 }
1182
remove_section(struct image_fixture * ifix)1183 static struct ptunit_result remove_section(struct image_fixture *ifix)
1184 {
1185 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1186 int status, isid;
1187
1188 isid = -1;
1189 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1190 0x1001ull);
1191 ptu_int_eq(status, 2);
1192 ptu_int_eq(isid, 10);
1193 ptu_uint_eq(buffer[0], 0x01);
1194 ptu_uint_eq(buffer[1], 0x02);
1195 ptu_uint_eq(buffer[2], 0xcc);
1196
1197 status = pt_image_remove(&ifix->image, &ifix->section[0],
1198 &ifix->asid[0], 0x1000ull);
1199 ptu_int_eq(status, 0);
1200
1201 ptu_int_ne(ifix->status[0].deleted, 0);
1202 ptu_int_eq(ifix->status[1].deleted, 0);
1203
1204 isid = -1;
1205 status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
1206 &ifix->asid[0], 0x1003ull);
1207 ptu_int_eq(status, -pte_nomap);
1208 ptu_int_eq(isid, -1);
1209 ptu_uint_eq(buffer[0], 0x01);
1210 ptu_uint_eq(buffer[1], 0x02);
1211 ptu_uint_eq(buffer[2], 0xcc);
1212
1213 isid = -1;
1214 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
1215 0x2003ull);
1216 ptu_int_eq(status, 2);
1217 ptu_int_eq(isid, 11);
1218 ptu_uint_eq(buffer[0], 0x03);
1219 ptu_uint_eq(buffer[1], 0x04);
1220 ptu_uint_eq(buffer[2], 0xcc);
1221
1222 return ptu_passed();
1223 }
1224
remove_bad_vaddr(struct image_fixture * ifix)1225 static struct ptunit_result remove_bad_vaddr(struct image_fixture *ifix)
1226 {
1227 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1228 int status, isid;
1229
1230 isid = -1;
1231 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1232 0x1001ull);
1233 ptu_int_eq(status, 2);
1234 ptu_int_eq(isid, 10);
1235 ptu_uint_eq(buffer[0], 0x01);
1236 ptu_uint_eq(buffer[1], 0x02);
1237 ptu_uint_eq(buffer[2], 0xcc);
1238
1239 status = pt_image_remove(&ifix->image, &ifix->section[0],
1240 &ifix->asid[0], 0x2000ull);
1241 ptu_int_eq(status, -pte_bad_image);
1242
1243 ptu_int_eq(ifix->status[0].deleted, 0);
1244 ptu_int_eq(ifix->status[1].deleted, 0);
1245
1246 isid = -1;
1247 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1248 0x1003ull);
1249 ptu_int_eq(status, 2);
1250 ptu_int_eq(isid, 10);
1251 ptu_uint_eq(buffer[0], 0x03);
1252 ptu_uint_eq(buffer[1], 0x04);
1253 ptu_uint_eq(buffer[2], 0xcc);
1254
1255 isid = -1;
1256 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
1257 0x2005ull);
1258 ptu_int_eq(status, 2);
1259 ptu_int_eq(isid, 11);
1260 ptu_uint_eq(buffer[0], 0x05);
1261 ptu_uint_eq(buffer[1], 0x06);
1262 ptu_uint_eq(buffer[2], 0xcc);
1263
1264 return ptu_passed();
1265 }
1266
remove_bad_asid(struct image_fixture * ifix)1267 static struct ptunit_result remove_bad_asid(struct image_fixture *ifix)
1268 {
1269 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1270 int status, isid;
1271
1272 isid = -1;
1273 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1274 0x1001ull);
1275 ptu_int_eq(status, 2);
1276 ptu_int_eq(isid, 10);
1277 ptu_uint_eq(buffer[0], 0x01);
1278 ptu_uint_eq(buffer[1], 0x02);
1279 ptu_uint_eq(buffer[2], 0xcc);
1280
1281 status = pt_image_remove(&ifix->image, &ifix->section[0],
1282 &ifix->asid[1], 0x1000ull);
1283 ptu_int_eq(status, -pte_bad_image);
1284
1285 ptu_int_eq(ifix->status[0].deleted, 0);
1286 ptu_int_eq(ifix->status[1].deleted, 0);
1287
1288 isid = -1;
1289 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1290 0x1003ull);
1291 ptu_int_eq(status, 2);
1292 ptu_int_eq(isid, 10);
1293 ptu_uint_eq(buffer[0], 0x03);
1294 ptu_uint_eq(buffer[1], 0x04);
1295 ptu_uint_eq(buffer[2], 0xcc);
1296
1297 isid = -1;
1298 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
1299 0x2005ull);
1300 ptu_int_eq(status, 2);
1301 ptu_int_eq(isid, 11);
1302 ptu_uint_eq(buffer[0], 0x05);
1303 ptu_uint_eq(buffer[1], 0x06);
1304 ptu_uint_eq(buffer[2], 0xcc);
1305
1306 return ptu_passed();
1307 }
1308
remove_by_filename(struct image_fixture * ifix)1309 static struct ptunit_result remove_by_filename(struct image_fixture *ifix)
1310 {
1311 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1312 int status, isid;
1313
1314 isid = -1;
1315 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1316 0x1001ull);
1317 ptu_int_eq(status, 2);
1318 ptu_int_eq(isid, 10);
1319 ptu_uint_eq(buffer[0], 0x01);
1320 ptu_uint_eq(buffer[1], 0x02);
1321 ptu_uint_eq(buffer[2], 0xcc);
1322
1323 status = pt_image_remove_by_filename(&ifix->image,
1324 ifix->section[0].filename,
1325 &ifix->asid[0]);
1326 ptu_int_eq(status, 1);
1327
1328 ptu_int_ne(ifix->status[0].deleted, 0);
1329 ptu_int_eq(ifix->status[1].deleted, 0);
1330
1331 isid = -1;
1332 status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
1333 &ifix->asid[0], 0x1003ull);
1334 ptu_int_eq(status, -pte_nomap);
1335 ptu_int_eq(isid, -1);
1336 ptu_uint_eq(buffer[0], 0x01);
1337 ptu_uint_eq(buffer[1], 0x02);
1338 ptu_uint_eq(buffer[2], 0xcc);
1339
1340 isid = -1;
1341 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
1342 0x2003ull);
1343 ptu_int_eq(status, 2);
1344 ptu_int_eq(isid, 11);
1345 ptu_uint_eq(buffer[0], 0x03);
1346 ptu_uint_eq(buffer[1], 0x04);
1347 ptu_uint_eq(buffer[2], 0xcc);
1348
1349 return ptu_passed();
1350 }
1351
1352 static struct ptunit_result
remove_by_filename_bad_asid(struct image_fixture * ifix)1353 remove_by_filename_bad_asid(struct image_fixture *ifix)
1354 {
1355 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1356 int status, isid;
1357
1358 isid = -1;
1359 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1360 0x1001ull);
1361 ptu_int_eq(status, 2);
1362 ptu_int_eq(isid, 10);
1363 ptu_uint_eq(buffer[0], 0x01);
1364 ptu_uint_eq(buffer[1], 0x02);
1365 ptu_uint_eq(buffer[2], 0xcc);
1366
1367 status = pt_image_remove_by_filename(&ifix->image,
1368 ifix->section[0].filename,
1369 &ifix->asid[1]);
1370 ptu_int_eq(status, 0);
1371
1372 ptu_int_eq(ifix->status[0].deleted, 0);
1373 ptu_int_eq(ifix->status[1].deleted, 0);
1374
1375 isid = -1;
1376 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1377 0x1003ull);
1378 ptu_int_eq(status, 2);
1379 ptu_int_eq(isid, 10);
1380 ptu_uint_eq(buffer[0], 0x03);
1381 ptu_uint_eq(buffer[1], 0x04);
1382 ptu_uint_eq(buffer[2], 0xcc);
1383
1384 isid = -1;
1385 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
1386 0x2005ull);
1387 ptu_int_eq(status, 2);
1388 ptu_int_eq(isid, 11);
1389 ptu_uint_eq(buffer[0], 0x05);
1390 ptu_uint_eq(buffer[1], 0x06);
1391 ptu_uint_eq(buffer[2], 0xcc);
1392
1393 return ptu_passed();
1394 }
1395
remove_none_by_filename(struct image_fixture * ifix)1396 static struct ptunit_result remove_none_by_filename(struct image_fixture *ifix)
1397 {
1398 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1399 int status, isid;
1400
1401 status = pt_image_remove_by_filename(&ifix->image, "bad-name",
1402 &ifix->asid[0]);
1403 ptu_int_eq(status, 0);
1404
1405 ptu_int_eq(ifix->status[0].deleted, 0);
1406 ptu_int_eq(ifix->status[1].deleted, 0);
1407
1408 isid = -1;
1409 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1410 0x1003ull);
1411 ptu_int_eq(status, 2);
1412 ptu_int_eq(isid, 10);
1413 ptu_uint_eq(buffer[0], 0x03);
1414 ptu_uint_eq(buffer[1], 0x04);
1415 ptu_uint_eq(buffer[2], 0xcc);
1416
1417 isid = -1;
1418 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
1419 0x2001ull);
1420 ptu_int_eq(status, 2);
1421 ptu_int_eq(isid, 11);
1422 ptu_uint_eq(buffer[0], 0x01);
1423 ptu_uint_eq(buffer[1], 0x02);
1424 ptu_uint_eq(buffer[2], 0xcc);
1425
1426 return ptu_passed();
1427 }
1428
remove_all_by_filename(struct image_fixture * ifix)1429 static struct ptunit_result remove_all_by_filename(struct image_fixture *ifix)
1430 {
1431 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1432 int status, isid;
1433
1434 ifix->section[0].filename = "same-name";
1435 ifix->section[1].filename = "same-name";
1436
1437 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
1438 0x1000ull, 1);
1439 ptu_int_eq(status, 0);
1440
1441 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
1442 0x2000ull, 2);
1443 ptu_int_eq(status, 0);
1444
1445 isid = -1;
1446 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1447 0x1001ull);
1448 ptu_int_eq(status, 2);
1449 ptu_int_eq(isid, 1);
1450 ptu_uint_eq(buffer[0], 0x01);
1451 ptu_uint_eq(buffer[1], 0x02);
1452 ptu_uint_eq(buffer[2], 0xcc);
1453
1454 status = pt_image_remove_by_filename(&ifix->image, "same-name",
1455 &ifix->asid[0]);
1456 ptu_int_eq(status, 2);
1457
1458 ptu_int_ne(ifix->status[0].deleted, 0);
1459 ptu_int_ne(ifix->status[1].deleted, 0);
1460
1461 isid = -1;
1462 status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
1463 &ifix->asid[0], 0x1003ull);
1464 ptu_int_eq(status, -pte_nomap);
1465 ptu_int_eq(isid, -1);
1466 ptu_uint_eq(buffer[0], 0x01);
1467 ptu_uint_eq(buffer[1], 0x02);
1468 ptu_uint_eq(buffer[2], 0xcc);
1469
1470 isid = -1;
1471 status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
1472 &ifix->asid[0], 0x2003ull);
1473 ptu_int_eq(status, -pte_nomap);
1474 ptu_int_eq(isid, -1);
1475 ptu_uint_eq(buffer[0], 0x01);
1476 ptu_uint_eq(buffer[1], 0x02);
1477 ptu_uint_eq(buffer[2], 0xcc);
1478
1479 return ptu_passed();
1480 }
1481
remove_by_asid(struct image_fixture * ifix)1482 static struct ptunit_result remove_by_asid(struct image_fixture *ifix)
1483 {
1484 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1485 int status, isid;
1486
1487 isid = -1;
1488 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1489 0x1001ull);
1490 ptu_int_eq(status, 2);
1491 ptu_int_eq(isid, 10);
1492 ptu_uint_eq(buffer[0], 0x01);
1493 ptu_uint_eq(buffer[1], 0x02);
1494 ptu_uint_eq(buffer[2], 0xcc);
1495
1496 status = pt_image_remove_by_asid(&ifix->image, &ifix->asid[0]);
1497 ptu_int_eq(status, 1);
1498
1499 ptu_int_ne(ifix->status[0].deleted, 0);
1500 ptu_int_eq(ifix->status[1].deleted, 0);
1501
1502 isid = -1;
1503 status = pt_image_read(&ifix->image, &isid, buffer, sizeof(buffer),
1504 &ifix->asid[0], 0x1003ull);
1505 ptu_int_eq(status, -pte_nomap);
1506 ptu_int_eq(isid, -1);
1507 ptu_uint_eq(buffer[0], 0x01);
1508 ptu_uint_eq(buffer[1], 0x02);
1509 ptu_uint_eq(buffer[2], 0xcc);
1510
1511 isid = -1;
1512 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
1513 0x2003ull);
1514 ptu_int_eq(status, 2);
1515 ptu_int_eq(isid, 11);
1516 ptu_uint_eq(buffer[0], 0x03);
1517 ptu_uint_eq(buffer[1], 0x04);
1518 ptu_uint_eq(buffer[2], 0xcc);
1519
1520 return ptu_passed();
1521 }
1522
copy_empty(struct image_fixture * ifix)1523 static struct ptunit_result copy_empty(struct image_fixture *ifix)
1524 {
1525 struct pt_asid asid;
1526 uint8_t buffer[] = { 0xcc, 0xcc };
1527 int status, isid;
1528
1529 pt_asid_init(&asid);
1530
1531 status = pt_image_copy(&ifix->copy, &ifix->image);
1532 ptu_int_eq(status, 0);
1533
1534 isid = -1;
1535 status = pt_image_read(&ifix->copy, &isid, buffer, sizeof(buffer),
1536 &asid, 0x1000ull);
1537 ptu_int_eq(status, -pte_nomap);
1538 ptu_int_eq(isid, -1);
1539 ptu_uint_eq(buffer[0], 0xcc);
1540 ptu_uint_eq(buffer[1], 0xcc);
1541
1542 return ptu_passed();
1543 }
1544
copy(struct image_fixture * ifix)1545 static struct ptunit_result copy(struct image_fixture *ifix)
1546 {
1547 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1548 int status, isid;
1549
1550 status = pt_image_copy(&ifix->copy, &ifix->image);
1551 ptu_int_eq(status, 0);
1552
1553 isid = -1;
1554 status = pt_image_read(&ifix->copy, &isid, buffer, 2, &ifix->asid[1],
1555 0x2003ull);
1556 ptu_int_eq(status, 2);
1557 ptu_int_eq(isid, 11);
1558 ptu_uint_eq(buffer[0], 0x03);
1559 ptu_uint_eq(buffer[1], 0x04);
1560 ptu_uint_eq(buffer[2], 0xcc);
1561
1562 return ptu_passed();
1563 }
1564
copy_self(struct image_fixture * ifix)1565 static struct ptunit_result copy_self(struct image_fixture *ifix)
1566 {
1567 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1568 int status, isid;
1569
1570 status = pt_image_copy(&ifix->image, &ifix->image);
1571 ptu_int_eq(status, 0);
1572
1573 isid = -1;
1574 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[1],
1575 0x2003ull);
1576 ptu_int_eq(status, 2);
1577 ptu_int_eq(isid, 11);
1578 ptu_uint_eq(buffer[0], 0x03);
1579 ptu_uint_eq(buffer[1], 0x04);
1580 ptu_uint_eq(buffer[2], 0xcc);
1581
1582 return ptu_passed();
1583 }
1584
copy_shrink(struct image_fixture * ifix)1585 static struct ptunit_result copy_shrink(struct image_fixture *ifix)
1586 {
1587 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1588 int status, isid;
1589
1590 status = pt_image_add(&ifix->copy, &ifix->section[1], &ifix->asid[1],
1591 0x2000ull, 1);
1592 ptu_int_eq(status, 0);
1593
1594 status = pt_image_copy(&ifix->copy, &ifix->image);
1595 ptu_int_eq(status, 0);
1596
1597 isid = -1;
1598 status = pt_image_read(&ifix->copy, &isid, buffer, 2, &ifix->asid[1],
1599 0x2003ull);
1600 ptu_int_eq(status, 2);
1601 ptu_int_eq(isid, 11);
1602 ptu_uint_eq(buffer[0], 0x03);
1603 ptu_uint_eq(buffer[1], 0x04);
1604 ptu_uint_eq(buffer[2], 0xcc);
1605
1606 return ptu_passed();
1607 }
1608
copy_split(struct image_fixture * ifix)1609 static struct ptunit_result copy_split(struct image_fixture *ifix)
1610 {
1611 uint8_t buffer[] = { 0xcc, 0xcc };
1612 int status, isid;
1613
1614 status = pt_image_add(&ifix->copy, &ifix->section[0], &ifix->asid[0],
1615 0x2000ull, 1);
1616 ptu_int_eq(status, 0);
1617
1618 ifix->section[1].size = 0x7;
1619 ifix->mapping[1].size = 0x7;
1620
1621 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
1622 0x2001ull, 2);
1623 ptu_int_eq(status, 0);
1624
1625 ifix->section[2].size = 0x8;
1626 ifix->mapping[2].size = 0x8;
1627
1628 status = pt_image_add(&ifix->image, &ifix->section[2], &ifix->asid[0],
1629 0x2008ull, 3);
1630 ptu_int_eq(status, 0);
1631
1632 status = pt_image_copy(&ifix->copy, &ifix->image);
1633 ptu_int_eq(status, 0);
1634
1635 isid = -1;
1636 status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
1637 0x2003ull);
1638 ptu_int_eq(status, 1);
1639 ptu_int_eq(isid, 2);
1640 ptu_uint_eq(buffer[0], 0x02);
1641 ptu_uint_eq(buffer[1], 0xcc);
1642
1643 isid = -1;
1644 status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
1645 0x2009ull);
1646 ptu_int_eq(status, 1);
1647 ptu_int_eq(isid, 3);
1648 ptu_uint_eq(buffer[0], 0x01);
1649 ptu_uint_eq(buffer[1], 0xcc);
1650
1651 isid = -1;
1652 status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
1653 0x2000ull);
1654 ptu_int_eq(status, 1);
1655 ptu_int_eq(isid, 1);
1656 ptu_uint_eq(buffer[0], 0x00);
1657 ptu_uint_eq(buffer[1], 0xcc);
1658
1659 return ptu_passed();
1660 }
1661
copy_merge(struct image_fixture * ifix)1662 static struct ptunit_result copy_merge(struct image_fixture *ifix)
1663 {
1664 uint8_t buffer[] = { 0xcc, 0xcc };
1665 int status, isid;
1666
1667 ifix->section[1].size = 0x8;
1668 ifix->mapping[1].size = 0x8;
1669
1670 status = pt_image_add(&ifix->copy, &ifix->section[1], &ifix->asid[0],
1671 0x2000ull, 1);
1672 ptu_int_eq(status, 0);
1673
1674 ifix->section[2].size = 0x8;
1675 ifix->mapping[2].size = 0x8;
1676
1677 status = pt_image_add(&ifix->copy, &ifix->section[2], &ifix->asid[0],
1678 0x2008ull, 2);
1679 ptu_int_eq(status, 0);
1680
1681 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
1682 0x2000ull, 3);
1683 ptu_int_eq(status, 0);
1684
1685 status = pt_image_copy(&ifix->copy, &ifix->image);
1686 ptu_int_eq(status, 0);
1687
1688 isid = -1;
1689 status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
1690 0x2003ull);
1691 ptu_int_eq(status, 1);
1692 ptu_int_eq(isid, 3);
1693 ptu_uint_eq(buffer[0], 0x03);
1694 ptu_uint_eq(buffer[1], 0xcc);
1695
1696 isid = -1;
1697 status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
1698 0x200aull);
1699 ptu_int_eq(status, 1);
1700 ptu_int_eq(isid, 3);
1701 ptu_uint_eq(buffer[0], 0x0a);
1702 ptu_uint_eq(buffer[1], 0xcc);
1703
1704 return ptu_passed();
1705 }
1706
copy_overlap(struct image_fixture * ifix)1707 static struct ptunit_result copy_overlap(struct image_fixture *ifix)
1708 {
1709 uint8_t buffer[] = { 0xcc, 0xcc };
1710 int status, isid;
1711
1712 status = pt_image_add(&ifix->copy, &ifix->section[0], &ifix->asid[0],
1713 0x2000ull, 1);
1714 ptu_int_eq(status, 0);
1715
1716 status = pt_image_add(&ifix->copy, &ifix->section[1], &ifix->asid[0],
1717 0x2010ull, 2);
1718 ptu_int_eq(status, 0);
1719
1720 status = pt_image_add(&ifix->image, &ifix->section[2], &ifix->asid[0],
1721 0x2008ull, 3);
1722 ptu_int_eq(status, 0);
1723
1724 status = pt_image_copy(&ifix->copy, &ifix->image);
1725 ptu_int_eq(status, 0);
1726
1727 isid = -1;
1728 status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
1729 0x2003ull);
1730 ptu_int_eq(status, 1);
1731 ptu_int_eq(isid, 1);
1732 ptu_uint_eq(buffer[0], 0x03);
1733 ptu_uint_eq(buffer[1], 0xcc);
1734
1735 isid = -1;
1736 status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
1737 0x200aull);
1738 ptu_int_eq(status, 1);
1739 ptu_int_eq(isid, 3);
1740 ptu_uint_eq(buffer[0], 0x02);
1741 ptu_uint_eq(buffer[1], 0xcc);
1742
1743 isid = -1;
1744 status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
1745 0x2016ull);
1746 ptu_int_eq(status, 1);
1747 ptu_int_eq(isid, 3);
1748 ptu_uint_eq(buffer[0], 0x0e);
1749 ptu_uint_eq(buffer[1], 0xcc);
1750
1751 isid = -1;
1752 status = pt_image_read(&ifix->copy, &isid, buffer, 1, &ifix->asid[0],
1753 0x2019ull);
1754 ptu_int_eq(status, 1);
1755 ptu_int_eq(isid, 2);
1756 ptu_uint_eq(buffer[0], 0x09);
1757 ptu_uint_eq(buffer[1], 0xcc);
1758
1759 return ptu_passed();
1760 }
1761
copy_replace(struct image_fixture * ifix)1762 static struct ptunit_result copy_replace(struct image_fixture *ifix)
1763 {
1764 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1765 int status, isid;
1766
1767 ifix->section[0].size = 0x8;
1768 ifix->mapping[0].size = 0x8;
1769
1770 status = pt_image_add(&ifix->copy, &ifix->section[0], &ifix->asid[0],
1771 0x1004ull, 1);
1772 ptu_int_eq(status, 0);
1773
1774 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0],
1775 0x1000ull, 2);
1776 ptu_int_eq(status, 0);
1777
1778 status = pt_image_copy(&ifix->copy, &ifix->image);
1779 ptu_int_eq(status, 0);
1780
1781 isid = -1;
1782 status = pt_image_read(&ifix->copy, &isid, buffer, 2, &ifix->asid[0],
1783 0x1003ull);
1784 ptu_int_eq(status, 2);
1785 ptu_int_eq(isid, 2);
1786 ptu_uint_eq(buffer[0], 0x03);
1787 ptu_uint_eq(buffer[1], 0x04);
1788 ptu_uint_eq(buffer[2], 0xcc);
1789
1790 return ptu_passed();
1791 }
1792
add_cached_null(void)1793 static struct ptunit_result add_cached_null(void)
1794 {
1795 struct pt_image_section_cache iscache;
1796 struct pt_image image;
1797 int status;
1798
1799 status = pt_image_add_cached(NULL, &iscache, 0, NULL);
1800 ptu_int_eq(status, -pte_invalid);
1801
1802 status = pt_image_add_cached(&image, NULL, 0, NULL);
1803 ptu_int_eq(status, -pte_invalid);
1804
1805 return ptu_passed();
1806 }
1807
add_cached(struct image_fixture * ifix)1808 static struct ptunit_result add_cached(struct image_fixture *ifix)
1809 {
1810 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1811 int status, isid, risid;
1812
1813 isid = ifix_cache_section(ifix, &ifix->section[0], 0x1000ull);
1814 ptu_int_gt(isid, 0);
1815
1816 status = pt_image_add_cached(&ifix->image, &ifix->iscache, isid,
1817 &ifix->asid[0]);
1818 ptu_int_eq(status, 0);
1819
1820 risid = -1;
1821 status = pt_image_read(&ifix->image, &risid, buffer, 2, &ifix->asid[0],
1822 0x1003ull);
1823 ptu_int_eq(status, 2);
1824 ptu_int_eq(risid, isid);
1825 ptu_uint_eq(buffer[0], 0x03);
1826 ptu_uint_eq(buffer[1], 0x04);
1827 ptu_uint_eq(buffer[2], 0xcc);
1828
1829 return ptu_passed();
1830 }
1831
add_cached_null_asid(struct image_fixture * ifix)1832 static struct ptunit_result add_cached_null_asid(struct image_fixture *ifix)
1833 {
1834 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1835 int status, isid, risid;
1836
1837 isid = ifix_cache_section(ifix, &ifix->section[0], 0x1000ull);
1838 ptu_int_gt(isid, 0);
1839
1840 status = pt_image_add_cached(&ifix->image, &ifix->iscache, isid, NULL);
1841 ptu_int_eq(status, 0);
1842
1843 risid = -1;
1844 status = pt_image_read(&ifix->image, &risid, buffer, 2, &ifix->asid[0],
1845 0x1003ull);
1846 ptu_int_eq(status, 2);
1847 ptu_int_eq(risid, isid);
1848 ptu_uint_eq(buffer[0], 0x03);
1849 ptu_uint_eq(buffer[1], 0x04);
1850 ptu_uint_eq(buffer[2], 0xcc);
1851
1852 return ptu_passed();
1853 }
1854
add_cached_twice(struct image_fixture * ifix)1855 static struct ptunit_result add_cached_twice(struct image_fixture *ifix)
1856 {
1857 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1858 int status, isid, risid;
1859
1860 isid = ifix_cache_section(ifix, &ifix->section[0], 0x1000ull);
1861 ptu_int_gt(isid, 0);
1862
1863 status = pt_image_add_cached(&ifix->image, &ifix->iscache, isid,
1864 &ifix->asid[0]);
1865 ptu_int_eq(status, 0);
1866
1867 status = pt_image_add_cached(&ifix->image, &ifix->iscache, isid,
1868 &ifix->asid[0]);
1869 ptu_int_eq(status, 0);
1870
1871 risid = -1;
1872 status = pt_image_read(&ifix->image, &risid, buffer, 2, &ifix->asid[0],
1873 0x1003ull);
1874 ptu_int_eq(status, 2);
1875 ptu_int_eq(risid, isid);
1876 ptu_uint_eq(buffer[0], 0x03);
1877 ptu_uint_eq(buffer[1], 0x04);
1878 ptu_uint_eq(buffer[2], 0xcc);
1879
1880 return ptu_passed();
1881 }
1882
add_cached_bad_isid(struct image_fixture * ifix)1883 static struct ptunit_result add_cached_bad_isid(struct image_fixture *ifix)
1884 {
1885 uint8_t buffer[] = { 0xcc, 0xcc, 0xcc };
1886 int status, isid;
1887
1888 status = pt_image_add_cached(&ifix->image, &ifix->iscache, 1,
1889 &ifix->asid[0]);
1890 ptu_int_eq(status, -pte_bad_image);
1891
1892 isid = -1;
1893 status = pt_image_read(&ifix->image, &isid, buffer, 2, &ifix->asid[0],
1894 0x1003ull);
1895 ptu_int_eq(status, -pte_nomap);
1896 ptu_int_eq(isid, -1);
1897
1898 return ptu_passed();
1899 }
1900
find_null(struct image_fixture * ifix)1901 static struct ptunit_result find_null(struct image_fixture *ifix)
1902 {
1903 struct pt_mapped_section msec;
1904 int status;
1905
1906 status = pt_image_find(NULL, &msec, &ifix->asid[0],
1907 0x1000ull);
1908 ptu_int_eq(status, -pte_internal);
1909
1910 status = pt_image_find(&ifix->image, NULL, &ifix->asid[0],
1911 0x1000ull);
1912 ptu_int_eq(status, -pte_internal);
1913
1914 status = pt_image_find(&ifix->image, &msec, NULL, 0x1000ull);
1915 ptu_int_eq(status, -pte_internal);
1916
1917 return ptu_passed();
1918 }
1919
find(struct image_fixture * ifix)1920 static struct ptunit_result find(struct image_fixture *ifix)
1921 {
1922 struct pt_mapped_section msec;
1923 int status;
1924
1925 status = pt_image_find(&ifix->image, &msec, &ifix->asid[1], 0x2003ull);
1926 ptu_int_eq(status, 11);
1927 ptu_ptr_eq(msec.section, &ifix->section[1]);
1928 ptu_uint_eq(msec.vaddr, 0x2000ull);
1929
1930 status = pt_section_put(msec.section);
1931 ptu_int_eq(status, 0);
1932
1933 return ptu_passed();
1934 }
1935
find_asid(struct image_fixture * ifix)1936 static struct ptunit_result find_asid(struct image_fixture *ifix)
1937 {
1938 struct pt_mapped_section msec;
1939 int status;
1940
1941 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
1942 0x1000ull, 1);
1943 ptu_int_eq(status, 0);
1944
1945 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[1],
1946 0x1008ull, 2);
1947 ptu_int_eq(status, 0);
1948
1949 status = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1009ull);
1950 ptu_int_eq(status, 1);
1951 ptu_ptr_eq(msec.section, &ifix->section[0]);
1952 ptu_uint_eq(msec.vaddr, 0x1000ull);
1953
1954 status = pt_section_put(msec.section);
1955 ptu_int_eq(status, 0);
1956
1957 status = pt_image_find(&ifix->image, &msec, &ifix->asid[1], 0x1009ull);
1958 ptu_int_eq(status, 2);
1959 ptu_ptr_eq(msec.section, &ifix->section[0]);
1960 ptu_uint_eq(msec.vaddr, 0x1008ull);
1961
1962 status = pt_section_put(msec.section);
1963 ptu_int_eq(status, 0);
1964
1965 return ptu_passed();
1966 }
1967
find_bad_asid(struct image_fixture * ifix)1968 static struct ptunit_result find_bad_asid(struct image_fixture *ifix)
1969 {
1970 struct pt_mapped_section msec;
1971 int status;
1972
1973 status = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x2003ull);
1974 ptu_int_eq(status, -pte_nomap);
1975
1976 return ptu_passed();
1977 }
1978
find_nomem(struct image_fixture * ifix)1979 static struct ptunit_result find_nomem(struct image_fixture *ifix)
1980 {
1981 struct pt_mapped_section msec;
1982 int status;
1983
1984 status = pt_image_find(&ifix->image, &msec, &ifix->asid[1], 0x1010ull);
1985 ptu_int_eq(status, -pte_nomap);
1986
1987 return ptu_passed();
1988 }
1989
validate_null(struct image_fixture * ifix)1990 static struct ptunit_result validate_null(struct image_fixture *ifix)
1991 {
1992 struct pt_mapped_section msec;
1993 int status;
1994
1995 status = pt_image_validate(NULL, &msec, 0x1004ull, 10);
1996 ptu_int_eq(status, -pte_internal);
1997
1998 status = pt_image_validate(&ifix->image, NULL, 0x1004ull, 10);
1999 ptu_int_eq(status, -pte_internal);
2000
2001 return ptu_passed();
2002 }
2003
validate(struct image_fixture * ifix)2004 static struct ptunit_result validate(struct image_fixture *ifix)
2005 {
2006 struct pt_mapped_section msec;
2007 int isid, status;
2008
2009 isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
2010 ptu_int_ge(isid, 0);
2011
2012 status = pt_section_put(msec.section);
2013 ptu_int_eq(status, 0);
2014
2015 status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
2016 ptu_int_eq(status, 0);
2017
2018 return ptu_passed();
2019 }
2020
validate_bad_asid(struct image_fixture * ifix)2021 static struct ptunit_result validate_bad_asid(struct image_fixture *ifix)
2022 {
2023 struct pt_mapped_section msec;
2024 int isid, status;
2025
2026 isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
2027 ptu_int_ge(isid, 0);
2028
2029 status = pt_section_put(msec.section);
2030 ptu_int_eq(status, 0);
2031
2032 msec.asid = ifix->asid[1];
2033
2034 status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
2035 ptu_int_eq(status, -pte_nomap);
2036
2037 return ptu_passed();
2038 }
2039
validate_bad_vaddr(struct image_fixture * ifix)2040 static struct ptunit_result validate_bad_vaddr(struct image_fixture *ifix)
2041 {
2042 struct pt_mapped_section msec;
2043 int isid, status;
2044
2045 isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
2046 ptu_int_ge(isid, 0);
2047
2048 status = pt_section_put(msec.section);
2049 ptu_int_eq(status, 0);
2050
2051 msec.vaddr = 0x2000ull;
2052
2053 status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
2054 ptu_int_eq(status, -pte_nomap);
2055
2056 return ptu_passed();
2057 }
2058
validate_bad_offset(struct image_fixture * ifix)2059 static struct ptunit_result validate_bad_offset(struct image_fixture *ifix)
2060 {
2061 struct pt_mapped_section msec;
2062 int isid, status;
2063
2064 isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
2065 ptu_int_ge(isid, 0);
2066
2067 status = pt_section_put(msec.section);
2068 ptu_int_eq(status, 0);
2069
2070 msec.offset = 0x8ull;
2071
2072 status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
2073 ptu_int_eq(status, -pte_nomap);
2074
2075 return ptu_passed();
2076 }
2077
validate_bad_size(struct image_fixture * ifix)2078 static struct ptunit_result validate_bad_size(struct image_fixture *ifix)
2079 {
2080 struct pt_mapped_section msec;
2081 int isid, status;
2082
2083 isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
2084 ptu_int_ge(isid, 0);
2085
2086 status = pt_section_put(msec.section);
2087 ptu_int_eq(status, 0);
2088
2089 msec.size = 0x8ull;
2090
2091 status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid);
2092 ptu_int_eq(status, -pte_nomap);
2093
2094 return ptu_passed();
2095 }
2096
validate_bad_isid(struct image_fixture * ifix)2097 static struct ptunit_result validate_bad_isid(struct image_fixture *ifix)
2098 {
2099 struct pt_mapped_section msec;
2100 int isid, status;
2101
2102 isid = pt_image_find(&ifix->image, &msec, &ifix->asid[0], 0x1003ull);
2103 ptu_int_ge(isid, 0);
2104
2105 status = pt_section_put(msec.section);
2106 ptu_int_eq(status, 0);
2107
2108 status = pt_image_validate(&ifix->image, &msec, 0x1004ull, isid + 1);
2109 ptu_int_eq(status, -pte_nomap);
2110
2111 return ptu_passed();
2112 }
2113
ifix_init(struct image_fixture * ifix)2114 static struct ptunit_result ifix_init(struct image_fixture *ifix)
2115 {
2116 int index;
2117
2118 pt_image_init(&ifix->image, NULL);
2119 pt_image_init(&ifix->copy, NULL);
2120
2121 memset(ifix->status, 0, sizeof(ifix->status));
2122 memset(ifix->mapping, 0, sizeof(ifix->mapping));
2123 memset(ifix->section, 0, sizeof(ifix->section));
2124 memset(&ifix->iscache, 0, sizeof(ifix->iscache));
2125
2126 ifix->nsecs = 0;
2127
2128 index = ifix_add_section(ifix, "file-0");
2129 ptu_int_eq(index, 0);
2130
2131 index = ifix_add_section(ifix, "file-1");
2132 ptu_int_eq(index, 1);
2133
2134 index = ifix_add_section(ifix, "file-2");
2135 ptu_int_eq(index, 2);
2136
2137 pt_asid_init(&ifix->asid[0]);
2138 ifix->asid[0].cr3 = 0xa000;
2139
2140 pt_asid_init(&ifix->asid[1]);
2141 ifix->asid[1].cr3 = 0xb000;
2142
2143 pt_asid_init(&ifix->asid[2]);
2144 ifix->asid[2].cr3 = 0xc000;
2145
2146 return ptu_passed();
2147 }
2148
rfix_init(struct image_fixture * ifix)2149 static struct ptunit_result rfix_init(struct image_fixture *ifix)
2150 {
2151 int status;
2152
2153 ptu_check(ifix_init, ifix);
2154
2155 status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0],
2156 0x1000ull, 10);
2157 ptu_int_eq(status, 0);
2158
2159 status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[1],
2160 0x2000ull, 11);
2161 ptu_int_eq(status, 0);
2162
2163 return ptu_passed();
2164 }
2165
dfix_fini(struct image_fixture * ifix)2166 static struct ptunit_result dfix_fini(struct image_fixture *ifix)
2167 {
2168 pt_image_fini(&ifix->image);
2169
2170 return ptu_passed();
2171 }
2172
ifix_fini(struct image_fixture * ifix)2173 static struct ptunit_result ifix_fini(struct image_fixture *ifix)
2174 {
2175 int sec;
2176
2177 ptu_check(dfix_fini, ifix);
2178
2179 pt_image_fini(&ifix->copy);
2180
2181 for (sec = 0; sec < ifix_nsecs; ++sec) {
2182 ptu_int_eq(ifix->section[sec].ucount, 0);
2183 ptu_int_eq(ifix->section[sec].mcount, 0);
2184 ptu_int_le(ifix->status[sec].deleted, 1);
2185 ptu_int_eq(ifix->status[sec].bad_put, 0);
2186 }
2187
2188 return ptu_passed();
2189 }
2190
main(int argc,char ** argv)2191 int main(int argc, char **argv)
2192 {
2193 struct image_fixture dfix, ifix, rfix;
2194 struct ptunit_suite suite;
2195
2196 /* Dfix provides image destruction. */
2197 dfix.init = NULL;
2198 dfix.fini = dfix_fini;
2199
2200 /* Ifix provides an empty image. */
2201 ifix.init = ifix_init;
2202 ifix.fini = ifix_fini;
2203
2204 /* Rfix provides an image with two sections added. */
2205 rfix.init = rfix_init;
2206 rfix.fini = ifix_fini;
2207
2208 suite = ptunit_mk_suite(argc, argv);
2209
2210 ptu_run(suite, init);
2211 ptu_run_f(suite, init_name, dfix);
2212 ptu_run(suite, init_null);
2213
2214 ptu_run(suite, fini);
2215 ptu_run(suite, fini_empty);
2216 ptu_run(suite, fini_null);
2217
2218 ptu_run_f(suite, name, dfix);
2219 ptu_run(suite, name_none);
2220 ptu_run(suite, name_null);
2221
2222 ptu_run_f(suite, read_empty, ifix);
2223 ptu_run_f(suite, overlap_front, ifix);
2224 ptu_run_f(suite, overlap_back, ifix);
2225 ptu_run_f(suite, overlap_multiple, ifix);
2226 ptu_run_f(suite, overlap_mid, ifix);
2227 ptu_run_f(suite, contained, ifix);
2228 ptu_run_f(suite, contained_multiple, ifix);
2229 ptu_run_f(suite, contained_back, ifix);
2230 ptu_run_f(suite, same, ifix);
2231 ptu_run_f(suite, same_different_isid, ifix);
2232 ptu_run_f(suite, same_different_offset, ifix);
2233 ptu_run_f(suite, adjacent, ifix);
2234
2235 ptu_run_f(suite, read_null, rfix);
2236 ptu_run_f(suite, read, rfix);
2237 ptu_run_f(suite, read_null, rfix);
2238 ptu_run_f(suite, read_asid, ifix);
2239 ptu_run_f(suite, read_bad_asid, rfix);
2240 ptu_run_f(suite, read_null_asid, rfix);
2241 ptu_run_f(suite, read_callback, rfix);
2242 ptu_run_f(suite, read_nomem, rfix);
2243 ptu_run_f(suite, read_truncated, rfix);
2244 ptu_run_f(suite, read_error, rfix);
2245 ptu_run_f(suite, read_spurious_error, rfix);
2246
2247 ptu_run_f(suite, remove_section, rfix);
2248 ptu_run_f(suite, remove_bad_vaddr, rfix);
2249 ptu_run_f(suite, remove_bad_asid, rfix);
2250 ptu_run_f(suite, remove_by_filename, rfix);
2251 ptu_run_f(suite, remove_by_filename_bad_asid, rfix);
2252 ptu_run_f(suite, remove_none_by_filename, rfix);
2253 ptu_run_f(suite, remove_all_by_filename, ifix);
2254 ptu_run_f(suite, remove_by_asid, rfix);
2255
2256 ptu_run_f(suite, copy_empty, ifix);
2257 ptu_run_f(suite, copy, rfix);
2258 ptu_run_f(suite, copy_self, rfix);
2259 ptu_run_f(suite, copy_shrink, rfix);
2260 ptu_run_f(suite, copy_split, ifix);
2261 ptu_run_f(suite, copy_merge, ifix);
2262 ptu_run_f(suite, copy_overlap, ifix);
2263 ptu_run_f(suite, copy_replace, ifix);
2264
2265 ptu_run(suite, add_cached_null);
2266 ptu_run_f(suite, add_cached, ifix);
2267 ptu_run_f(suite, add_cached_null_asid, ifix);
2268 ptu_run_f(suite, add_cached_twice, ifix);
2269 ptu_run_f(suite, add_cached_bad_isid, ifix);
2270
2271 ptu_run_f(suite, find_null, rfix);
2272 ptu_run_f(suite, find, rfix);
2273 ptu_run_f(suite, find_asid, ifix);
2274 ptu_run_f(suite, find_bad_asid, rfix);
2275 ptu_run_f(suite, find_nomem, rfix);
2276
2277 ptu_run_f(suite, validate_null, rfix);
2278 ptu_run_f(suite, validate, rfix);
2279 ptu_run_f(suite, validate_bad_asid, rfix);
2280 ptu_run_f(suite, validate_bad_vaddr, rfix);
2281 ptu_run_f(suite, validate_bad_offset, rfix);
2282 ptu_run_f(suite, validate_bad_size, rfix);
2283 ptu_run_f(suite, validate_bad_isid, rfix);
2284
2285 return ptunit_report(&suite);
2286 }
2287