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 malloc_getpagesize 0x1000
#define EINVAL 0xdeadbeef #define EINVAL 0xdeadbeef
#define ENOMEM 0xb16b00b5 #define ENOMEM 0xb16b00b5
#define MORECORE_CONTIGUOUS 0
#define MLOCK_T SpinLock #define MLOCK_T SpinLock

View File

@ -17,6 +17,19 @@
#include "proc/ps2kbproc/ps2kbproc.h" #include "proc/ps2kbproc/ps2kbproc.h"
#include "rbuf/rbuf.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) { void hal_intr_disable(void) {
asm volatile("cli"); asm volatile("cli");
} }
@ -178,9 +191,7 @@ void hal_syscalldispatch(IntrStackFrame *frame) {
} }
void intr_eoi(uint8_t irq) { 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); io_out8(PIC1_CMD, PIC_EOI);
} }
@ -188,7 +199,8 @@ void intr_handleintr(IntrStackFrame *frame) {
if (frame->trapnum <= 31) { if (frame->trapnum <= 31) {
kprintf("ERROR %s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum); kprintf("ERROR %s, 0x%lX\n", exceptions[frame->trapnum], frame->errnum);
intr_dumpframe(frame); 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); kprintf("killed pid %ld %s\n", PROCS.current->pid, PROCS.current->name);
proc_killself(); proc_killself();
proc_sched((void *)frame); 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) { void hal_vmm_map_kern(uint64_t targetcr3) {
uint64_t *kcr3 = (uint64_t *)VIRT(KERNEL_CR3); uint64_t *kcr3 = (uint64_t *)VIRT(KERNEL_CR3);
uint64_t *cr3 = (uint64_t *)VIRT(targetcr3); 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]; 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_memset(VIRT(physaddr), 0, blocks * HAL_PAGE_SIZE);
hal_memcpy(VIRT(physaddr) + off, (data + phdr->p_offset), phdr->p_filesz); 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); hal_vmm_map_range(proc->platformdata.cr3, virtaddr, physaddr, blocks * HAL_PAGE_SIZE, pgflags);
VasRange *range = dlmalloc(sizeof(*range)); VasRange *range = dlmalloc(sizeof(*range));
@ -165,25 +168,8 @@ Proc *proc_spawnuser(char *mountpoint, char *path) {
range->pgflags = flags; range->pgflags = flags;
LL_APPEND(proc->vas, range); 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); ElfAuxval aux = proc_load_elf_segs(proc, data);
dlfree(data);
proc->platformdata.trapframe.ss = 0x20 | 0x3; proc->platformdata.trapframe.ss = 0x20 | 0x3;
proc->platformdata.trapframe.rsp = (uint64_t)virttop; proc->platformdata.trapframe.rsp = (uint64_t)virttop;

View File

@ -11,7 +11,7 @@
#define PROC_NAME_MAX 0x100 #define PROC_NAME_MAX 0x100
#define PROC_STACKBLOCKS 256 #define PROC_STACKBLOCKS (1024*4)
#define PROC_STACKSIZE (PROC_STACKBLOCKS * BITMAP_BLOCK_SIZE) #define PROC_STACKSIZE (PROC_STACKBLOCKS * BITMAP_BLOCK_SIZE)
#define PROC_MAX 0x100 // max amount of processes #define PROC_MAX 0x100 // max amount of processes
@ -19,8 +19,8 @@
#define PROC_VFSHANDLES_MAX 0x80 #define PROC_VFSHANDLES_MAX 0x80
#define PROC_PIPEHANDLES_MAX 0x20 #define PROC_PIPEHANDLES_MAX 0x20
#define PROC_MMAN_MAP_BASE 0x0000004000000000ULL #define PROC_MMAN_MAP_BASE 0x700000000000
#define PROC_USER_STACK_TOP 0x00007ffffffff000ULL #define PROC_USER_STACK_TOP 0x800000000000
typedef struct { typedef struct {
IntrStackFrame trapframe; IntrStackFrame trapframe;

View File

@ -9,4 +9,4 @@ CFLAGS += -m64 \
-fno-stack-protector \ -fno-stack-protector \
-fno-stack-check \ -fno-stack-check \
-fno-builtin \ -fno-builtin \
-Os \ -O0 \

View File

@ -8,15 +8,13 @@
#include <log.h> #include <log.h>
extern void main(void); extern void main(void);
extern uint8_t _bss_start; extern uint8_t _bss_start[];
extern uint8_t _bss_end; extern uint8_t _bss_end[];
void clearbss(void) { void clearbss(void) {
uint8_t *ps = &_bss_start; uint8_t *p = _bss_start;
uint8_t *pe = &_bss_end; while (p < _bss_end) {
size_t sz = pe - ps; *p++ = 0;
for (size_t i = 0; i < sz; i++) {
ps[i] = 0;
} }
} }

View File

@ -22,6 +22,7 @@
#define LACKS_STRINGS_H 1 #define LACKS_STRINGS_H 1
#define LACKS_SCHED_H 1 #define LACKS_SCHED_H 1
#define HAVE_MMAP 0 #define HAVE_MMAP 0
#define MORECORE_CONTIGUOUS 0
#define ABORT \ #define ABORT \
do { \ do { \
uprintf("dlmalloc: Aborting...\n"); \ uprintf("dlmalloc: Aborting...\n"); \
@ -54,50 +55,28 @@ static MLOCK_T malloc_global_mutex = { 0 };
#define PAGE_SIZE 0x1000 #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) { static size_t _roundpage(size_t sz) {
return (sz + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); return (sz + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
} }
void *_last = 0;
void *sbrk(ptrdiff_t inc) { void *sbrk(ptrdiff_t inc) {
if (!heap_end) { if (inc < 0) {
size_t allocsz = PAGE_SIZE; return 0;
}
if (!inc) {
return _last;
}
uint64_t pages = _roundpage(inc);
uint8_t *maddr = NULL; uint8_t *maddr = NULL;
int32_t ret = mman_map(NULL, allocsz, MMAN_MAP_PF_RW, 0, &maddr); int32_t ret = mman_map(NULL, pages, MMAN_MAP_PF_RW, 0, &maddr);
if (ret != E_OK || maddr == NULL) { if (ret != E_OK) {
return (void *)-1; return 0;
} }
heap_start = maddr; string_memset(maddr, 0, pages);
heap_end = maddr; _last = (void *)(maddr + inc);
heap_commit = maddr + allocsz; return maddr;
} }
if (inc == 0) {
return heap_end;
}
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;
}

View File

@ -25,19 +25,18 @@ void main(void) {
ipcpipe(IPCPIPE_SELFPID, 10, IPCPIPE_MAKE, NULL, 0); ipcpipe(IPCPIPE_SELFPID, 10, IPCPIPE_MAKE, NULL, 0);
ipcpipe(IPCPIPE_SELFPID, 10, IPCPIPE_ADD_BCAST, NULL, 1); ipcpipe(IPCPIPE_SELFPID, 10, IPCPIPE_ADD_BCAST, NULL, 1);
#define OUTBUF_MAX 1024
char *outbuf = dlmalloc(OUTBUF_MAX);
processctl(tb, PCTL_RUN, 0, 0, 0); processctl(tb, PCTL_RUN, 0, 0, 0);
#define OUTBUF_MAX 1024 for(;;) {
char *outbuf = dlmalloc(1024);
while(processctl(tb, PCTL_POLLSTATE, 0, 0, 0) != 4) {
string_memset(outbuf, 0, OUTBUF_MAX); string_memset(outbuf, 0, OUTBUF_MAX);
int32_t nrd = ipcpipe(PID, SUBPROC_PIPE_OUT, IPCPIPE_READ, (uint8_t *)outbuf, sizeof(outbuf)); int32_t nrd = ipcpipe(PID, SUBPROC_PIPE_OUT, IPCPIPE_READ, (uint8_t *)outbuf, sizeof(outbuf));
if (nrd > 0) { if (nrd > 0) {
uprintf("%s", outbuf); uprintf("%s", outbuf);
} }
#if 0
int32_t kbchr; int32_t kbchr;
int32_t read = ipcpipe(IPCPIPE_SELFPID, 10, IPCPIPE_READ, (uint8_t *)&kbchr, sizeof(kbchr)); int32_t read = ipcpipe(IPCPIPE_SELFPID, 10, IPCPIPE_READ, (uint8_t *)&kbchr, sizeof(kbchr));
if (read > 0) { if (read > 0) {
@ -51,7 +50,6 @@ void main(void) {
} }
} }
} }
#endif
} }
for(;;); for(;;);

Binary file not shown.

Binary file not shown.

View File

@ -45,14 +45,20 @@ int tz_next(Tokenizer *tz, Token *out) {
size_t start = tz->pos; size_t start = tz->pos;
if (tz->str[start] == '"') { if (tz->str[start] == '"') {
start++; start++;
do {
tz->pos++; tz->pos++;
} while (tz->pos < tz->len && tz->str[tz->pos] != '"'); while (tz->pos < tz->len && tz->str[tz->pos] != '"') {
tz->pos++; tz->pos++;
}
if (tz->pos >= tz->len) {
out->ptr = tz->str + start; out->ptr = tz->str + start;
out->len = tz->pos - start - 1; out->len = tz->len - start;
tz->pos = tz->len;
} else {
out->ptr = tz->str + start;
out->len = tz->pos - start;
tz->pos++;
}
} else { } else {
while (tz->pos < tz->len && !string_chr_isspace(tz->str[tz->pos])) { while (tz->pos < tz->len && !string_chr_isspace(tz->str[tz->pos])) {
tz->pos++; tz->pos++;
@ -65,6 +71,8 @@ int tz_next(Tokenizer *tz, Token *out) {
} }
void tz_classify(Tokenizer *tz) { void tz_classify(Tokenizer *tz) {
const int tmpbufsz = 256;
char *tmpbuf = dlmalloc(tmpbufsz);
Token *tk = tz->tokens; Token *tk = tz->tokens;
while (tk) { while (tk) {
if (tk->ptr[0] == '"' && tk->ptr[tk->len - 1] == '"') { if (tk->ptr[0] == '"' && tk->ptr[tk->len - 1] == '"') {
@ -72,8 +80,8 @@ void tz_classify(Tokenizer *tz) {
} else if (tk->ptr[0] == '@') { } else if (tk->ptr[0] == '@') {
RtCmd *cmd = RTCMDS; RtCmd *cmd = RTCMDS;
while (cmd) { while (cmd) {
char tmpbuf[0xff] = {0}; string_memset(tmpbuf, 0, tmpbufsz);
usnprintf(tmpbuf, sizeof(tmpbuf), "%.*s", (int)tk->len, tk->ptr); usnprintf(tmpbuf, tmpbufsz, "%.*s", (int)tk->len, tk->ptr);
if (string_strcmp(tmpbuf, cmd->cmdname) == 0) { if (string_strcmp(tmpbuf, cmd->cmdname) == 0) {
tk->type = TOK_CMD; tk->type = TOK_CMD;
tk->cmd = cmd; tk->cmd = cmd;
@ -86,6 +94,7 @@ void tz_classify(Tokenizer *tz) {
} }
tk = tk->next; tk = tk->next;
} }
dlfree(tmpbuf);
} }
bool interp_readline(char *data, const char **bgptr, const char **endptr) { 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(); rt_init();
bool ok = true; bool ok = true;
const char *bg, *end; const char *bg, *end;
interp_readline((char *)string, NULL, NULL); interp_readline((char *)string, NULL, NULL);
while (interp_readline(NULL, &bg, &end)) { while (interp_readline(NULL, &bg, &end)) {
size_t linelen = end - bg; size_t linelen = end - bg;
Tokenizer tz = ZERO(&tz); Tokenizer tz = {0};
tz_init(&tz, bg, linelen); tz_init(&tz, bg, linelen);
Token toktmp = ZERO(&toktmp); Token toktmp = {0};
while (tz_next(&tz, &toktmp)) { while (tz_next(&tz, &toktmp)) {
Token *tok = dlmalloc(sizeof(*tok)); Token *tok = dlmalloc(sizeof(*tok));
tok->ptr = toktmp.ptr; tok->ptr = toktmp.ptr;
@ -226,7 +234,6 @@ bool interp_runstring(const char *string, InterpResult **res) {
tz_free(&tz); tz_free(&tz);
} }
done: done:
return ok; return ok;
} }

View File

@ -63,7 +63,7 @@ void do_file(char *filepath) {
return; return;
} }
IoctlStat statbuf = ZERO(&statbuf); IoctlStat statbuf = {0};
ioctl(ioh, IOCTL_STAT, (uint64_t)&statbuf, 0, 0); ioctl(ioh, IOCTL_STAT, (uint64_t)&statbuf, 0, 0);
if (statbuf.type != IOCTLSTAT_FILE) { if (statbuf.type != IOCTLSTAT_FILE) {