Remove the struct of arrays setup

This commit is contained in:
2025-03-20 00:52:07 +02:00
parent 2648ee1bc9
commit f537aff9a0
2 changed files with 21 additions and 35 deletions

View File

@@ -14,18 +14,10 @@ HiloadResult read_memory_maps_self(struct sc_array_memreg *regions) {
if (res == HILOAD_FAIL) if (res == HILOAD_FAIL)
return HILOAD_FAIL; return HILOAD_FAIL;
int i = 0;
MemoryRegions reg = {0};
char *strptr = (char *)str_ptr(memory_str); char *strptr = (char *)str_ptr(memory_str);
char *line = strtok(strptr, "\n"); char *line = strtok(strptr, "\n");
while (line) { while (line) {
MemoryRegion reg = {0};
if (i >= HI_MEM_REG_MAX) {
sc_array_add(regions, reg);
memset(&reg, 0, sizeof(reg));
i = 0;
}
char perm_str[5]; char perm_str[5];
u32 dev_major; u32 dev_major;
@@ -36,35 +28,31 @@ HiloadResult read_memory_maps_self(struct sc_array_memreg *regions) {
// Example from `cat /proc/self/maps` // 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 // 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", int result = sscanf(line, "%lx-%lx %4s %lx %x:%x %lu %255s",
&reg.region_starts[i], &reg.region_start,
&reg.region_ends[i], &reg.region_end,
perm_str, perm_str,
&reg.offsets[i], &reg.offset,
&dev_major, &dev_major,
&dev_minor, &dev_minor,
&reg.inodes[i], &reg.inode,
pathname); pathname);
if (perm_str[0] == 'r') reg.permissions[i] |= HI_MEMORY_READ; if (perm_str[0] == 'r') reg.permission |= HI_MEMORY_READ;
if (perm_str[1] == 'w') reg.permissions[i] |= HI_MEMORY_WRITE; if (perm_str[1] == 'w') reg.permission |= HI_MEMORY_WRITE;
if (perm_str[2] == 'x') reg.permissions[i] |= HI_MEMORY_EXECUTE; if (perm_str[2] == 'x') reg.permission |= HI_MEMORY_EXECUTE;
if (perm_str[3] == 'p') reg.permissions[i] |= HI_MEMORY_PRIVATE; if (perm_str[3] == 'p') reg.permission |= HI_MEMORY_PRIVATE;
if (perm_str[3] == 's') reg.permissions[i] |= HI_MEMORY_SHARED; if (perm_str[3] == 's') reg.permission |= HI_MEMORY_SHARED;
// clang-format on
// pathname could be empty, so we check for it // pathname could be empty, so we check for it
if (result >= 8) { if (result >= 8) {
reg.pathnames[i] = strdup(pathname); reg.pathname = strdup(pathname);
} }
i++; sc_array_add(regions, reg);
line = strtok(NULL, "\n"); 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); str_free(memory_str);
return HILOAD_OK; return HILOAD_OK;

View File

@@ -15,20 +15,18 @@ typedef enum {
HI_MEMORY_PRIVATE = 1 << 4 HI_MEMORY_PRIVATE = 1 << 4
} MemoryPermissions; } MemoryPermissions;
#define HI_MEM_REG_MAX 256
typedef struct { typedef struct {
uptr region_starts[HI_MEM_REG_MAX]; uptr region_start;
uptr region_ends[HI_MEM_REG_MAX]; uptr region_end;
uptr offsets[HI_MEM_REG_MAX]; ptrdiff offset;
u64 inodes[HI_MEM_REG_MAX]; u64 inode;
u32 permissions[HI_MEM_REG_MAX]; // enum MemoryPermissions u32 permission; // enum MemoryPermissions
const char *pathnames[HI_MEM_REG_MAX]; const char *pathname;
} MemoryRegions; } MemoryRegion;
sc_array_def(MemoryRegions, memreg); sc_array_def(MemoryRegion, memreg);
_Static_assert(sizeof(MemoryRegions) < 1024 * 12, "MemoryRegion size has increased. Fix this assert.");
/* A pointer that can be used to place the memory regions into. Clears regions before use, but uses the same buffer. */ /* 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); HiloadResult read_memory_maps_self(struct sc_array_memreg *regions);