diff --git a/sys/src/9/pc/main.c b/sys/src/9/pc/main.c index 7d2e86b8d..5efebc809 100644 --- a/sys/src/9/pc/main.c +++ b/sys/src/9/pc/main.c @@ -585,13 +585,18 @@ procsetup(Proc *p) p->fpstate = FPinit; fpoff(); - cycles(&p->kentry); - p->pcycles = -p->kentry; - memset(p->gdt, 0, sizeof(p->gdt)); p->nldt = 0; + /* clear debug registers */ memset(p->dr, 0, sizeof(p->dr)); + if(m->dr7 != 0){ + m->dr7 = 0; + putdr7(0); + } + + cycles(&p->kentry); + p->pcycles = -p->kentry; } void @@ -624,9 +629,6 @@ procfork(Proc *p) memmove(p->fpsave, up->fpsave, sizeof(FPsave)); p->fpstate = FPinactive; } - - /* clear debug registers */ - memset(p->dr, 0, sizeof(p->dr)); splx(s); } @@ -659,15 +661,17 @@ procsave(Proc *p) { uvlong t; + cycles(&t); + p->kentry -= t; + p->pcycles += t; + /* 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; - p->pcycles += t; + if(p->state == Moribund) + p->dr[7] = 0; if(p->fpstate == FPactive){ if(p->state == Moribund) diff --git a/sys/src/9/pc64/main.c b/sys/src/9/pc64/main.c index 1abad73e4..aab95a484 100644 --- a/sys/src/9/pc64/main.c +++ b/sys/src/9/pc64/main.c @@ -581,6 +581,14 @@ procsetup(Proc *p) { p->fpstate = FPinit; _stts(); + + /* clear debug registers */ + memset(p->dr, 0, sizeof(p->dr)); + if(m->dr7 != 0){ + m->dr7 = 0; + putdr7(0); + } + cycles(&p->kentry); p->pcycles = -p->kentry; } @@ -639,14 +647,16 @@ procsave(Proc *p) { uvlong t; + cycles(&t); + p->kentry -= t; + p->pcycles += t; + if(m->dr7 != 0){ m->dr7 = 0; putdr7(0); } - - cycles(&t); - p->kentry -= t; - p->pcycles += t; + if(p->state == Moribund) + p->dr[7] = 0; switch(p->fpstate & ~(FPnouser|FPkernel|FPindexm)){ case FPactive | FPpush: