Populate the memory map structure

This commit is contained in:
2025-03-20 00:42:19 +02:00
parent 1cd14ad69f
commit 2648ee1bc9
4 changed files with 73 additions and 23 deletions

View File

@@ -4,22 +4,68 @@
#include "logger.h"
#include "types.h"
void hi_clear_memreg(struct sc_array_memreg *regions)
{
MemoryRegions *reg;
sc_array_foreach(regions, *reg) {
}
}
HiloadResult read_memory_maps_self(struct sc_array_memreg *regions) {
str memory_str = str_null;
sc_array_clear(regions);
sc_array_init(regions);
HiloadResult res = read_stream_to_str(&memory_str, "/proc/self/maps");
if (res == HILOAD_FAIL)
return 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(&reg, 0, sizeof(reg));
i = 0;
}
char perm_str[5];
u32 dev_major;
u32 dev_minor;
char pathname[256];
// clang-format off
// 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",
&reg.region_starts[i],
&reg.region_ends[i],
perm_str,
&reg.offsets[i],
&dev_major,
&dev_minor,
&reg.inodes[i],
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;
// pathname could be empty, so we check for it
if (result >= 8) {
reg.pathnames[i] = strdup(pathname);
}
i++;
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;
}