From 54101cf327b7def90636babbadbb66ce697298ee Mon Sep 17 00:00:00 2001 From: Benji Dial Date: Sun, 13 Sep 2020 18:29:53 -0400 Subject: making elf loader zero bss sections --- makefile | 2 +- src/kernel/elf.c | 2 ++ src/user/include/knob/format.h | 6 +++--- src/user/knob/format.c | 3 +++ src/user/knob/heap.c | 28 ++++++++++++++++++++++++++++ 5 files changed, 37 insertions(+), 4 deletions(-) diff --git a/makefile b/makefile index 31f6503..25582d1 100644 --- a/makefile +++ b/makefile @@ -8,7 +8,7 @@ out/disk.vdi: out/disk.img VBoxManage convertfromraw out/disk.img out/disk.vdi --uuid a61929ed-3bf2-45ff-b98a-44f87c616dba out/disk.img: out/kernel.bin out/boot.bin out/fs - #TODO: have this regenerate after out/fs + #TODO: have this regenerate after out/fs mkdir -p obj /sbin/mkfs.fat -C -f 1 -F 16 -n "PORTLAND OS" -R 65 -s 1 -S 512 obj/shadow.img 8192 echo -n -e '\xeb\x3c' > obj/jmp.bin diff --git a/src/kernel/elf.c b/src/kernel/elf.c index 07cff91..8113c14 100644 --- a/src/kernel/elf.c +++ b/src/kernel/elf.c @@ -104,6 +104,8 @@ bool try_elf_run(const struct drive *d, const char *path, const char *pass_old_v continue; void *pma = pd_user_allocate(pd, entry->vma, (entry->vms - 1) / 4096 + 1, entry->flags & PH_WRITABLE); fmcpy(pma, d, h, entry->fa, entry->fs); + for (uint8_t *pma_i = pma + entry->fs; pma_i < pma + entry->vms; ++pma_i) + *pma_i = 0; } free_pages(phtable, phtable_pages); diff --git a/src/user/include/knob/format.h b/src/user/include/knob/format.h index 89402c0..d55036c 100644 --- a/src/user/include/knob/format.h +++ b/src/user/include/knob/format.h @@ -5,8 +5,8 @@ #include bool try_sntoi(const char *s, uint32_t n, uint32_t *out); -void itosz(uint32_t i, char *out); -void itosz_h8(uint8_t i, char *out); -void itosz_h32(uint32_t i, char *out); +void itosz(uint32_t i, char *out) __attribute__ ((access (write_only, 2))); +void itosz_h8(uint8_t i, char *out) __attribute__ ((access (write_only, 2))); +void itosz_h32(uint32_t i, char *out) __attribute__ ((access (write_only, 2))); #endif \ No newline at end of file diff --git a/src/user/knob/format.c b/src/user/knob/format.c index 645fb73..593b20c 100644 --- a/src/user/knob/format.c +++ b/src/user/knob/format.c @@ -12,6 +12,7 @@ bool try_sntoi(const char *s, uint32_t n, uint32_t *out) { return true; } +__attribute__ ((access (write_only, 2))) void itosz(uint32_t i, char *out) { if (!i) { *(uint16_t *)out = (uint16_t)'0'; @@ -32,12 +33,14 @@ void itosz(uint32_t i, char *out) { const char *const hex_digits = "0123456789abcdef"; +__attribute__ ((access (write_only, 2))) void itosz_h8(uint8_t i, char *out) { out[0] = hex_digits[i >> 4]; out[1] = hex_digits[i & 0xf]; out[2] = '\0'; } +__attribute__ ((access (write_only, 2))) void itosz_h32(uint32_t i, char *out) { for (uint8_t digit = 0; digit < 8; ++digit) out[digit] = hex_digits[(i >> (28 - digit * 4)) & 0xf]; diff --git a/src/user/knob/heap.c b/src/user/knob/heap.c index ec21129..49f9339 100644 --- a/src/user/knob/heap.c +++ b/src/user/knob/heap.c @@ -24,9 +24,23 @@ static void add_header(struct block_header *bh) { __attribute__ ((malloc)) void *get_block(uint32_t bytes) { +//char nbuf[11]; +//tell_user_sz("[heap::get_block]\n first_block = 0x"); +//itosz_h32((uint32_t)first_block, nbuf); +//tell_user_sz(nbuf); +//tell_user_sz("\n"); struct block_header *header = 0; for (struct block_header *ptr = first_block; ptr; ptr = ptr->next) { + //tell_user_sz(" ptr = 0x"); + //itosz_h32((uint32_t)ptr, nbuf); + //tell_user_sz(nbuf); + //tell_user_sz("\n &ptr->allocated = 0x"); + //itosz_h32((uint32_t)&ptr->allocated, nbuf); + //tell_user_sz(nbuf); + //tell_user_sz("\n ptr->allocated = "); + //tell_user_sz(ptr->allocated ? "true\n" : "false\n"); + if (ptr->allocated) continue; if (ptr->length == bytes) { @@ -49,7 +63,14 @@ void *get_block(uint32_t bytes) { if (!header) { uint32_t size_with_header = bytes + sizeof(struct block_header); if (!(size_with_header % 4096)) { + //tell_user_sz(" allocate "); + //itosz(size_with_header / 4096, nbuf); + //tell_user_sz(nbuf); + //tell_user_sz(" pages = 0x"); header = _allocate_ram(size_with_header / 4096); + //itosz_h32((uint32_t)header, nbuf); + //tell_user_sz(nbuf); + //tell_user_sz("\n"); if (!header) return 0; header->length = bytes; @@ -57,7 +78,14 @@ void *get_block(uint32_t bytes) { } else { uint32_t pages = (bytes + sizeof(struct block_header) * 2) / 4096 + 1; + //tell_user_sz(" allocate "); + //itosz(pages, nbuf); + //tell_user_sz(nbuf); + //tell_user_sz(" pages = 0x"); header = _allocate_ram(pages); + //itosz_h32((uint32_t)header, nbuf); + //tell_user_sz(nbuf); + //tell_user_sz("\n"); if (!header) return 0; header->length = bytes; -- cgit v1.2.3