mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-03 18:00:10 +01:00
asahi: Identify more unknown fields in the memmap
From validating the memory map of a Metal sample and seeing what goes wrong. Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11815>
This commit is contained in:
parent
0eb4a4dd79
commit
d5580ee805
3 changed files with 47 additions and 25 deletions
|
|
@ -100,44 +100,69 @@ agxdecode_find_handle(unsigned handle, unsigned type)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
agxdecode_mark_mapped(unsigned handle)
|
||||
{
|
||||
struct agx_bo *bo = agxdecode_find_handle(handle, AGX_ALLOC_REGULAR);
|
||||
|
||||
if (!bo) {
|
||||
fprintf(stderr, "ERROR - unknown BO mapped with handle %u\n", handle);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Mark mapped for future consumption */
|
||||
bo->mapped = true;
|
||||
}
|
||||
|
||||
static void
|
||||
agxdecode_validate_map(void *map)
|
||||
{
|
||||
unsigned nr_handles = 0;
|
||||
|
||||
/* First, mark everything unmapped */
|
||||
for (unsigned i = 0; i < mmap_count; ++i)
|
||||
mmap_array[i].mapped = false;
|
||||
|
||||
/* Check the header */
|
||||
struct agx_map_header *hdr = map;
|
||||
if (hdr->nr_entries_1 == 0) {
|
||||
if (hdr->nr_entries == 0) {
|
||||
fprintf(stderr, "ERROR - empty map\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (hdr->nr_entries_1 != hdr->nr_entries_2) {
|
||||
fprintf(stderr, "WARN - mismatched map %u vs %u\n", hdr->nr_entries_1, hdr->nr_entries_2);
|
||||
for (unsigned i = 0; i < 6; ++i) {
|
||||
unsigned handle = hdr->indices[i];
|
||||
if (handle) {
|
||||
agxdecode_mark_mapped(handle);
|
||||
nr_handles++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check the entries */
|
||||
struct agx_map_entry *entries = (struct agx_map_entry *) (&hdr[1]);
|
||||
for (unsigned i = 0; i < hdr->nr_entries_1 - 1; ++i) {
|
||||
for (unsigned i = 0; i < hdr->nr_entries - 1; ++i) {
|
||||
struct agx_map_entry entry = entries[i];
|
||||
struct agx_bo *bo = agxdecode_find_handle(entry.index, AGX_ALLOC_REGULAR);
|
||||
|
||||
if (!bo) {
|
||||
fprintf(stderr, "ERROR - unknown BO mapped with handle %u\n", entry.index);
|
||||
continue;
|
||||
|
||||
for (unsigned j = 0; j < 6; ++j) {
|
||||
unsigned handle = entry.indices[j];
|
||||
if (handle) {
|
||||
agxdecode_mark_mapped(handle);
|
||||
nr_handles++;
|
||||
}
|
||||
}
|
||||
|
||||
/* Mark mapped for future consumption */
|
||||
bo->mapped = true;
|
||||
}
|
||||
|
||||
/* Check the sentinel */
|
||||
if (entries[hdr->nr_entries_1 - 1].index) {
|
||||
fprintf(stderr, "ERROR - last entry nonzero %u\n", entries[hdr->nr_entries_1 - 1].index);
|
||||
if (entries[hdr->nr_entries - 1].indices[0]) {
|
||||
fprintf(stderr, "ERROR - last entry nonzero %u\n", entries[hdr->nr_entries - 1].indices[0]);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Check the handle count */
|
||||
if (nr_handles != hdr->nr_handles) {
|
||||
fprintf(stderr, "ERROR - wrong handle count, got %u, expected %u\n",
|
||||
nr_handles, hdr->nr_handles);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void *
|
||||
|
|
|
|||
|
|
@ -192,10 +192,9 @@ struct agx_map_header {
|
|||
uint64_t encoder_id; // GUID
|
||||
uint32_t unk6; // 00 00 00 00
|
||||
uint32_t cmdbuf_size;
|
||||
uint32_t nr_entries_1;
|
||||
uint32_t nr_entries_2;
|
||||
uint32_t unka; // 0b 00 00 00
|
||||
uint32_t padding[5];
|
||||
uint32_t nr_handles;
|
||||
uint32_t nr_entries;
|
||||
uint32_t indices[6];
|
||||
} __attribute__((packed));
|
||||
|
||||
struct agx_map_entry {
|
||||
|
|
@ -209,8 +208,7 @@ struct agx_map_entry {
|
|||
uint32_t unk8; // 00 00 00 00
|
||||
uint32_t unk9; // 00 00 00 00
|
||||
uint32_t unka; // ff ff 01 00
|
||||
uint32_t index;
|
||||
uint32_t padding[5];
|
||||
uint32_t indices[6];
|
||||
} __attribute__((packed));
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -269,9 +269,9 @@ demo_map_header(uint64_t cmdbuf_id, uint64_t encoder_id, unsigned cmdbuf_size, u
|
|||
.cmdbuf_size = cmdbuf_size,
|
||||
|
||||
/* +1 for the sentinel ending */
|
||||
.nr_entries_1 = count + 1,
|
||||
.nr_entries_2 = count + 1,
|
||||
.unka = 0x0b,
|
||||
.nr_entries = count + 1,
|
||||
.nr_handles = count + 1,
|
||||
.indices = {0x0b},
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -293,7 +293,7 @@ demo_mem_map(void *map, size_t size, unsigned *handles, unsigned count,
|
|||
.unkAAA = 0x20,
|
||||
.unkBBB = 0x1,
|
||||
.unka = 0x1ffff,
|
||||
.index = handles[i]
|
||||
.indices = {handles[i]}
|
||||
};
|
||||
}
|
||||
|
||||
|
|
@ -303,6 +303,5 @@ demo_mem_map(void *map, size_t size, unsigned *handles, unsigned count,
|
|||
.unkAAA = 0x40,
|
||||
.unkBBB = 0x1,
|
||||
.unka = 0x1ffff,
|
||||
.index = 0
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue