Sat, 29 Apr 2023 13:31:25 +0200
5 files changed,
36 insertions(+),
26 deletions(-)
M
include/cedos/interrupts.h
→
include/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.c
→
src/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.c
→
src/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.c
→
src/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.c
→
src/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(); }