diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-07-12 15:46:22 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-07-12 15:46:22 +0200 |
commit | c6c2e04d4a700fe3982a4a72e768c69d6ace08a6 (patch) | |
tree | d64dc55189b55da8c7d01be1c981dda6dcab76dd /sys/src/9/pc/mmu.c | |
parent | b429f72eaedff27b43c4ac951cea62f574e6fb23 (diff) |
segdesc: add /dev/^(ldt gdt) support
Diffstat (limited to 'sys/src/9/pc/mmu.c')
-rw-r--r-- | sys/src/9/pc/mmu.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/sys/src/9/pc/mmu.c b/sys/src/9/pc/mmu.c index 823c9a6d8..8e7506f7a 100644 --- a/sys/src/9/pc/mmu.c +++ b/sys/src/9/pc/mmu.c @@ -294,6 +294,8 @@ void mmuswitch(Proc* proc) { ulong *pdb; + ulong x; + int n; if(proc->newtlb){ mmuptefree(proc); @@ -307,6 +309,14 @@ mmuswitch(Proc* proc) taskswitch(proc->mmupdb->pa, (ulong)(proc->kstack+KSTACK)); }else taskswitch(PADDR(m->pdb), (ulong)(proc->kstack+KSTACK)); + + memmove(&m->gdt[PROCSEG0], proc->gdt, sizeof(proc->gdt)); + if((x = (ulong)proc->ldt) && (n = proc->nldt) > 0){ + m->gdt[LDTSEG].d0 = (x<<16)|((n * sizeof(Segdesc)) - 1); + m->gdt[LDTSEG].d1 = (x&0xFF000000)|((x>>16)&0xFF)|SEGLDT|SEGPL(0)|SEGP; + lldt(LDTSEL); + } else + lldt(NULLSEL); } /* @@ -366,6 +376,11 @@ mmurelease(Proc* proc) if(proc->mmufree && palloc.r.p) wakeup(&palloc.r); proc->mmufree = 0; + if(proc->ldt){ + free(proc->ldt); + proc->ldt = nil; + proc->nldt = 0; + } } /* |