Fri, 19 Jan 2018 20:42:14 +0100
3 files changed,
35 insertions(+),
6 deletions(-)
M
include/cedos/core.h
→
include/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.c
→
kernel/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.c
→
kernel/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(); } /**