CeDOS - Commit 24161951

how did this even work before?!?!
Celina Sophie Kalus
Sat, 29 Apr 2023 13:31:25 +0200
5 files changed, 36 insertions(+), 26 deletions(-)
M include/cedos/interrupts.hinclude/cedos/interrupts.h

@@ -28,9 +28,9 @@ uint16_t offset_16;

}__attribute__((packed)) IDT_ENTRY; typedef struct { - uint32_t eflags; - uint32_t cs; uint32_t eip; + uint32_t cs; + uint32_t eflags; }__attribute__((packed)) INTERRUPT_FRAME; typedef uint32_t uword_t;
M src/kernel/core.csrc/kernel/core.c

@@ -201,8 +201,8 @@ uint32_t crit_stash(void) {

uint32_t __csc = crit_sect_counter; crit_sect_counter = 0; if (__csc > 0) { - uint32_t eflags = get_eflags() | if_state; - set_eflags(eflags); + if_state = get_eflags() & (1 << 9); + sti(); } return __csc; }

@@ -210,8 +210,8 @@

void crit_restore(uint32_t state) { crit_sect_counter = state; if (crit_sect_counter > 0) { - if_state = get_eflags() & (1 << 9); - cli(); + uint32_t eflags = get_eflags() | if_state; + set_eflags(eflags); } }
M src/kernel/drivers/ps2_keyboard.csrc/kernel/drivers/ps2_keyboard.c

@@ -48,7 +48,7 @@ ps2_kb_read

}; uint8_t buffer[BUFFER_LENGTH]; -uint32_t buffer_head, buffer_tail; +volatile uint32_t buffer_head, buffer_tail; __attribute__((always_inline)) inline void buffer_enqueue(uint8_t value) { buffer[buffer_head] = value;

@@ -104,7 +104,7 @@ }

uint8_t ps2_kb_read(void) { while (buffer_empty()) { - PRINT_DBG("yield.\n"); + //PRINT_DBG("yield.\n"); sched_yield(); }
M src/kernel/main.csrc/kernel/main.c

@@ -51,12 +51,12 @@ printk("Setting up paging...");

paging_init(); printk("done.\n"); - printk("Initiallizing malloc..."); - malloc_init(); - printk("done.\n"); - printk("Activating interrupts..."); sti(); + printk("done.\n"); + + printk("Initiallizing malloc..."); + malloc_init(); printk("done.\n"); printk("Installing syscalls...");
M src/kernel/sched/sched.csrc/kernel/sched/sched.c

@@ -21,7 +21,7 @@

#define KERNEL_PRIVATE_STACK (void*)(0xC0600000) #define USER_STACK (void*)(0xC0000000) -#define PROCESS_STD_EFLAGS (0x00000286) +#define PROCESS_STD_EFLAGS (0x00000200) #ifdef DEBUG #define PRINT_DBG(...) printk("[" __FILE__ "] " __VA_ARGS__)

@@ -69,11 +69,16 @@

// set process context PROCESS *p = get_slot(); p->page_dir = page_dir; - p->eip = sched_dispatcher; p->ebp = USER_STACK; p->esp = USER_STACK - sizeof(SCHED_FRAME); p->eflags = PROCESS_STD_EFLAGS; p->entry = (PROCESS_MAIN*)(0xDEADBEEF); + + if (name == NULL) { + p->eip = entry_idle; + } else { + p->eip = sched_dispatcher; + } if (flags != 0) { p->stdin = (int)(flags & 0xFF);

@@ -101,12 +106,7 @@ frame.ebp = (uint32_t)(p->ebp);

frame.esp = (uint32_t)(p->esp); frame.eflags = p->eflags; frame.cs = 0x18; - - if (name == NULL) { - frame.eip = (uint32_t)(entry_idle); - } else { - frame.eip = (uint32_t)(sched_dispatcher); - } + frame.eip = (uint32_t)(p->eip); // load stack copy_to_pdir(&frame, sizeof(frame), p->page_dir, p->esp);

@@ -162,6 +162,11 @@ // prepare to return to process

PROCESS* next = get_process(current_pid); switch_page_dir(next->page_dir); + PRINT_DBG("esp: %p\n", next->esp); + PRINT_DBG("ebp: %p\n", next->ebp); + PRINT_DBG("eip: %p\n", next->eip); + PRINT_DBG("eflags: %p\n", next->eflags); + STACK_CHECKSUM checksum; stack_compute_checksum(&(checksum), next->esp, next->ebp);

@@ -175,16 +180,21 @@

// prepare stack frame = (volatile SCHED_FRAME*)(next->esp); ebp = next->ebp; - /*frame->cs = 0x08; - frame->eip = next->eip; - frame->eflags = (uint32_t)(next->eflags); - frame->esp = (uint32_t)(next->esp); - frame->ebp = (uint32_t)(next->ebp);*/ + + if (current_pid == 0) { + frame->cs = 0x18; + frame->eip = next->eip; + frame->eflags = (uint32_t)(next->eflags); + frame->esp = (uint32_t)(next->esp); + frame->ebp = (uint32_t)(next->ebp); + } + + PRINT_DBG("esp: %p, ebp: %p, eip: %p, eflags: %p\n", frame->esp, frame->ebp, frame->eip, frame->eflags); // reset the timer pit_setup_channel(PIT_CHANNEL_0, PIT_MODE_0, SCHED_INTERVAL); - + pic1_eoi(); }