From 5a059477f8066f25ece1ba2b8c49ab8ea24d19de Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 21 Dec 2020 15:04:48 +0100 Subject: [PATCH] pc, xen: move fpu setup/fork/save/restore handlers to pc/fpu.c --- sys/src/9/pc/fns.h | 4 ++++ sys/src/9/pc/fpu.c | 51 ++++++++++++++++++++++++++++++++++++++++++++ sys/src/9/pc/main.c | 40 +++++----------------------------- sys/src/9/xen/fns.h | 4 ++++ sys/src/9/xen/main.c | 41 +++++------------------------------ 5 files changed, 69 insertions(+), 71 deletions(-) diff --git a/sys/src/9/pc/fns.h b/sys/src/9/pc/fns.h index b107707ae..e19b6d3aa 100644 --- a/sys/src/9/pc/fns.h +++ b/sys/src/9/pc/fns.h @@ -17,6 +17,10 @@ int cmpswap486(long*, long, long); void (*coherence)(void); void cpuid(int, int, ulong regs[]); void fpuinit(void); +void fpuprocsetup(Proc*); +void fpuprocfork(Proc*); +void fpuprocsave(Proc*); +void fpuprocrestore(Proc*); int cpuidentify(void); void cpuidprint(void); void (*cycles)(uvlong*); diff --git a/sys/src/9/pc/fpu.c b/sys/src/9/pc/fpu.c index e9467fc52..66812009e 100644 --- a/sys/src/9/pc/fpu.c +++ b/sys/src/9/pc/fpu.c @@ -307,3 +307,54 @@ fpuinit(void) fprestore = fpx87restore; } } + +void +fpuprocsetup(Proc *p) +{ + p->fpstate = FPinit; + fpoff(); +} + +void +fpuprocfork(Proc *p) +{ + int s; + + s = splhi(); + switch(up->fpstate & ~FPillegal){ + case FPactive: + fpsave(up->fpsave); + up->fpstate = FPinactive; + case FPinactive: + while(p->fpsave == nil) + p->fpsave = mallocalign(sizeof(FPsave), FPalign, 0, 0); + memmove(p->fpsave, up->fpsave, sizeof(FPsave)); + p->fpstate = FPinactive; + } + splx(s); +} + +void +fpuprocsave(Proc *p) +{ + if(p->fpstate == FPactive){ + if(p->state == Moribund) + fpclear(); + else{ + /* + * Fpsave() stores without handling pending + * unmasked exeptions. Postnote() can't be called + * so the handling of pending exceptions is delayed + * until the process runs again and generates an + * emulation fault to activate the FPU. + */ + fpsave(p->fpsave); + } + p->fpstate = FPinactive; + } +} + +void +fpuprocrestore(Proc*) +{ +} diff --git a/sys/src/9/pc/main.c b/sys/src/9/pc/main.c index 0bf5ab7c4..bb2e8ac7d 100644 --- a/sys/src/9/pc/main.c +++ b/sys/src/9/pc/main.c @@ -233,14 +233,10 @@ confinit(void) } } -/* - * set up floating point for a new process - */ void procsetup(Proc *p) { - p->fpstate = FPinit; - fpoff(); + fpuprocsetup(p); memset(p->gdt, 0, sizeof(p->gdt)); p->nldt = 0; @@ -256,8 +252,6 @@ procsetup(Proc *p) void procfork(Proc *p) { - int s; - /* inherit user descriptors */ memmove(p->gdt, up->gdt, sizeof(p->gdt)); @@ -268,19 +262,7 @@ procfork(Proc *p) p->nldt = up->nldt; } - /* save floating point state */ - s = splhi(); - switch(up->fpstate & ~FPillegal){ - case FPactive: - fpsave(up->fpsave); - up->fpstate = FPinactive; - case FPinactive: - while(p->fpsave == nil) - p->fpsave = mallocalign(sizeof(FPsave), FPalign, 0, 0); - memmove(p->fpsave, up->fpsave, sizeof(FPsave)); - p->fpstate = FPinactive; - } - splx(s); + fpuprocfork(p); } void @@ -293,6 +275,8 @@ procrestore(Proc *p) if(p->vmx != nil) vmxprocrestore(p); + + fpuprocrestore(p); } /* @@ -309,21 +293,7 @@ procsave(Proc *p) if(p->state == Moribund) p->dr[7] = 0; - if(p->fpstate == FPactive){ - if(p->state == Moribund) - fpclear(); - else{ - /* - * Fpsave() stores without handling pending - * unmasked exeptions. Postnote() can't be called - * so the handling of pending exceptions is delayed - * until the process runs again and generates an - * emulation fault to activate the FPU. - */ - fpsave(p->fpsave); - } - p->fpstate = FPinactive; - } + fpuprocsave(p); /* * While this processor is in the scheduler, the process could run diff --git a/sys/src/9/xen/fns.h b/sys/src/9/xen/fns.h index bc87a60ef..32a101935 100644 --- a/sys/src/9/xen/fns.h +++ b/sys/src/9/xen/fns.h @@ -11,6 +11,10 @@ int cmpswap486(long*, long, long); void (*coherence)(void); void cpuid(int, int, ulong regs[]); void fpuinit(void); +void fpuprocsetup(Proc*); +void fpuprocfork(Proc*); +void fpuprocsave(Proc*); +void fpuprocrestore(Proc*); int cpuidentify(void); void cpuidprint(void); void (*cycles)(uvlong*); diff --git a/sys/src/9/xen/main.c b/sys/src/9/xen/main.c index 22fe77dd4..61bf5bf4c 100644 --- a/sys/src/9/xen/main.c +++ b/sys/src/9/xen/main.c @@ -322,39 +322,22 @@ confinit(void) } } -/* - * set up floating point for a new process - */ void -procsetup(Proc*p) +procsetup(Proc *p) { - p->fpstate = FPinit; - fpoff(); + fpuprocsetup(p); } void procfork(Proc *p) { - int s; - - /* save floating point state */ - s = splhi(); - switch(up->fpstate & ~FPillegal){ - case FPactive: - fpsave(up->fpsave); - up->fpstate = FPinactive; - case FPinactive: - while(p->fpsave == nil) - p->fpsave = mallocalign(sizeof(FPsave), FPalign, 0, 0); - memmove(p->fpsave, up->fpsave, sizeof(FPsave)); - p->fpstate = FPinactive; - } - splx(s); + fpuprocfork(p); } void procrestore(Proc *p) { + fpuprocrestore(p); } /* @@ -363,21 +346,7 @@ procrestore(Proc *p) void procsave(Proc *p) { - if(p->fpstate == FPactive){ - if(p->state == Moribund) - fpclear(); - else{ - /* - * Fpsave() stores without handling pending - * unmasked exeptions. Postnote() can't be called - * so the handling of pending exceptions is delayed - * until the process runs again and generates an - * emulation fault to activate the FPU. - */ - fpsave(p->fpsave); - } - p->fpstate = FPinactive; - } + fpuprocsave(p); /* * While this processor is in the scheduler, the process could run