summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2017-06-13 00:10:36 +0000
committeraiju <devnull@localhost>2017-06-13 00:10:36 +0000
commit13869bab113881f28ac72de7d8a68bb8bb5d9c38 (patch)
tree932d35a419a30348a02771509208c0b9292978a5 /sys
parente8082c1d1f09c04afb399ecdd63a79446e3bc390 (diff)
pc/pc64: keep shadow copy of DR7 in Mach and use that to check whether we need to reset DR7 in procsave(); remove superfluous reset of DR7 in mmurelease()
Diffstat (limited to 'sys')
-rw-r--r--sys/src/9/pc/dat.h2
-rw-r--r--sys/src/9/pc/main.c9
-rw-r--r--sys/src/9/pc/mmu.c2
-rw-r--r--sys/src/9/pc64/dat.h2
-rw-r--r--sys/src/9/pc64/main.c8
-rw-r--r--sys/src/9/pc64/mmu.c2
6 files changed, 17 insertions, 8 deletions
diff --git a/sys/src/9/pc/dat.h b/sys/src/9/pc/dat.h
index 14f406389..452b613da 100644
--- a/sys/src/9/pc/dat.h
+++ b/sys/src/9/pc/dat.h
@@ -258,6 +258,8 @@ struct Mach
uvlong tscticks;
int pdballoc;
int pdbfree;
+
+ u32int dr7; /* shadow copy of dr7 */
int stack[1];
};
diff --git a/sys/src/9/pc/main.c b/sys/src/9/pc/main.c
index bb4422325..e9ee24acc 100644
--- a/sys/src/9/pc/main.c
+++ b/sys/src/9/pc/main.c
@@ -844,8 +844,10 @@ procrestore(Proc *p)
{
uvlong t;
- if(p->dr[7] != 0)
+ if(p->dr[7] != 0){
+ m->dr7 = p->dr[7];
putdr(p->dr);
+ }
if(p->kp)
return;
@@ -863,8 +865,11 @@ procsave(Proc *p)
{
uvlong t;
- if(p->dr[7] != 0)
+ /* we could just always putdr7(0) but accessing DR7 might be slow in a VM */
+ if(m->dr7 != 0){
+ m->dr7 = 0;
putdr7(0);
+ }
cycles(&t);
p->kentry -= t;
diff --git a/sys/src/9/pc/mmu.c b/sys/src/9/pc/mmu.c
index dc8546f6f..2e77aaee7 100644
--- a/sys/src/9/pc/mmu.c
+++ b/sys/src/9/pc/mmu.c
@@ -387,8 +387,6 @@ mmurelease(Proc* proc)
proc->ldt = nil;
proc->nldt = 0;
}
- if(proc->dr[7] != 0)
- putdr7(0);
}
/*
diff --git a/sys/src/9/pc64/dat.h b/sys/src/9/pc64/dat.h
index 1f7a4717c..e942e51e9 100644
--- a/sys/src/9/pc64/dat.h
+++ b/sys/src/9/pc64/dat.h
@@ -223,6 +223,8 @@ struct Mach
int havepge;
int havewatchpt8;
uvlong tscticks;
+
+ u64int dr7; /* shadow copy of dr7 */
uintptr stack[1];
};
diff --git a/sys/src/9/pc64/main.c b/sys/src/9/pc64/main.c
index ea920fe56..24bb0d073 100644
--- a/sys/src/9/pc64/main.c
+++ b/sys/src/9/pc64/main.c
@@ -798,8 +798,10 @@ procrestore(Proc *p)
{
uvlong t;
- if(p->dr[7] != 0)
+ if(p->dr[7] != 0){
+ m->dr7 = p->dr[7];
putdr(p->dr);
+ }
if(p->kp)
return;
@@ -814,8 +816,10 @@ procsave(Proc *p)
{
uvlong t;
- if(p->dr[7] != 0)
+ if(m->dr7 != 0){
+ m->dr7 = 0;
putdr7(0);
+ }
cycles(&t);
p->kentry -= t;
diff --git a/sys/src/9/pc64/mmu.c b/sys/src/9/pc64/mmu.c
index 19828eafc..6f27ac25e 100644
--- a/sys/src/9/pc64/mmu.c
+++ b/sys/src/9/pc64/mmu.c
@@ -425,8 +425,6 @@ mmurelease(Proc *proc)
proc->kmapcount = proc->kmapindex = 0;
}
mmufree(proc);
- if(proc->dr[7] != 0)
- putdr7(0);
taskswitch((uintptr)m+MACHSIZE);
}