Resolve hisenbugs regarding GCC and -Os

This commit is contained in:
2025-09-17 21:48:16 +02:00
parent 0a5523f234
commit 91e65bb35a
13 changed files with 74 additions and 93 deletions

View File

@ -34,6 +34,7 @@
#define malloc_getpagesize 0x1000
#define EINVAL 0xdeadbeef
#define ENOMEM 0xb16b00b5
#define MORECORE_CONTIGUOUS 0
#define MLOCK_T SpinLock

View File

@ -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);

View File

@ -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];
}
}

View File

@ -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;

View File

@ -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;