diff options
author | aiju <devnull@localhost> | 2017-06-13 00:10:36 +0000 |
---|---|---|
committer | aiju <devnull@localhost> | 2017-06-13 00:10:36 +0000 |
commit | 13869bab113881f28ac72de7d8a68bb8bb5d9c38 (patch) | |
tree | 932d35a419a30348a02771509208c0b9292978a5 /sys/src | |
parent | e8082c1d1f09c04afb399ecdd63a79446e3bc390 (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/src')
-rw-r--r-- | sys/src/9/pc/dat.h | 2 | ||||
-rw-r--r-- | sys/src/9/pc/main.c | 9 | ||||
-rw-r--r-- | sys/src/9/pc/mmu.c | 2 | ||||
-rw-r--r-- | sys/src/9/pc64/dat.h | 2 | ||||
-rw-r--r-- | sys/src/9/pc64/main.c | 8 | ||||
-rw-r--r-- | sys/src/9/pc64/mmu.c | 2 |
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); } |