summaryrefslogtreecommitdiff
path: root/sys/src/9/pc64
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/pc64
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/pc64')
-rw-r--r--sys/src/9/pc64/main.c21
-rw-r--r--sys/src/9/pc64/trap.c41
2 files changed, 4 insertions, 58 deletions
diff --git a/sys/src/9/pc64/main.c b/sys/src/9/pc64/main.c
index 4083e33f6..e68220d5f 100644
--- a/sys/src/9/pc64/main.c
+++ b/sys/src/9/pc64/main.c
@@ -304,25 +304,17 @@ procsetup(Proc *p)
m->dr7 = 0;
putdr7(0);
}
-
- cycles(&p->kentry);
- p->pcycles = -p->kentry;
}
void
procfork(Proc *p)
{
- p->kentry = up->kentry;
- p->pcycles = -p->kentry;
-
fpuprocfork(p);
}
void
procrestore(Proc *p)
{
- uvlong t;
-
if(p->dr[7] != 0){
m->dr7 = p->dr[7];
putdr(p->dr);
@@ -332,24 +324,11 @@ procrestore(Proc *p)
vmxprocrestore(p);
fpuprocrestore(p);
-
- if(p->kp)
- return;
-
- cycles(&t);
- p->kentry += t;
- p->pcycles -= t;
}
void
procsave(Proc *p)
{
- uvlong t;
-
- cycles(&t);
- p->kentry -= t;
- p->pcycles += t;
-
if(m->dr7 != 0){
m->dr7 = 0;
putdr7(0);
diff --git a/sys/src/9/pc64/trap.c b/sys/src/9/pc64/trap.c
index 252462096..b39c7a082 100644
--- a/sys/src/9/pc64/trap.c
+++ b/sys/src/9/pc64/trap.c
@@ -131,30 +131,11 @@ usertrap(int vno)
/* go to user space */
void
-kexit(Ureg*)
-{
- uvlong t;
- Tos *tos;
-
- /* precise time accounting, kernel exit */
- tos = (Tos*)((uintptr)USTKTOP-sizeof(Tos));
- cycles(&t);
- tos->kcycles += t - up->kentry;
- tos->pcycles = t + up->pcycles;
- tos->pid = up->pid;
-}
-
-void
trap(Ureg *ureg)
{
int vno, user;
- user = userureg(ureg);
- if(user){
- up->dbgreg = ureg;
- cycles(&up->kentry);
- }
-
+ user = kenter(ureg);
vno = ureg->type;
if(!irqhandled(ureg, vno) && (!user || !usertrap(vno))){
if(!user){
@@ -463,15 +444,12 @@ syscall(Ureg* ureg)
ulong scallnr;
vlong startns, stopns;
- if(!userureg(ureg))
+ if(!kenter(ureg))
panic("syscall: cs 0x%4.4lluX", ureg->cs);
- cycles(&up->kentry);
-
m->syscall++;
up->insyscall = 1;
up->pc = ureg->pc;
- up->dbgreg = ureg;
sp = ureg->sp;
scallnr = ureg->bp; /* RARG */
@@ -775,27 +753,16 @@ setregisters(Ureg* ureg, char* pureg, char* uva, int n)
ureg->pc &= UADDRMASK;
}
-static void
-linkproc(void)
-{
- spllo();
- up->kpfun(up->kparg);
- pexit("kproc dying", 0);
-}
-
void
-kprocchild(Proc* p, void (*func)(void*), void* arg)
+kprocchild(Proc *p, void (*entry)(void))
{
/*
* gotolabel() needs a word on the stack in
* which to place the return PC used to jump
* to linkproc().
*/
- p->sched.pc = (uintptr)linkproc;
+ p->sched.pc = (uintptr)entry;
p->sched.sp = (uintptr)p->kstack+KSTACK-BY2WD;
-
- p->kpfun = func;
- p->kparg = arg;
}
void