int pt_image_read(struct pt_image *image, int *isid, uint8_t *buffer, uint16_t size, const struct pt_asid *asid, uint64_t addr) { struct pt_mapped_section *msec; struct pt_section_list *section; int errcode; if (!image || !isid) return -pte_internal; section = image->sections; if (!section) return pt_image_read_callback(image, isid, buffer, size, asid, addr); if (!section->mapped) return pt_image_read_cold(image, isid, buffer, size, asid, addr); msec = §ion->section; errcode = pt_image_check_msec(msec, asid, addr); if (errcode < 0) { if (errcode != -pte_nomap) return errcode; return pt_image_read_cold(image, isid, buffer, size, asid, addr); } *isid = section->isid; return pt_image_read_msec(buffer, size, msec, addr); }
int pt_image_read(struct pt_image *image, uint8_t *buffer, uint16_t size, const struct pt_asid *asid, uint64_t addr) { struct pt_section_list **list, **start; if (!image || !asid) return -pte_internal; start = &image->sections; for (list = start; *list;) { struct pt_mapped_section *msec; struct pt_section_list *elem; int status; elem = *list; msec = &elem->section; if (!elem->mapped) break; status = pt_msec_read_mapped(msec, buffer, size, asid, addr); if (status < 0) { list = &elem->next; continue; } /* Move the section to the front if it isn't already. */ if (list != start) { *list = elem->next; elem->next = *start; *start = elem; } return status; } return pt_image_read_cold(image, list, buffer, size, asid, addr); }