summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/asm.s14
-rw-r--r--kernel/sched.c25
2 files changed, 6 insertions, 33 deletions
diff --git a/kernel/asm.s b/kernel/asm.s
index 6d35334..fc36171 100644
--- a/kernel/asm.s
+++ b/kernel/asm.s
@@ -11,6 +11,7 @@ extern save_state
switch_to:
push ebp
mov ebp, esp
+ push ebx
; abort if we're switching to the current task
mov ebx, [ctask]
cmp ebx, [ebp+12]
@@ -18,16 +19,6 @@ switch_to:
pop ebp
ret
.skip:
- ; clear the busy flag in the current TSS
- mov eax, 0
- str ax
- add ax, gdt+5
- mov byte [eax], 0x89
- ; set the current TSS to null so it won't be overwritten by the switch
- mov ax, 0
- ltr ax
- ; copy the saved state into the previous TSS
- call save_state
; update ctask and ctaskn
mov ebx, [ebp+12]
mov [ctask], ebx
@@ -39,6 +30,9 @@ switch_to:
shl ebx, 3
mov [.tmp+4], bx
jmp far [.tmp]
+ pop ebx
+ pop ebp
+ ret
.tmp:
dq 0
diff --git a/kernel/sched.c b/kernel/sched.c
index c9f0da9..675867c 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -208,28 +208,6 @@ void sched_init(void) {
switch_to(0, &tasks[0]);
}
-void save_state(void) {
- if(ctask == NULL || cstate == NULL)
- return;
-
- ctask->state.eax = cstate->eax;
- ctask->state.ebx = cstate->ebx;
- ctask->state.ecx = cstate->ecx;
- ctask->state.edx = cstate->edx;
- ctask->state.esi = cstate->esi;
- ctask->state.edi = cstate->edi;
- ctask->state.esp = cstate->esp;
- ctask->state.ebp = cstate->ebp;
- ctask->state.cs = cstate->cs;
- ctask->state.ds = cstate->ds;
- ctask->state.es = cstate->ds;
- ctask->state.fs = cstate->ds;
- ctask->state.gs = cstate->ds;
- ctask->state.ss = cstate->ss;
- ctask->state.eflags = cstate->eflags;
- ctask->state.eip = cstate->eip;
-}
-
void reschedule(void) {
int i;
uint32_t n;
@@ -241,8 +219,9 @@ void reschedule(void) {
for(i = 0; i < NRTASKS; i++) {
n = (n + 1) % NRTASKS;
if(tasks[n].pid)
- switch_to(n, &tasks[n]);
+ break;
}
+ switch_to(n, &tasks[n]);
}
void sched_tick(void) {