summaryrefslogtreecommitdiffstats
path: root/arch/x86_64/proc/scheduler.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/proc/scheduler.c')
-rw-r--r--arch/x86_64/proc/scheduler.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/arch/x86_64/proc/scheduler.c b/arch/x86_64/proc/scheduler.c
index 49a0c4d..6c748c7 100644
--- a/arch/x86_64/proc/scheduler.c
+++ b/arch/x86_64/proc/scheduler.c
@@ -1,5 +1,7 @@
#include "proc/scheduler.h"
#include "arch/x86_64/hal/gdt.h"
+#include "arch/x86_64/hal/obj.h"
+#include "lib/printf.h"
#include "lib/string.h"
#include "process.h"
#include "../hal/smp.h"
@@ -12,10 +14,15 @@ _scheduler_switch_pcb_arch(pcb_t *target)
proc->syscall_page = target->interrupt_page;
proc->interrupt_page = target->interrupt_page;
+ proc->tss.rsp[0] = __interrupt_stack + 0xFF8;
+
if(target->iopb) {
proc->tss.iopb = sizeof(struct tss);
jove_owned_obj_t *iopb_obj = obj_take(target->iopb);
- memcpy(proc->iopb, obj_deref(iopb_obj), sizeof(proc->iopb));
+ if(obj_gettype(iopb_obj) != JOVE_OBJ_IOPB) {
+ memcpy(proc->iopb, obj_deref(iopb_obj), sizeof(proc->iopb));
+ }
+ obj_release(iopb_obj);
}else{
proc->tss.iopb = 0xff;
}