static struct ptunit_result read_asid(struct image_fixture *ifix) { uint8_t buffer[] = { 0xcc, 0xcc }; int status; status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0], 0x1000ull); ptu_int_eq(status, 0); status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[1], 0x1008ull); ptu_int_eq(status, 0); status = pt_image_read(&ifix->image, buffer, 1, &ifix->asid[0], 0x1009ull); ptu_int_eq(status, 1); ptu_uint_eq(buffer[0], 0x09); ptu_uint_eq(buffer[1], 0xcc); status = pt_image_read(&ifix->image, buffer, 1, &ifix->asid[1], 0x1009ull); ptu_int_eq(status, 1); ptu_uint_eq(buffer[0], 0x01); ptu_uint_eq(buffer[1], 0xcc); return ptu_passed(); }
struct ptunit_result rfix_init(struct image_fixture *ifix) { int status; ptu_check(ifix_init, ifix); status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0], 0x1000ull); ptu_int_eq(status, 0); status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[1], 0x2000ull); ptu_int_eq(status, 0); return ptu_passed(); }
int pt_image_add_cached(struct pt_image *image, struct pt_image_section_cache *iscache, int isid, const struct pt_asid *uasid) { struct pt_section *section; struct pt_asid asid; uint64_t vaddr; int errcode, status; if (!image || !iscache) return -pte_invalid; errcode = pt_iscache_lookup(iscache, §ion, &vaddr, isid); if (errcode < 0) return errcode; errcode = pt_asid_from_user(&asid, uasid); if (errcode < 0) return errcode; status = pt_image_add(image, section, &asid, vaddr, isid); /* We grab a reference when we add the section. Drop the one we * obtained from cache lookup. */ errcode = pt_section_put(section); if (errcode < 0) return errcode; return status; }
int pt_image_add_file(struct pt_image *image, const char *filename, uint64_t offset, uint64_t size, const struct pt_asid *uasid, uint64_t vaddr) { struct pt_section *section; struct pt_asid asid; int errcode; if (!image || !filename) return -pte_invalid; errcode = pt_asid_from_user(&asid, uasid); if (errcode < 0) return errcode; section = pt_mk_section(filename, offset, size); if (!section) return -pte_invalid; errcode = pt_image_add(image, section, &asid, vaddr, 0); if (errcode < 0) { (void) pt_section_put(section); return errcode; } /* The image list got its own reference; let's drop ours. */ errcode = pt_section_put(section); if (errcode < 0) return errcode; return 0; }
static struct ptunit_result remove_all_by_filename(struct image_fixture *ifix) { uint8_t buffer[] = { 0xcc, 0xcc, 0xcc }; int status; ifix->section[0].filename = "same-name"; ifix->section[1].filename = "same-name"; status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0], 0x1000ull); ptu_int_eq(status, 0); status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0], 0x2000ull); ptu_int_eq(status, 0); status = pt_image_read(&ifix->image, buffer, 2, &ifix->asid[0], 0x1001ull); ptu_int_eq(status, 2); ptu_uint_eq(buffer[0], 0x01); ptu_uint_eq(buffer[1], 0x02); ptu_uint_eq(buffer[2], 0xcc); status = pt_image_remove_by_filename(&ifix->image, "same-name", &ifix->asid[0]); ptu_int_eq(status, 2); ptu_int_ne(ifix->status[0].deleted, 0); ptu_int_ne(ifix->status[1].deleted, 0); status = pt_image_read(&ifix->image, buffer, sizeof(buffer), &ifix->asid[0], 0x1003ull); ptu_int_eq(status, -pte_nomap); ptu_uint_eq(buffer[0], 0x01); ptu_uint_eq(buffer[1], 0x02); ptu_uint_eq(buffer[2], 0xcc); status = pt_image_read(&ifix->image, buffer, sizeof(buffer), &ifix->asid[0], 0x2003ull); ptu_int_eq(status, -pte_nomap); ptu_uint_eq(buffer[0], 0x01); ptu_uint_eq(buffer[1], 0x02); ptu_uint_eq(buffer[2], 0xcc); return ptu_passed(); }
static struct ptunit_result adjacent(struct image_fixture *ifix) { uint8_t buffer[] = { 0xcc, 0xcc }; int status; status = pt_image_add(&ifix->image, &ifix->section[0], &ifix->asid[0], 0x1000ull); ptu_int_eq(status, 0); status = pt_image_add(&ifix->image, &ifix->section[1], &ifix->asid[0], 0x1000ull - ifix->section[1].size); ptu_int_eq(status, 0); status = pt_image_add(&ifix->image, &ifix->section[2], &ifix->asid[0], 0x1000ull + ifix->section[0].size); ptu_int_eq(status, 0); status = pt_image_read(&ifix->image, buffer, 1, &ifix->asid[0], 0x1000ull); ptu_int_eq(status, 1); ptu_uint_eq(buffer[0], 0x00); ptu_uint_eq(buffer[1], 0xcc); status = pt_image_read(&ifix->image, buffer, 1, &ifix->asid[0], 0xfffull); ptu_int_eq(status, 1); ptu_uint_eq(buffer[0], ifix->mapping[1].content[ifix->mapping[1].size - 1]); ptu_uint_eq(buffer[1], 0xcc); status = pt_image_read(&ifix->image, buffer, 1, &ifix->asid[0], 0x1000ull + ifix->section[0].size); ptu_int_eq(status, 1); ptu_uint_eq(buffer[0], 0x00); ptu_uint_eq(buffer[1], 0xcc); return ptu_passed(); }
static struct ptunit_result copy_duplicate(struct image_fixture *ifix) { uint8_t buffer[] = { 0xcc, 0xcc, 0xcc }; int status; status = pt_image_add(&ifix->copy, &ifix->section[1], &ifix->asid[1], 0x2000ull); ptu_int_eq(status, 0); status = pt_image_copy(&ifix->copy, &ifix->image); ptu_int_eq(status, 1); status = pt_image_read(&ifix->copy, buffer, 2, &ifix->asid[1], 0x2003ull); ptu_int_eq(status, 2); ptu_uint_eq(buffer[0], 0x03); ptu_uint_eq(buffer[1], 0x04); ptu_uint_eq(buffer[2], 0xcc); return ptu_passed(); }
int pt_image_copy(struct pt_image *image, const struct pt_image *src) { struct pt_section_list *list; int ignored; if (!image || !src) return -pte_invalid; ignored = 0; for (list = src->sections; list; list = list->next) { int errcode; errcode = pt_image_add(image, list->section.section, &list->section.asid, list->section.vaddr); if (errcode < 0) ignored += 1; } return ignored; }
static struct ptunit_result fini(void) { struct ifix_mapping mapping; struct ifix_status status; struct pt_section section; struct pt_image image; struct pt_asid asid; int errcode; pt_asid_init(&asid); pt_init_section(§ion, NULL, &status, &mapping); pt_image_init(&image, NULL); errcode = pt_image_add(&image, §ion, &asid, 0x0ull); ptu_int_eq(errcode, 0); pt_image_fini(&image); ptu_int_eq(section.ucount, 0); ptu_int_eq(section.mcount, 0); ptu_int_eq(status.deleted, 1); return ptu_passed(); }