CeDOS - Commit 0044bb9c

Fixed critical sections
Celina Sophie Kalus
Fri, 19 Jan 2018 20:42:14 +0100
3 files changed, 35 insertions(+), 6 deletions(-)
M include/cedos/core.hinclude/cedos/core.h

@@ -14,6 +14,8 @@ void kpanic(const char* string);

void memdump(void* start, uint32_t size); void crit_enter(void); void crit_exit(void); +uint32_t crit_stash(void); +void crit_restore(uint32_t state); void hard_reset(void); #endif
M kernel/core.ckernel/core.c

@@ -159,16 +159,38 @@ stackdump();

while (1) {} } -uint32_t eflags_stack[20]; -uint32_t eflags_stack_index = 0; +uint32_t crit_sect_counter = 0; +uint32_t if_state = 0; + void crit_enter(void) { - eflags_stack[eflags_stack_index++] = get_eflags(); - cli(); + if (crit_sect_counter++ == 0) { + if_state = get_eflags() & (1 << 9); + cli(); + } } void crit_exit(void) { - if (eflags_stack_index > 0) { - set_eflags(eflags_stack[--eflags_stack_index]); + if (--crit_sect_counter == 0) { + uint32_t eflags = get_eflags() | if_state; + set_eflags(eflags); + } +} + +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); + } + return __csc; +} + +void crit_restore(uint32_t state) { + crit_sect_counter = state; + if (crit_sect_counter > 0) { + if_state = get_eflags() & (1 << 9); + cli(); } }
M kernel/sched/sched.ckernel/sched/sched.c

@@ -140,12 +140,17 @@ return 1;

} void sched_yield(void) { + crit_enter(); PROCESS *current = get_process(current_pid); if (current != NULL && current->state != PSTATE_TERMINATED) { current->state = PSTATE_BLOCKED; } + uint32_t csc = crit_stash(); INT(0x20); + crit_restore(csc); + + crit_exit(); } /**