diff options
author | rtm <rtm> | 2006-06-13 15:50:06 +0000 |
---|---|---|
committer | rtm <rtm> | 2006-06-13 15:50:06 +0000 |
commit | 0a70d042d04e084da4226e7d0d684dedcae06d78 (patch) | |
tree | 3dfa629b4e4b44b399fb13b384ed9b50dd03f997 /proc.c | |
parent | 70a895f63c504f255a28f63efdcfc6b39b2572c5 (diff) | |
download | xv6-labs-0a70d042d04e084da4226e7d0d684dedcae06d78.tar.gz xv6-labs-0a70d042d04e084da4226e7d0d684dedcae06d78.tar.bz2 xv6-labs-0a70d042d04e084da4226e7d0d684dedcae06d78.zip |
more or less take traps/interrupts
Diffstat (limited to 'proc.c')
-rw-r--r-- | proc.c | 15 |
1 files changed, 11 insertions, 4 deletions
@@ -20,7 +20,8 @@ setupsegs(struct proc *p) p->ts.ts_ss0 = SEG_KDATA << 3; p->ts.ts_esp0 = (unsigned)(p->kstack + KSTACKSIZE); - memset(&p->gdt, 0, sizeof(p->gdt)); + // XXX it may be wrong to modify the current segment table! + p->gdt[0] = SEG_NULL; p->gdt[SEG_KCODE] = SEG(STA_X|STA_R, 0, 0xffffffff, 0); p->gdt[SEG_KDATA] = SEG(STA_W, 0, 0xffffffff, 0); @@ -73,7 +74,7 @@ newproc(struct proc *op) np->esp = (unsigned) sp; np->ebp = (unsigned) sp; - cprintf("esp %x ebp %x mem %x\n", np->esp, np->ebp, np->mem); + cprintf("newproc esp %x ebp %x mem %x\n", np->esp, np->ebp, np->mem); return np; } @@ -101,12 +102,18 @@ swtch(struct proc *op) op->ebp = read_ebp(); op->esp = read_esp(); + cprintf("switching\n"); + // XXX callee-saved registers? + // XXX probably ought to lgdt on trap return too + + asm volatile("lgdt %0" : : "g" (np->gdt_pd.pd_lim)); + ltr(SEG_TSS << 3); + // this happens to work, but probably isn't safe: - // it's not clear that np->ebp will evaluate + // it's not clear that np->ebp is guaranteed to evaluate // correctly after changing the stack pointer. - asm volatile("lgdt %0" : : "g" (np->gdt_pd.pd_lim)); asm volatile("movl %0, %%esp" : : "g" (np->esp)); asm volatile("movl %0, %%ebp" : : "g" (np->ebp)); } |