From f537aff9a042c4cac34634610f87238657e621e7 Mon Sep 17 00:00:00 2001 From: Kasper Date: Thu, 20 Mar 2025 00:52:07 +0200 Subject: [PATCH] Remove the struct of arrays setup --- src/memory.c | 38 +++++++++++++------------------------- src/memory.h | 18 ++++++++---------- 2 files changed, 21 insertions(+), 35 deletions(-) diff --git a/src/memory.c b/src/memory.c index 39add0f..00585d2 100644 --- a/src/memory.c +++ b/src/memory.c @@ -14,18 +14,10 @@ HiloadResult read_memory_maps_self(struct sc_array_memreg *regions) { if (res == HILOAD_FAIL) return HILOAD_FAIL; - int i = 0; - - MemoryRegions reg = {0}; char *strptr = (char *)str_ptr(memory_str); char *line = strtok(strptr, "\n"); while (line) { - - if (i >= HI_MEM_REG_MAX) { - sc_array_add(regions, reg); - memset(®, 0, sizeof(reg)); - i = 0; - } + MemoryRegion reg = {0}; char perm_str[5]; u32 dev_major; @@ -36,35 +28,31 @@ HiloadResult read_memory_maps_self(struct sc_array_memreg *regions) { // Example from `cat /proc/self/maps` // 7fa0b66ca000-7fa0b66cc000 rw-p 00033000 fe:02 28063911 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 int result = sscanf(line, "%lx-%lx %4s %lx %x:%x %lu %255s", - ®.region_starts[i], - ®.region_ends[i], + ®.region_start, + ®.region_end, perm_str, - ®.offsets[i], + ®.offset, &dev_major, &dev_minor, - ®.inodes[i], + ®.inode, pathname); - if (perm_str[0] == 'r') reg.permissions[i] |= HI_MEMORY_READ; - if (perm_str[1] == 'w') reg.permissions[i] |= HI_MEMORY_WRITE; - if (perm_str[2] == 'x') reg.permissions[i] |= HI_MEMORY_EXECUTE; - if (perm_str[3] == 'p') reg.permissions[i] |= HI_MEMORY_PRIVATE; - if (perm_str[3] == 's') reg.permissions[i] |= HI_MEMORY_SHARED; + if (perm_str[0] == 'r') reg.permission |= HI_MEMORY_READ; + if (perm_str[1] == 'w') reg.permission |= HI_MEMORY_WRITE; + if (perm_str[2] == 'x') reg.permission |= HI_MEMORY_EXECUTE; + if (perm_str[3] == 'p') reg.permission |= HI_MEMORY_PRIVATE; + if (perm_str[3] == 's') reg.permission |= HI_MEMORY_SHARED; + // clang-format on // pathname could be empty, so we check for it if (result >= 8) { - reg.pathnames[i] = strdup(pathname); + reg.pathname = strdup(pathname); } - i++; + sc_array_add(regions, reg); line = strtok(NULL, "\n"); } - // clang-format on - sc_array_add(regions, reg); - - sc_log_debug("Memory Map\n-- /proc/self/maps:\n%s\n", str_ptr(memory_str)); - str_free(memory_str); return HILOAD_OK; diff --git a/src/memory.h b/src/memory.h index 19ab459..0c14d36 100644 --- a/src/memory.h +++ b/src/memory.h @@ -15,20 +15,18 @@ typedef enum { HI_MEMORY_PRIVATE = 1 << 4 } MemoryPermissions; -#define HI_MEM_REG_MAX 256 typedef struct { - uptr region_starts[HI_MEM_REG_MAX]; - uptr region_ends[HI_MEM_REG_MAX]; - uptr offsets[HI_MEM_REG_MAX]; - u64 inodes[HI_MEM_REG_MAX]; - u32 permissions[HI_MEM_REG_MAX]; // enum MemoryPermissions - const char *pathnames[HI_MEM_REG_MAX]; -} MemoryRegions; + uptr region_start; + uptr region_end; + ptrdiff offset; + u64 inode; + u32 permission; // enum MemoryPermissions + const char *pathname; +} MemoryRegion; -sc_array_def(MemoryRegions, memreg); -_Static_assert(sizeof(MemoryRegions) < 1024 * 12, "MemoryRegion size has increased. Fix this assert."); +sc_array_def(MemoryRegion, memreg); /* A pointer that can be used to place the memory regions into. Clears regions before use, but uses the same buffer. */ HiloadResult read_memory_maps_self(struct sc_array_memreg *regions);