scheduler: interrupt thing fix

This commit is contained in:
Matheus
2024-05-28 17:47:06 -03:00
parent 0030a0b21b
commit b28e556a81
+6 -2
View File
@@ -14,7 +14,7 @@
#include <kernel/cmdline.h> #include <kernel/cmdline.h>
#define QUANTUM_US 100000 #define QUANTUM_US 100000
#define SCHEDULER_STACK_SIZE PAGE_SIZE #define SCHEDULER_STACK_SIZE PAGE_SIZE * 16
static scache_t *threadcache; static scache_t *threadcache;
static scache_t *processcache; static scache_t *processcache;
@@ -404,18 +404,20 @@ static void userspacecheck(void *_args) {
} }
static void checktrampoline(context_t *context, void *_args) { static void checktrampoline(context_t *context, void *_args) {
__assert(ARCH_CONTEXT_INTSTATUS(context) == false);
checkargs_t *args = _args; checkargs_t *args = _args;
userspacecheck(args); userspacecheck(args);
_cpu()->intstatus = ARCH_CONTEXT_INTSTATUS(args->context); _cpu()->intstatus = ARCH_CONTEXT_INTSTATUS(args->context);
arch_context_switch(args->context); arch_context_switch(args->context);
} }
// called right before going back to userspace in places like the syscall handler or arch_context_switch // called right before going back to userspace in the syscall handler, interrupt handler and arch_context_switch
__attribute__((no_caller_saved_registers)) void sched_userspacecheck(context_t *context, bool syscall, uint64_t syscallerrno, uint64_t syscallret) { __attribute__((no_caller_saved_registers)) void sched_userspacecheck(context_t *context, bool syscall, uint64_t syscallerrno, uint64_t syscallret) {
__assert(_cpu()); __assert(_cpu());
if (_cpu()->thread == NULL || ARCH_CONTEXT_ISUSER(context) == false) if (_cpu()->thread == NULL || ARCH_CONTEXT_ISUSER(context) == false)
return; return;
bool intstatus = interrupt_set(false);
checkargs_t args = { checkargs_t args = {
.context = context, .context = context,
@@ -432,6 +434,8 @@ __attribute__((no_caller_saved_registers)) void sched_userspacecheck(context_t *
} else { } else {
userspacecheck(&args); userspacecheck(&args);
} }
_cpu()->intstatus = intstatus;
} }
void sched_stopotherthreads() { void sched_stopotherthreads() {