Module Name: src
Committed By: rin
Date: Thu Feb 20 06:12:47 UTC 2020
Modified Files:
src/sys/arch/powerpc/powerpc: fpu.c powerpc_machdep.c
Log Message:
Provide no-op's as pcu_ops_md_defs[PCU_FPU] even if !PPC_HAVE_FPU.
This is required by subr_pcu.c rev 1.21 and later:
http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/kern/subr_pcu.c#rev1.21
Otherwise, panic occurs when FP instruction is emulated on machines
without FPU.
Note that PowerPC UISA as well as SVR4 ABI require FP instructions,
and emulation is enabled unconditionally on machines without FPU.
To generate a diff of this commit:
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/powerpc/powerpc/fpu.c
cvs rdiff -u -r1.76 -r1.77 src/sys/arch/powerpc/powerpc/powerpc_machdep.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/powerpc/powerpc/fpu.c
diff -u src/sys/arch/powerpc/powerpc/fpu.c:1.38 src/sys/arch/powerpc/powerpc/fpu.c:1.39
--- src/sys/arch/powerpc/powerpc/fpu.c:1.38 Thu Mar 16 16:13:20 2017
+++ src/sys/arch/powerpc/powerpc/fpu.c Thu Feb 20 06:12:47 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: fpu.c,v 1.38 2017/03/16 16:13:20 chs Exp $ */
+/* $NetBSD: fpu.c,v 1.39 2020/02/20 06:12:47 rin Exp $ */
/*
* Copyright (C) 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.38 2017/03/16 16:13:20 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.39 2020/02/20 06:12:47 rin Exp $");
#include "opt_multiprocessor.h"
@@ -47,19 +47,15 @@ __KERNEL_RCSID(0, "$NetBSD: fpu.c,v 1.38
#include <machine/fpu.h>
#include <machine/psl.h>
-#ifdef PPC_HAVE_FPU
static void fpu_state_load(lwp_t *, u_int);
static void fpu_state_save(lwp_t *);
static void fpu_state_release(lwp_t *);
-#endif
const pcu_ops_t fpu_ops = {
.pcu_id = PCU_FPU,
-#ifdef PPC_HAVE_FPU
.pcu_state_load = fpu_state_load,
.pcu_state_save = fpu_state_save,
.pcu_state_release = fpu_state_release,
-#endif
};
bool
@@ -74,10 +70,10 @@ fpu_mark_used(lwp_t *l)
pcu_discard(&fpu_ops, l, true);
}
-#ifdef PPC_HAVE_FPU
void
fpu_state_load(lwp_t *l, u_int flags)
{
+#ifdef PPC_HAVE_FPU
struct pcb * const pcb = lwp_getpcb(l);
if ((flags & PCU_VALID) == 0) {
@@ -98,6 +94,7 @@ fpu_state_load(lwp_t *l, u_int flags)
curcpu()->ci_ev_fpusw.ev_count++;
l->l_md.md_utf->tf_srr1 |= PSL_FP|(pcb->pcb_flags & (PCB_FE0|PCB_FE1));
+#endif
}
/*
@@ -106,6 +103,7 @@ fpu_state_load(lwp_t *l, u_int flags)
void
fpu_state_save(lwp_t *l)
{
+#ifdef PPC_HAVE_FPU
struct pcb * const pcb = lwp_getpcb(l);
const register_t msr = mfmsr();
@@ -117,14 +115,18 @@ fpu_state_save(lwp_t *l)
mtmsr(msr);
__asm volatile ("isync");
+#endif
}
void
fpu_state_release(lwp_t *l)
{
+#ifdef PPC_HAVE_FPU
l->l_md.md_utf->tf_srr1 &= ~PSL_FP;
+#endif
}
+#ifdef PPC_HAVE_FPU
#define STICKYBITS (FPSCR_VX|FPSCR_OX|FPSCR_UX|FPSCR_ZX|FPSCR_XX)
#define STICKYSHIFT 25
#define MASKBITS (FPSCR_VE|FPSCR_OE|FPSCR_UE|FPSCR_ZE|FPSCR_XE)
Index: src/sys/arch/powerpc/powerpc/powerpc_machdep.c
diff -u src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.76 src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.77
--- src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.76 Mon Feb 17 21:49:27 2020
+++ src/sys/arch/powerpc/powerpc/powerpc_machdep.c Thu Feb 20 06:12:47 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: powerpc_machdep.c,v 1.76 2020/02/17 21:49:27 ad Exp $ */
+/* $NetBSD: powerpc_machdep.c,v 1.77 2020/02/20 06:12:47 rin Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: powerpc_machdep.c,v 1.76 2020/02/17 21:49:27 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: powerpc_machdep.c,v 1.77 2020/02/20 06:12:47 rin Exp $");
#include "opt_altivec.h"
#include "opt_ddb.h"
@@ -89,9 +89,7 @@ extern int powersave;
char *booted_kernel;
const pcu_ops_t * const pcu_ops_md_defs[PCU_UNIT_COUNT] = {
-#if defined(PPC_HAVE_FPU)
[PCU_FPU] = &fpu_ops,
-#endif
#if defined(ALTIVEC) || defined(PPC_HAVE_SPE)
[PCU_VEC] = &vec_ops,
#endif