diff options
author | Zachary Yedidia <zyedidia@gmail.com> | 2022-05-13 15:32:12 -0700 |
---|---|---|
committer | Zachary Yedidia <zyedidia@gmail.com> | 2022-05-13 15:32:12 -0700 |
commit | 1aef408ec5cd68af28f3c75e5599bc87a04b9e83 (patch) | |
tree | be0c52584aa49411a39095ba608bc9e2a3a83888 | |
parent | 4d16c701e4e498a5d2979cbc194b4e32f2b620b2 (diff) |
Use basic proc by default and fix dev barrier
-rw-r--r-- | defs.mk | 4 | ||||
-rw-r--r-- | kern/interrupts.c | 2 | ||||
-rw-r--r-- | kern/kern.c | 20 | ||||
-rw-r--r-- | kern/proc.c | 9 | ||||
-rw-r--r-- | kern/proc.h | 2 |
5 files changed, 22 insertions, 15 deletions
@@ -8,6 +8,8 @@ OBJCOPY = $(PREFIX)-objcopy OBJDUMP = $(PREFIX)-objdump QEMU = qemu-system-arm +# Custom qemu with dev barrier checking +# QEMU = /home/zyedidia/programming/qemu-dev/build/qemu-system-arm BOARD = raspi1ap GDB = gdb-multiarch @@ -20,7 +22,7 @@ ARCH = armv6zk PIOS ?= $(shell git rev-parse --show-toplevel) -CFLAGS = -O$(O) -g -Wall -nostdlib -nostartfiles -ffreestanding -Wa,-mcpu=$(CPU) -Wa,-march=$(ARCH) +CFLAGS = -O$(O) -g -Wall -Werror -nostdlib -nostartfiles -ffreestanding -Wa,-mcpu=$(CPU) -Wa,-march=$(ARCH) ASFLAGS = -mcpu=$(CPU) -march=$(ARCH) LDFLAGS = -T $(MEMMAP) LDLIBS = $(LIBGCC) diff --git a/kern/interrupts.c b/kern/interrupts.c index f140212..9c80a84 100644 --- a/kern/interrupts.c +++ b/kern/interrupts.c @@ -19,7 +19,7 @@ typedef struct { uint32_t disable_basic_irqs; } irq_ctrl_t; -static volatile irq_ctrl_t *const irq_ctrl = (irq_ctrl_t *) pa2ka(0x2000B200); +static volatile irq_ctrl_t *const irq_ctrl = (irq_ctrl_t *) pa2ka(0x2000b200); void irq_enable_basic(uint32_t irq) { irq_ctrl->enable_basic_irqs = bit_set(irq_ctrl->enable_basic_irqs, irq); diff --git a/kern/kern.c b/kern/kern.c index a99a8ce..39d0b4b 100644 --- a/kern/kern.c +++ b/kern/kern.c @@ -44,18 +44,24 @@ void kernel_start() { irq_init(); irq_enable(BASIC_TIMER_IRQ); + dsb(); timer_irq_load(0x1000); printf("kernel booted\n"); - extern unsigned char _binary_pidos_bin_start; - extern unsigned char _binary_pidos_bin_end; - - proc_t *p_pidos_1 = proc_new(&_binary_pidos_bin_start, (size_t) (&_binary_pidos_bin_end - &_binary_pidos_bin_start)); - proc_new(&_binary_pidos_bin_start, (size_t) (&_binary_pidos_bin_end - &_binary_pidos_bin_start)); - - // TODO/NOTE(masot): Currently, proc_run enables IRQs +#ifdef PIDOS + extern uint8_t _binary_pidos_bin_start; + extern uint8_t _binary_pidos_bin_end; + proc_t *p_pidos_1 = proc_new(&_binary_pidos_bin_start, &_binary_pidos_bin_end); + proc_new(&_binary_pidos_bin_start, &_binary_pidos_bin_end); + enable_interrupts(); // TODO: Set this in the SPSR proc_run(p_pidos_1); +#else + extern uint8_t _binary_basic_bin_start; + extern uint8_t _binary_basic_bin_end; + proc_t* p_basic = proc_new(&_binary_basic_bin_start, &_binary_basic_bin_end); + proc_run(p_basic); +#endif reboot(); return; diff --git a/kern/proc.c b/kern/proc.c index d08fad2..8fd8bc7 100644 --- a/kern/proc.c +++ b/kern/proc.c @@ -8,12 +8,14 @@ static pid_t id; proc_t procs[NPROC]; proc_t *curproc; -proc_t *proc_new(uint8_t *code, size_t codesz) { +proc_t *proc_new(uint8_t *code_start, uint8_t *code_end) { + size_t codesz = code_end - code_start; + proc_t *proc = &procs[id]; proc->id = id++; proc->pt = kalloc_pt(); proc->state = PROC_RUNNABLE; - proc->code = code; + proc->code = code_start; proc->codesz = codesz; // map kernel into pt for (uintptr_t pa = 0; pa < MEMSIZE_PHYSICAL; pa += SIZE_1MB) { @@ -42,7 +44,6 @@ void __attribute__((noreturn)) proc_run(proc_t *proc) { vm_set_pt(proc->pt); curproc = proc; - enable_interrupts(); // TODO: Set this in the SPSR // NOTE: To use SPSR, need to be sure we are *NOT* in user/system mode. // TODO(masot): add an assert like that set_spsr((get_cpsr() & ~0b11111) | 0b10000); @@ -51,8 +52,6 @@ void __attribute__((noreturn)) proc_run(proc_t *proc) { } } -thread_id = 0; - void swippityswap(regs_t *live_state, proc_t *new_thread, proc_t *old_thread) { memcpy(&(old_thread->regs), live_state, sizeof(regs_t)); memcpy(live_state, &(new_thread->regs), sizeof(regs_t)); diff --git a/kern/proc.h b/kern/proc.h index 592538e..6f04825 100644 --- a/kern/proc.h +++ b/kern/proc.h @@ -46,6 +46,6 @@ typedef struct { extern proc_t *curproc; -proc_t *proc_new(uint8_t *code, size_t codesz); +proc_t *proc_new(uint8_t *code_start, uint8_t *code_end); void proc_run(proc_t *proc); void proc_scheduler_irq(regs_t *regs); |