summaryrefslogtreecommitdiff
path: root/sys/src/9/bcm64
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-12-20 22:34:41 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2020-12-20 22:34:41 +0100
commite4ce6aadac9e1de8d5ea625e9680d24cabce0e1a (patch)
tree63c0b00f6f2c8eac29d4a0354d402206bc61397a /sys/src/9/bcm64
parent08c1622b0d8de92c2650d7b0338d9abf20985827 (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.h3
-rw-r--r--sys/src/9/bcm64/l.s2
-rw-r--r--sys/src/9/bcm64/trap.c67
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