From 91e65bb35a8107fbf09f2e97fbd7f96b70a60f43 Mon Sep 17 00:00:00 2001 From: kamkow1 Date: Wed, 17 Sep 2025 21:48:16 +0200 Subject: [PATCH] Resolve hisenbugs regarding GCC and -Os --- kernel/dlmalloc/dlmalloc_port.inc | 1 + kernel/hal/x86_64/intr.c | 20 ++++++++--- kernel/hal/x86_64/vmm.c | 2 +- kernel/proc/proc.c | 24 +++---------- kernel/proc/proc.h | 6 ++-- mk/user/x86_64.mk | 2 +- ulib/_premain.c | 12 +++---- ulib/dlmalloc/dlmalloc_port.inc | 55 +++++++++--------------------- user/init/main.c | 10 +++--- user/pctl/main.o | Bin 7768 -> 7184 bytes user/pctl/pctl | Bin 35096 -> 61664 bytes user/tb/interp.c | 33 +++++++++++------- user/tb/main.c | 2 +- 13 files changed, 74 insertions(+), 93 deletions(-) diff --git a/kernel/dlmalloc/dlmalloc_port.inc b/kernel/dlmalloc/dlmalloc_port.inc index 5e5bc98..2e4613a 100644 --- a/kernel/dlmalloc/dlmalloc_port.inc +++ b/kernel/dlmalloc/dlmalloc_port.inc @@ -34,6 +34,7 @@ #define malloc_getpagesize 0x1000 #define EINVAL 0xdeadbeef #define ENOMEM 0xb16b00b5 +#define MORECORE_CONTIGUOUS 0 #define MLOCK_T SpinLock diff --git a/kernel/hal/x86_64/intr.c b/kernel/hal/x86_64/intr.c index 174f3ad..b5ad3bf 100644 --- a/kernel/hal/x86_64/intr.c +++ b/kernel/hal/x86_64/intr.c @@ -17,6 +17,19 @@ #include "proc/ps2kbproc/ps2kbproc.h" #include "rbuf/rbuf.h" +typedef struct BackTraceFrame { + struct BackTraceFrame *rbp; + uint64_t rip; +} BackTraceFrame; + +void backtrace(BackTraceFrame *bt) { + kprintf("Backtrace:\n"); + for (size_t frame = 0; bt; frame++) { + kprintf(" 0x%llx\n", bt->rip); + bt = bt->rbp; + } +} + void hal_intr_disable(void) { asm volatile("cli"); } @@ -178,9 +191,7 @@ void hal_syscalldispatch(IntrStackFrame *frame) { } void intr_eoi(uint8_t irq) { - if (irq >= 8) { - io_out8(PIC2_CMD, PIC_EOI); - } + io_out8(PIC2_CMD, PIC_EOI); io_out8(PIC1_CMD, PIC_EOI); } @@ -188,7 +199,8 @@ void intr_handleintr(IntrStackFrame *frame) { if (frame->trapnum <= 31) { kprintf("ERROR %s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum); intr_dumpframe(frame); - if ((frame->trapnum == 14 && frame->errnum & 0x4) || frame->trapnum == 0x6) { + backtrace((BackTraceFrame *)frame->regs.rbp); + if (frame->errnum & 0x4) { kprintf("killed pid %ld %s\n", PROCS.current->pid, PROCS.current->name); proc_killself(); proc_sched((void *)frame); diff --git a/kernel/hal/x86_64/vmm.c b/kernel/hal/x86_64/vmm.c index 05656b8..2ba999c 100644 --- a/kernel/hal/x86_64/vmm.c +++ b/kernel/hal/x86_64/vmm.c @@ -101,7 +101,7 @@ void hal_vmm_unmap_range(uint64_t cr3phys, void *virtstart, void *physstart, siz void hal_vmm_map_kern(uint64_t targetcr3) { uint64_t *kcr3 = (uint64_t *)VIRT(KERNEL_CR3); uint64_t *cr3 = (uint64_t *)VIRT(targetcr3); - for (size_t i = 256; i < 512; i++) { + for (size_t i = 0; i < 512; i++) { cr3[i] = kcr3[i]; } } diff --git a/kernel/proc/proc.c b/kernel/proc/proc.c index e6b3fe8..1385da8 100644 --- a/kernel/proc/proc.c +++ b/kernel/proc/proc.c @@ -58,7 +58,10 @@ ElfAuxval proc_load_elf_segs(Proc *proc, uint8_t *data) { hal_memset(VIRT(physaddr), 0, blocks * HAL_PAGE_SIZE); hal_memcpy(VIRT(physaddr) + off, (data + phdr->p_offset), phdr->p_filesz); - uint32_t pgflags = HAL_PG_USER | HAL_PG_RW | HAL_PG_PRESENT; + uint32_t pgflags = HAL_PG_USER | HAL_PG_PRESENT; + if (phdr->p_flags & PF_W) { + pgflags |= HAL_PG_RW; + } hal_vmm_map_range(proc->platformdata.cr3, virtaddr, physaddr, blocks * HAL_PAGE_SIZE, pgflags); VasRange *range = dlmalloc(sizeof(*range)); @@ -165,25 +168,8 @@ Proc *proc_spawnuser(char *mountpoint, char *path) { range->pgflags = flags; LL_APPEND(proc->vas, range); - /* uint8_t *sp = (uint8_t *)pmm_alloc(PROC_STACKBLOCKS) + PROC_STACKSIZE; */ - /* uint8_t *spbase = sp - PROC_STACKSIZE; */ - /* uint8_t *kstackp = (uint8_t *)pmm_alloc(PROC_STACKBLOCKS) + PROC_STACKSIZE; */ - /* proc->platformdata.kstack = kstackp; */ - /* proc->platformdata.pstack = sp; */ - - - - /* uint32_t flags = HAL_PG_RW | HAL_PG_USER | HAL_PG_PRESENT; */ - - /* hal_vmm_map_range(proc->platformdata.cr3, spbase, spbase, PROC_STACKSIZE, flags); */ - /* VasRange *range = dlmalloc(sizeof(*range)); */ - /* range->virtstart = spbase; */ - /* range->physstart = spbase; */ - /* range->size = PROC_STACKSIZE; */ - /* range->pgflags = flags; */ - /* LL_APPEND(proc->vas, range); */ - ElfAuxval aux = proc_load_elf_segs(proc, data); + dlfree(data); proc->platformdata.trapframe.ss = 0x20 | 0x3; proc->platformdata.trapframe.rsp = (uint64_t)virttop; diff --git a/kernel/proc/proc.h b/kernel/proc/proc.h index b88237b..208f3b8 100644 --- a/kernel/proc/proc.h +++ b/kernel/proc/proc.h @@ -11,7 +11,7 @@ #define PROC_NAME_MAX 0x100 -#define PROC_STACKBLOCKS 256 +#define PROC_STACKBLOCKS (1024*4) #define PROC_STACKSIZE (PROC_STACKBLOCKS * BITMAP_BLOCK_SIZE) #define PROC_MAX 0x100 // max amount of processes @@ -19,8 +19,8 @@ #define PROC_VFSHANDLES_MAX 0x80 #define PROC_PIPEHANDLES_MAX 0x20 -#define PROC_MMAN_MAP_BASE 0x0000004000000000ULL -#define PROC_USER_STACK_TOP 0x00007ffffffff000ULL +#define PROC_MMAN_MAP_BASE 0x700000000000 +#define PROC_USER_STACK_TOP 0x800000000000 typedef struct { IntrStackFrame trapframe; diff --git a/mk/user/x86_64.mk b/mk/user/x86_64.mk index 9b7bf51..79d58fb 100644 --- a/mk/user/x86_64.mk +++ b/mk/user/x86_64.mk @@ -9,4 +9,4 @@ CFLAGS += -m64 \ -fno-stack-protector \ -fno-stack-check \ -fno-builtin \ - -Os \ + -O0 \ diff --git a/ulib/_premain.c b/ulib/_premain.c index 6e41e27..f11d08a 100644 --- a/ulib/_premain.c +++ b/ulib/_premain.c @@ -8,15 +8,13 @@ #include extern void main(void); -extern uint8_t _bss_start; -extern uint8_t _bss_end; +extern uint8_t _bss_start[]; +extern uint8_t _bss_end[]; void clearbss(void) { - uint8_t *ps = &_bss_start; - uint8_t *pe = &_bss_end; - size_t sz = pe - ps; - for (size_t i = 0; i < sz; i++) { - ps[i] = 0; + uint8_t *p = _bss_start; + while (p < _bss_end) { + *p++ = 0; } } diff --git a/ulib/dlmalloc/dlmalloc_port.inc b/ulib/dlmalloc/dlmalloc_port.inc index 9f222b4..b5c7fa2 100644 --- a/ulib/dlmalloc/dlmalloc_port.inc +++ b/ulib/dlmalloc/dlmalloc_port.inc @@ -22,6 +22,7 @@ #define LACKS_STRINGS_H 1 #define LACKS_SCHED_H 1 #define HAVE_MMAP 0 +#define MORECORE_CONTIGUOUS 0 #define ABORT \ do { \ uprintf("dlmalloc: Aborting...\n"); \ @@ -54,50 +55,28 @@ static MLOCK_T malloc_global_mutex = { 0 }; #define PAGE_SIZE 0x1000 -static uint8_t *heap_start = NULL; -static uint8_t *heap_end = NULL; -static uint8_t *heap_commit = NULL; - static size_t _roundpage(size_t sz) { return (sz + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); } +void *_last = 0; + void *sbrk(ptrdiff_t inc) { - if (!heap_end) { - size_t allocsz = PAGE_SIZE; - uint8_t *maddr = NULL; - int32_t ret = mman_map(NULL, allocsz, MMAN_MAP_PF_RW, 0, &maddr); - if (ret != E_OK || maddr == NULL) { - return (void *)-1; - } - heap_start = maddr; - heap_end = maddr; - heap_commit = maddr + allocsz; + if (inc < 0) { + return 0; + } + if (!inc) { + return _last; } - if (inc == 0) { - return heap_end; + uint64_t pages = _roundpage(inc); + uint8_t *maddr = NULL; + int32_t ret = mman_map(NULL, pages, MMAN_MAP_PF_RW, 0, &maddr); + if (ret != E_OK) { + return 0; } - - uint8_t *oldbrk = heap_end; - uint8_t *newbrk = heap_end + inc; - - if (newbrk < heap_start) { - return (void *)-1; - } - - if (inc > 0) { - if (newbrk > heap_commit) { - size_t need = (size_t)(newbrk - heap_commit); - size_t extra = _roundpage(need); - uint8_t *maddr = NULL; - int32_t ret = mman_map(NULL, extra, MMAN_MAP_PF_RW, 0, &maddr); - if (ret != E_OK || maddr == NULL) { - return (void *)-1; - } - heap_commit += extra; - } - } - heap_end = newbrk; - return (void *)oldbrk; + string_memset(maddr, 0, pages); + _last = (void *)(maddr + inc); + return maddr; } + diff --git a/user/init/main.c b/user/init/main.c index 606516a..d9bf988 100644 --- a/user/init/main.c +++ b/user/init/main.c @@ -24,20 +24,19 @@ void main(void) { ipcpipe(IPCPIPE_SELFPID, 10, IPCPIPE_MAKE, NULL, 0); ipcpipe(IPCPIPE_SELFPID, 10, IPCPIPE_ADD_BCAST, NULL, 1); - - processctl(tb, PCTL_RUN, 0, 0, 0); #define OUTBUF_MAX 1024 - char *outbuf = dlmalloc(1024); + char *outbuf = dlmalloc(OUTBUF_MAX); - while(processctl(tb, PCTL_POLLSTATE, 0, 0, 0) != 4) { + processctl(tb, PCTL_RUN, 0, 0, 0); + + for(;;) { string_memset(outbuf, 0, OUTBUF_MAX); int32_t nrd = ipcpipe(PID, SUBPROC_PIPE_OUT, IPCPIPE_READ, (uint8_t *)outbuf, sizeof(outbuf)); if (nrd > 0) { uprintf("%s", outbuf); } -#if 0 int32_t kbchr; int32_t read = ipcpipe(IPCPIPE_SELFPID, 10, IPCPIPE_READ, (uint8_t *)&kbchr, sizeof(kbchr)); if (read > 0) { @@ -51,7 +50,6 @@ void main(void) { } } } -#endif } for(;;); diff --git a/user/pctl/main.o b/user/pctl/main.o index 2bdef2c498bd1cc039fe1356406415ada90caa4e..8b315e80e3dd2f2f47272f34ee1fcaaca5ba49c5 100644 GIT binary patch literal 7184 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 literal 7768 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 T2-Hy(pM%Fw{$E4<>G=NvTXOMo diff --git a/user/pctl/pctl b/user/pctl/pctl index 56c0d4a596f732dc33e2d7c2ff667d82dc07914f..a461af07f44e50606d557576b0bbe8c1c0f966a7 100755 GIT binary patch literal 61664 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%0AqJn@l8Y~> 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 literal 35096 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 if (tz->str[start] == '"') { start++; - do { - tz->pos++; - } while (tz->pos < tz->len && tz->str[tz->pos] != '"'); tz->pos++; - - out->ptr = tz->str + start; - out->len = tz->pos - start - 1; - + while (tz->pos < tz->len && tz->str[tz->pos] != '"') { + tz->pos++; + } + + if (tz->pos >= tz->len) { + out->ptr = tz->str + start; + out->len = tz->len - start; + tz->pos = tz->len; + } else { + out->ptr = tz->str + start; + out->len = tz->pos - start; + tz->pos++; + } } else { while (tz->pos < tz->len && !string_chr_isspace(tz->str[tz->pos])) { tz->pos++; @@ -65,6 +71,8 @@ int tz_next(Tokenizer *tz, Token *out) { } void tz_classify(Tokenizer *tz) { + const int tmpbufsz = 256; + char *tmpbuf = dlmalloc(tmpbufsz); Token *tk = tz->tokens; while (tk) { if (tk->ptr[0] == '"' && tk->ptr[tk->len - 1] == '"') { @@ -72,8 +80,8 @@ void tz_classify(Tokenizer *tz) { } else if (tk->ptr[0] == '@') { RtCmd *cmd = RTCMDS; while (cmd) { - char tmpbuf[0xff] = {0}; - usnprintf(tmpbuf, sizeof(tmpbuf), "%.*s", (int)tk->len, tk->ptr); + string_memset(tmpbuf, 0, tmpbufsz); + usnprintf(tmpbuf, tmpbufsz, "%.*s", (int)tk->len, tk->ptr); if (string_strcmp(tmpbuf, cmd->cmdname) == 0) { tk->type = TOK_CMD; tk->cmd = cmd; @@ -86,6 +94,7 @@ void tz_classify(Tokenizer *tz) { } tk = tk->next; } + dlfree(tmpbuf); } bool interp_readline(char *data, const char **bgptr, const char **endptr) { @@ -147,15 +156,14 @@ bool interp_runstring(const char *string, InterpResult **res) { rt_init(); bool ok = true; - const char *bg, *end; interp_readline((char *)string, NULL, NULL); while (interp_readline(NULL, &bg, &end)) { size_t linelen = end - bg; - Tokenizer tz = ZERO(&tz); + Tokenizer tz = {0}; tz_init(&tz, bg, linelen); - Token toktmp = ZERO(&toktmp); + Token toktmp = {0}; while (tz_next(&tz, &toktmp)) { Token *tok = dlmalloc(sizeof(*tok)); tok->ptr = toktmp.ptr; @@ -226,7 +234,6 @@ bool interp_runstring(const char *string, InterpResult **res) { tz_free(&tz); } - done: return ok; } diff --git a/user/tb/main.c b/user/tb/main.c index 169eaba..eb5034d 100644 --- a/user/tb/main.c +++ b/user/tb/main.c @@ -63,7 +63,7 @@ void do_file(char *filepath) { return; } - IoctlStat statbuf = ZERO(&statbuf); + IoctlStat statbuf = {0}; ioctl(ioh, IOCTL_STAT, (uint64_t)&statbuf, 0, 0); if (statbuf.type != IOCTLSTAT_FILE) {