summaryrefslogtreecommitdiff
path: root/kernel/user.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-28 13:21:58 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-28 13:21:58 -0400
commit3ff27507ccbffba7adf09b2322271606717a9164 (patch)
treed5bebb27d3bd906ad25cd9687ba0ac28e556e33a /kernel/user.c
parentallocate vaddrs when given directly (diff)
downloadcomus-3ff27507ccbffba7adf09b2322271606717a9164.tar.gz
comus-3ff27507ccbffba7adf09b2322271606717a9164.tar.bz2
comus-3ff27507ccbffba7adf09b2322271606717a9164.zip
heap (brk / sbrk)
Diffstat (limited to 'kernel/user.c')
-rw-r--r--kernel/user.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/kernel/user.c b/kernel/user.c
index 8f626a7..fc1167d 100644
--- a/kernel/user.c
+++ b/kernel/user.c
@@ -71,6 +71,10 @@ static int user_load_segment(struct pcb *pcb, struct disk *disk, int idx)
total_read += read;
}
+ // update heap end
+ if (hdr.p_vaddr + mem_pages * PAGE_SIZE > (uint64_t)pcb->heap_start)
+ pcb->heap_start = (void *)(hdr.p_vaddr + mem_pages * PAGE_SIZE);
+
kunmapaddr(mapADDR);
return 0;
}
@@ -79,6 +83,9 @@ static int user_load_segments(struct pcb *pcb, struct disk *disk)
{
int ret = 0;
+ pcb->heap_start = NULL;
+ pcb->heap_len = 0;
+
if (load_buffer == NULL)
if ((load_buffer = kalloc(BLOCK_SIZE)) == NULL)
return 1;
@@ -86,6 +93,12 @@ static int user_load_segments(struct pcb *pcb, struct disk *disk)
for (int i = 0; i < pcb->n_elf_segments; i++)
if ((ret = user_load_segment(pcb, disk, i)))
return ret;
+
+ if (pcb->heap_start == NULL) {
+ WARN("No loadable ELF segments found.");
+ return 1;
+ };
+
return 0;
}