diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-12-20 22:34:41 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-12-20 22:34:41 +0100 |
commit | e4ce6aadac9e1de8d5ea625e9680d24cabce0e1a (patch) | |
tree | 63c0b00f6f2c8eac29d4a0354d402206bc61397a /sys/src/9/bcm64 | |
parent | 08c1622b0d8de92c2650d7b0338d9abf20985827 (diff) |
kernel: handle tos and per process pcycle counters in port/
we might as well handle the per process cycle
counter in the portable part instead of duplicating the code
in every arch and have inconsistent implementations.
we now have a portable kenter() and kexit() function,
that is ment to be used in trap/syscall from user,
which updates the counters.
some kernels missed initializing Mach.cyclefreq.
Diffstat (limited to 'sys/src/9/bcm64')
-rw-r--r-- | sys/src/9/bcm64/fns.h | 3 | ||||
-rw-r--r-- | sys/src/9/bcm64/l.s | 2 | ||||
-rw-r--r-- | sys/src/9/bcm64/trap.c | 67 |
3 files changed, 13 insertions, 59 deletions
diff --git a/sys/src/9/bcm64/fns.h b/sys/src/9/bcm64/fns.h index 7ace1ce9a..ddabedd98 100644 --- a/sys/src/9/bcm64/fns.h +++ b/sys/src/9/bcm64/fns.h @@ -8,7 +8,8 @@ extern int tas(void *); extern int cmpswap(long*, long, long); extern void coherence(void); extern void idlehands(void); -extern uvlong cycles(void); +extern uvlong vcycles(void); +#define cycles(ip) *(ip) = vcycles() extern int splfhi(void); extern void splflo(void); extern void touser(uintptr sp); diff --git a/sys/src/9/bcm64/l.s b/sys/src/9/bcm64/l.s index d6ad02184..86035d6bb 100644 --- a/sys/src/9/bcm64/l.s +++ b/sys/src/9/bcm64/l.s @@ -297,7 +297,7 @@ _goodnight: WFE RETURN -TEXT cycles(SB), 1, $-4 +TEXT vcycles(SB), 1, $-4 TEXT lcycles(SB), 1, $-4 MRS PMCCNTR_EL0, R0 RETURN diff --git a/sys/src/9/bcm64/trap.c b/sys/src/9/bcm64/trap.c index 3c683765b..d3dedb8f9 100644 --- a/sys/src/9/bcm64/trap.c +++ b/sys/src/9/bcm64/trap.c @@ -81,20 +81,6 @@ trapinit(void) splx(0x3<<6); // unmask serr and debug } -void -kexit(Ureg*) -{ - Tos *tos; - uvlong t; - - t = cycles(); - - tos = (Tos*)(USTKTOP-sizeof(Tos)); - tos->kcycles += t - up->kentry; - tos->pcycles = t + up->pcycles; - tos->pid = up->pid; -} - static char *traps[64] = { [0x00] "sys: trap: unknown", [0x01] "sys: trap: WFI or WFE instruction execution", @@ -112,17 +98,15 @@ void trap(Ureg *ureg) { u32int type, intr; - + int user; + intr = ureg->type >> 32; if(intr == 2){ fiq(ureg); return; } splflo(); - if(userureg(ureg)){ - up->dbgreg = ureg; - up->kentry = cycles(); - } + user = kenter(ureg); type = (u32int)ureg->type >> 26; switch(type){ case 0x20: // instruction abort from lower level @@ -187,7 +171,7 @@ trap(Ureg *ureg) break; } splhi(); - if(userureg(ureg)){ + if(user){ if(up->procctl || up->nnote) notify(ureg); kexit(ureg); @@ -203,12 +187,12 @@ syscall(Ureg *ureg) int i, s; char *e; - up->kentry = cycles(); + if(!kenter(ureg)) + panic("syscall from kernel"); m->syscall++; up->insyscall = 1; up->pc = ureg->pc; - up->dbgreg = ureg; sp = ureg->sp; up->scallnr = scallnr = ureg->r0; @@ -542,9 +526,6 @@ procfork(Proc *p) splx(s); p->tpidr = up->tpidr; - - p->kentry = up->kentry; - p->pcycles = -p->kentry; } void @@ -555,16 +536,11 @@ procsetup(Proc *p) p->tpidr = 0; syswr(TPIDR_EL0, p->tpidr); - - p->kentry = cycles(); - p->pcycles = -p->kentry; } void procsave(Proc *p) { - uvlong t; - if(p->fpstate == FPactive){ if(p->state == Moribund) fpclear(); @@ -577,44 +553,21 @@ procsave(Proc *p) p->tpidr = sysrd(TPIDR_EL0); putasid(p); // release asid - - t = cycles(); - p->kentry -= t; - p->pcycles += t; } void procrestore(Proc *p) { - uvlong t; - - if(p->kp) - return; - - syswr(TPIDR_EL0, p->tpidr); - - t = cycles(); - p->kentry += t; - p->pcycles -= t; -} - -static void -linkproc(void) -{ - spllo(); - up->kpfun(up->kparg); - pexit("kproc dying", 0); + if(p->kp == 0) + syswr(TPIDR_EL0, p->tpidr); } void -kprocchild(Proc* p, void (*func)(void*), void* arg) +kprocchild(Proc *p, void (*entry)(void)) { - p->sched.pc = (uintptr) linkproc; + p->sched.pc = (uintptr) entry; p->sched.sp = (uintptr) p->kstack + KSTACK - 16; *(void**)p->sched.sp = kprocchild; /* fake */ - - p->kpfun = func; - p->kparg = arg; } void |