summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/mmu.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-07-12 15:46:22 +0200
committercinap_lenrek <cinap_lenrek@localhost>2011-07-12 15:46:22 +0200
commitc6c2e04d4a700fe3982a4a72e768c69d6ace08a6 (patch)
treed64dc55189b55da8c7d01be1c981dda6dcab76dd /sys/src/9/pc/mmu.c
parentb429f72eaedff27b43c4ac951cea62f574e6fb23 (diff)
segdesc: add /dev/^(ldt gdt) support
Diffstat (limited to 'sys/src/9/pc/mmu.c')
-rw-r--r--sys/src/9/pc/mmu.c15
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;
+ }
}
/*