diff options
author | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-10-25 20:17:39 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@centraldogma> | 2011-10-25 20:17:39 +0200 |
commit | 3fce94e7850ab80d14fa15f2f393ae71259376e5 (patch) | |
tree | c9eb3d2b3b52130690c1fcce43afabd4e9adfcdd /sys/src | |
parent | 83865180a29d7feba2a1f460abf17315562141c3 (diff) |
fix _tos->pcycles, make _tos->kcycles actually count cycles executing kernel code on behalf of the process
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/9/kw/arch.c | 14 | ||||
-rw-r--r-- | sys/src/9/omap/arch.c | 11 | ||||
-rw-r--r-- | sys/src/9/omap4/trap.c | 2 | ||||
-rw-r--r-- | sys/src/9/pc/main.c | 12 | ||||
-rw-r--r-- | sys/src/9/pc/trap.c | 2 | ||||
-rw-r--r-- | sys/src/9/port/sysproc.c | 6 | ||||
-rw-r--r-- | sys/src/9/ppc/main.c | 9 | ||||
-rw-r--r-- | sys/src/9/ppc/trap.c | 2 |
8 files changed, 45 insertions, 13 deletions
diff --git a/sys/src/9/kw/arch.c b/sys/src/9/kw/arch.c index e481d5c58..85ef31835 100644 --- a/sys/src/9/kw/arch.c +++ b/sys/src/9/kw/arch.c @@ -50,7 +50,7 @@ kexit(Ureg*) tos = (Tos*)(USTKTOP-sizeof(Tos)); t = fastticks(nil); tos->kcycles += t - up->kentry; - tos->pcycles = up->pcycles; + tos->pcycles = t + up->pcycles; tos->cyclefreq = Frequency; tos->pid = up->pid; @@ -124,11 +124,16 @@ void procsetup(Proc* p) { fpusysprocsetup(p); + + cycles(&p->kentry); + p->pcycles = -p->kentry; } void -procfork(Proc *) +procfork(Proc* p) { + p->kentry = up->kentry; + p->pcycles = -p->kentry; } /* @@ -141,6 +146,7 @@ procsave(Proc* p) cycles(&t); p->pcycles += t; + p->kentry -= t; fpuprocsave(p); } @@ -152,8 +158,10 @@ procrestore(Proc* p) if(p->kp) return; - t = lcycles(); + + cycles(&t); p->pcycles -= t; + p->kentry += t; fpuprocrestore(p); } diff --git a/sys/src/9/omap/arch.c b/sys/src/9/omap/arch.c index 53fb71e85..4714168b0 100644 --- a/sys/src/9/omap/arch.c +++ b/sys/src/9/omap/arch.c @@ -50,7 +50,7 @@ kexit(Ureg*) tos = (Tos*)(USTKTOP-sizeof(Tos)); cycles(&t); tos->kcycles += t - up->kentry; - tos->pcycles = up->pcycles; + tos->pcycles = t + up->pcycles; tos->cyclefreq = m->cpuhz; tos->pid = up->pid; @@ -124,11 +124,16 @@ void procsetup(Proc* p) { fpusysprocsetup(p); + + cycles(&p->kentry); + p->pcycles = -p->kentry; } void -procfork(Proc*) +procfork(Proc* p) { + p->kentry = up->kentry; + p->pcycles = -p->kentry; } /* @@ -141,6 +146,7 @@ procsave(Proc* p) cycles(&t); p->pcycles += t; + p->kentry -= t; // TODO: save and restore VFPv3 FP state once 5[cal] know the new registers. fpuprocsave(p); @@ -155,6 +161,7 @@ procrestore(Proc* p) return; cycles(&t); p->pcycles -= t; + p->kentry += t; fpuprocrestore(p); } diff --git a/sys/src/9/omap4/trap.c b/sys/src/9/omap4/trap.c index 13d54e44a..308860b2e 100644 --- a/sys/src/9/omap4/trap.c +++ b/sys/src/9/omap4/trap.c @@ -124,7 +124,7 @@ updatetos(void) tos = (Tos*) (USTKTOP - sizeof(Tos)); cycles(&t); tos->kcycles += t - up->kentry; - tos->pcycles = up->pcycles; + tos->pcycles = t + up->pcycles; tos->pid = up->pid; } diff --git a/sys/src/9/pc/main.c b/sys/src/9/pc/main.c index ff928af2e..0172de1de 100644 --- a/sys/src/9/pc/main.c +++ b/sys/src/9/pc/main.c @@ -580,11 +580,14 @@ mathinit(void) * set up floating point for a new process */ void -procsetup(Proc*p) +procsetup(Proc *p) { p->fpstate = FPinit; fpoff(); + cycles(&p->kentry); + p->pcycles = -p->kentry; + memset(p->gdt, 0, sizeof(p->gdt)); p->ldt = nil; p->nldt = 0; @@ -593,6 +596,9 @@ procsetup(Proc*p) void procfork(Proc *p) { + p->kentry = up->kentry; + p->pcycles = -p->kentry; + /* inherit user descriptors */ memmove(p->gdt, up->gdt, sizeof(p->gdt)); @@ -611,7 +617,9 @@ procrestore(Proc *p) if(p->kp) return; + cycles(&t); + p->kentry += t; p->pcycles -= t; } @@ -624,7 +632,9 @@ procsave(Proc *p) uvlong t; cycles(&t); + p->kentry -= t; p->pcycles += t; + if(p->fpstate == FPactive){ if(p->state == Moribund) fpclear(); diff --git a/sys/src/9/pc/trap.c b/sys/src/9/pc/trap.c index 686f9e53e..2b13b7399 100644 --- a/sys/src/9/pc/trap.c +++ b/sys/src/9/pc/trap.c @@ -299,7 +299,7 @@ kexit(Ureg*) tos = (Tos*)(USTKTOP-sizeof(Tos)); cycles(&t); tos->kcycles += t - up->kentry; - tos->pcycles = up->pcycles; + tos->pcycles = t + up->pcycles; tos->pid = up->pid; } diff --git a/sys/src/9/port/sysproc.c b/sys/src/9/port/sysproc.c index b49410d26..be5a83b94 100644 --- a/sys/src/9/port/sysproc.c +++ b/sys/src/9/port/sysproc.c @@ -356,10 +356,10 @@ sysexec(ulong *arg) */ tos = (Tos*)(TSTKTOP - sizeof(Tos)); tos->cyclefreq = m->cyclefreq; - cycles((uvlong*)&tos->pcycles); - tos->pcycles = -tos->pcycles; - tos->kcycles = tos->pcycles; + tos->kcycles = 0; + tos->pcycles = 0; tos->clock = 0; + argv = (char**)(TSTKTOP - ssize); charp = (char*)(TSTKTOP - nbytes); args = charp; diff --git a/sys/src/9/ppc/main.c b/sys/src/9/ppc/main.c index 311d83105..e2edf14cc 100644 --- a/sys/src/9/ppc/main.c +++ b/sys/src/9/ppc/main.c @@ -284,11 +284,16 @@ void procsetup(Proc *p) { p->fpstate = FPinit; + + cycles(&p->kentry); + p->pcycles = -p->kentry; } void -procfork(Proc *) +procfork(Proc *p) { + p->kentry = up->kentry; + p->pcycles = -p->kentry; } void @@ -300,6 +305,7 @@ procrestore(Proc *p) return; cycles(&t); p->pcycles -= t; + p->kentry += t; } /* @@ -312,6 +318,7 @@ procsave(Proc *p) cycles(&t); p->pcycles += t; + p->kentry -= t; if(p->fpstate == FPactive){ if(p->state != Moribund) fpsave(&up->fpsave); diff --git a/sys/src/9/ppc/trap.c b/sys/src/9/ppc/trap.c index ceacce8a8..ab3e713a4 100644 --- a/sys/src/9/ppc/trap.c +++ b/sys/src/9/ppc/trap.c @@ -150,7 +150,7 @@ kexit(Ureg*) tos = (Tos*)(USTKTOP-sizeof(Tos)); cycles(&t); tos->kcycles += t - up->kentry; - tos->pcycles = up->pcycles; + tos->pcycles = t + up->pcycles; tos->pid = up->pid; } |