Remove the struct of arrays setup
This commit is contained in:
38
src/memory.c
38
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;
|
||||
|
||||
18
src/memory.h
18
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);
|
||||
|
||||
Reference in New Issue
Block a user