CeDOS - Commit 784baa84

Fixed a problem with the scheduler which made it impossible to get keyboard input
Celina Kalus
Sat, 25 Mar 2023 13:43:45 +0100
4 files changed, 32 insertions(+), 14 deletions(-)
M run.shrun.sh

@@ -1,1 +1,1 @@

-qemu-system-i386 -drive index=0,if=floppy,format=raw,file=./build/release/cedos.img -m 64 -monitor stdio -no-reboot -d int,cpu_reset,exec,in_asm -vnc :0 2> log/run_err.log+qemu-system-i386 -drive index=0,if=floppy,format=raw,file=./build/release/cedos.img -m 64 -monitor stdio -no-reboot -d int,cpu_reset,exec,in_asm 2> log/run_err.log
M src/kernel/drivers/ps2_keyboard.csrc/kernel/drivers/ps2_keyboard.c

@@ -22,6 +22,12 @@ #define PS2_FAILURE 0xFC

#define BUFFER_LENGTH (128) +#ifdef DEBUG +#define PRINT_DBG(...) printk("[" __FILE__ "] " __VA_ARGS__) +#else +#define PRINT_DBG(...) {} +#endif + /*! * Initializes the PS/2 keyboard. * \return 1 on success, 0 on fail

@@ -98,6 +104,7 @@ }

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

@@ -20,6 +20,12 @@ #define USER_STACK (void*)(0xC0000000)

#define PROCESS_STD_EFLAGS (0x00000286) +#ifdef DEBUG +#define PRINT_DBG(...) printk("[" __FILE__ "] " __VA_ARGS__) +#else +#define PRINT_DBG(...) {} +#endif + PROCESS* get_slot(void) { static PROCESS free_slots[8]; static uint32_t index = 0;

@@ -37,7 +43,7 @@

void entry_idle(char *args) { while (1) { - //printk("idle.\n"); + } }

@@ -66,6 +72,7 @@ p->name = &(p->name_buf);

p->args = &(p->args_buf); PROCESS_ID pid = add_process(p, current_pid); + p->id = pid; // setup stack static SCHED_FRAME frame;

@@ -107,12 +114,21 @@ current->ebp = ebp;

current->eip = frame->eip; current->eflags = frame->eflags; + + // save stack checksum stack_compute_checksum(&(current->checksum), current->esp, current->ebp); } + PRINT_DBG("esp: %p\n", current->esp); + PRINT_DBG("ebp: %p\n", current->ebp); + PRINT_DBG("eip: %p\n", current->eip); + PRINT_DBG("eflags: %p\n", current->eflags); + // select next process + PRINT_DBG("exiting %i, ", current_pid); current_pid = next_schedule(current_pid); + PRINT_DBG("entering %i\n", current_pid); // unblock all blocked processes for (PROCESS *p = get_first_process(); p != NULL; p = p->next) {

@@ -140,7 +156,7 @@ frame = (volatile SCHED_FRAME*)(next->esp);

ebp = next->ebp; //frame->cs = 0x08; //frame->eip = next->eip; - //frame->eflags = next->eflags; + frame->eflags = next->eflags; frame->esp = next->esp; frame->ebp = next->ebp;

@@ -167,7 +183,7 @@ }

void sched_yield(void) { crit_enter(); - //printk("yield.\n"); + //PRINT_DBG("yield.\n"); PROCESS *current = get_process(current_pid); if (current != NULL && current->state != PSTATE_TERMINATED) { current->state = PSTATE_READY;

@@ -175,6 +191,7 @@ //current->state = PSTATE_RUNNING;

} uint32_t csc = crit_stash(); + sti(); INT(0x20); crit_restore(csc);

@@ -226,7 +243,7 @@ pic_mask_interrupt(0);

} int sched_dispatcher(void) { - //printk("Dispatching process %i...\n", current_pid); + //PRINT_DBG("Dispatching process %i...\n", current_pid); PROCESS* this = get_process(current_pid);

@@ -234,7 +251,7 @@

// enter the actual program elf_exec(this->name, this->args); - //printk("Process %i terminated.\n", current_pid); + //PRINT_DBG("Process %i terminated.\n", current_pid); sched_kill(current_pid);
M src/kernel/sched/sched_strats.csrc/kernel/sched/sched_strats.c

@@ -5,16 +5,10 @@

PROCESS_ID next_schedule(PROCESS_ID current) { PROCESS* process = get_process(current); - if (process != NULL && process->next != NULL && process->state == PSTATE_READY) { + if (process != NULL && process->next != NULL) { return process->next->id; } else { PROCESS *first = get_first_process(); - if (first != NULL && first->id != 0 && first->state == PSTATE_READY) { - return first->id; - } else if (first != NULL && first->next != NULL && first->next->state == PSTATE_READY) { - return first->next->id; - } else { - return 0; - } + return first->id; } }