/* * Copyright © 2022 Igalia S.L. * SPDX-License-Identifier: MIT */ #include #include #include #include "io.h" #include "redump.h" static void parse_addr(uint32_t *buf, int sz, unsigned int *len, uint64_t *gpuaddr) { *gpuaddr = buf[0]; *len = buf[1]; if (sz > 8) *gpuaddr |= ((uint64_t)(buf[2])) << 32; } static uint32_t parse_gpu_id(void *buf) { return *((unsigned int *)buf); } static uint64_t parse_chip_id(void *buf) { return *((uint64_t *)buf); } struct rd_parsed_section { void *buf; enum rd_sect_type type; int sz; int ret; }; static bool parse_rd_section(struct io *io, struct rd_parsed_section *section) { uint32_t arr[2]; int ret; ret = io_readn(io, arr, 8); if (ret <= 0) goto end; while ((arr[0] == 0xffffffff) && (arr[1] == 0xffffffff)) { ret = io_readn(io, arr, 8); if (ret <= 0) goto end; } section->type = arr[0]; section->sz = arr[1]; if (section->sz < 0) { ret = -1; goto end; } free(section->buf); section->buf = malloc(section->sz + 1); ((char *)section->buf)[section->sz] = '\0'; ret = io_readn(io, section->buf, section->sz); if (ret < 0) goto end; section->ret = ret; return true; end: section->ret = ret; return false; }