Module Name: src
Committed By: thorpej
Date: Sat Jan 13 18:42:11 UTC 2024
Modified Files:
src/sys/arch/m68k/include: vectors.h
src/sys/arch/m68k/m68k: vectors.c
Log Message:
Provide some vector table override hooks and interfaces needed by the
sun68k platforms.
To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/m68k/include/vectors.h
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/m68k/m68k/vectors.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/m68k/include/vectors.h
diff -u src/sys/arch/m68k/include/vectors.h:1.1 src/sys/arch/m68k/include/vectors.h:1.2
--- src/sys/arch/m68k/include/vectors.h:1.1 Sat Jan 13 17:10:03 2024
+++ src/sys/arch/m68k/include/vectors.h Sat Jan 13 18:42:11 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: vectors.h,v 1.1 2024/01/13 17:10:03 thorpej Exp $ */
+/* $NetBSD: vectors.h,v 1.2 2024/01/13 18:42:11 thorpej Exp $ */
/*-
* Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -71,7 +71,8 @@
#define VECI_rsvd21 21 /* unassigned, reserved */
#define VECI_rsvd22 22 /* unassigned, reserved */
#define VECI_rsvd23 23 /* unassigned, reserved */
-#define VECI_SPURIOUS_INTR 24 /* Spurious Interrupt */
+#define VECI_INTRAV0 24 /* Spurious Interrupt */
+#define VECI_SPURIOUS_INTR VECI_INTRAV0
#define VECI_INTRAV1 25 /* Level 1 Interrupt Autovector */
#define VECI_INTRAV2 26 /* Level 2 Interrupt Autovector */
#define VECI_INTRAV3 27 /* Level 3 Interrupt Autovector */
@@ -118,8 +119,8 @@
#define VECI_INTRAV(ipl) ((ipl) + VECI_SPURIOUS_INTR)
#define VECI_TRAP(x) ((x) + VECI_TRAP0)
-#define VECI_TO_VEC(x) ((x) << 2)
-#define VEC_TO_VECI(x) ((unsigned int)(x) >> 2)
+#define VECI_TO_VECO(x) ((x) << 2)
+#define VECO_TO_VECI(x) ((unsigned int)(x) >> 2)
#ifdef _KERNEL
@@ -127,6 +128,8 @@ extern void *vectab[NVECTORS];
void vec_init(void);
void vec_reset(void);
+void *vec_get_entry(int);
+void vec_set_entry(int, void *);
#endif /* _KERNEL */
Index: src/sys/arch/m68k/m68k/vectors.c
diff -u src/sys/arch/m68k/m68k/vectors.c:1.1 src/sys/arch/m68k/m68k/vectors.c:1.2
--- src/sys/arch/m68k/m68k/vectors.c:1.1 Sat Jan 13 17:10:03 2024
+++ src/sys/arch/m68k/m68k/vectors.c Sat Jan 13 18:42:11 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: vectors.c,v 1.1 2024/01/13 17:10:03 thorpej Exp $ */
+/* $NetBSD: vectors.c,v 1.2 2024/01/13 18:42:11 thorpej Exp $ */
/*-
* Copyright (c) 2024 The NetBSD Foundation, Inc.
@@ -29,6 +29,11 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#ifdef _KERNEL_OPT
+#include "opt_compat_netbsd.h"
+#include "opt_compat_sunos.h"
+#endif
+
#include <sys/types.h>
#include <machine/cpu.h>
@@ -48,12 +53,12 @@ extern char badtrap[];
extern char coperr[];
extern char fmterr[];
extern char trap0[];
-#ifdef COMPAT_13
+#if defined(COMPAT_13) || defined(COMPAT_SUNOS)
extern char trap1[];
#define TRAP1_HANDLER trap1
#else
#define TRAP1_HANDLER illinst
-#endif /* COMPAT_13 */
+#endif /* COMPAT_13 || COMPAT_SUNOS */
extern char trap2[];
#ifdef COMPAT_16
extern char trap3[];
@@ -75,15 +80,39 @@ extern char MACHINE_AV5_HANDLER[];
extern char MACHINE_AV6_HANDLER[];
extern char MACHINE_AV7_HANDLER[];
-#ifndef __mc68010__
+#ifdef MACHINE_BUSERR_HANDLER
+extern char MACHINE_BUSERR_HANDLER[];
+#endif
+
+#ifdef MACHINE_ADDRERR_HANDLER
+extern char MACHINE_ADDRERR_HANDLER[];
+#endif
+
+#ifdef __mc68010__
+
+#define BUSERR_HANDLER MACHINE_BUSERR_HANDLER
+#define ADDRERR_HANDLER MACHINE_ADDRERR_HANDLER
+
+#else
#if defined(M68020) || defined(M68030)
-extern char busaddrerr2030[];
+#ifdef MACHINE_BUSERR_HANDLER
+#define BUSERR_HANDLER2030 MACHINE_BUSERR_HANDLER
+#else
+extern char buserr2030[];
+#define BUSERR_HANDLER2030 buserr2030
+#endif
+#ifdef MACHINE_ADDRERR_HANDLER
+#define ADDRERR_HANDLER2030 MACHINE_ADDRERR_HANDLER
+#else
+extern char addrerr2030[];
+#define ADDRERR_HANDLER2030 addrerr2030
+#endif
#if defined(M68040) || defined(M68060)
#define NEED_FIXUP_2030
#else
-#define BUSERR_HANDLER busaddrerr2030
-#define ADDRERR_HANDLER busaddrerr2030
+#define BUSERR_HANDLER BUSERR_HANDLER2030
+#define ADDRERR_HANDLER ADDRERR_HANDLER2030
#endif
#endif /* M68020 || M68030 */
@@ -168,6 +197,14 @@ extern char FP_CALL_TOP[], I_CALL_TOP[];
#endif /* __mc68010__ */
+#ifndef MACHINE_RESET_SP
+#define MACHINE_RESET_SP NULL
+#endif
+
+#ifndef MACHINE_RESET_PC
+#define MACHINE_RESET_PC NULL
+#endif
+
#ifndef BUSERR_HANDLER
#define BUSERR_HANDLER badtrap
#endif
@@ -221,6 +258,8 @@ extern char FP_CALL_TOP[], I_CALL_TOP[];
#endif
void *vectab[NVECTORS] = {
+ [VECI_RIISP] = MACHINE_RESET_SP,
+ [VECI_RIPC] = MACHINE_RESET_PC,
[VECI_BUSERR] = BUSERR_HANDLER,
[VECI_ADDRERR] = ADDRERR_HANDLER,
[VECI_ILLINST] = illinst,
@@ -243,7 +282,7 @@ void *vectab[NVECTORS] = {
[VECI_rsvd21] = badtrap,
[VECI_rsvd22] = badtrap,
[VECI_rsvd23] = badtrap,
- [VECI_SPURIOUS_INTR] = MACHINE_AV0_HANDLER,
+ [VECI_INTRAV0] = MACHINE_AV0_HANDLER,
[VECI_INTRAV1] = MACHINE_AV1_HANDLER,
[VECI_INTRAV2] = MACHINE_AV2_HANDLER,
[VECI_INTRAV3] = MACHINE_AV3_HANDLER,
@@ -496,8 +535,8 @@ vec_init(void)
#ifdef NEED_FIXUP_2030
case CPU_68020:
case CPU_68030:
- vectab[VECI_BUSERR] = busaddrerr2030;
- vectab[VECI_ADDRERR] = busaddrerr2030;
+ vectab[VECI_BUSERR] = BUSERR_HANDLER2030;
+ vectab[VECI_ADDRERR] = ADDRERR_HANDLER2030;
break;
#endif /* NEED_FIXUP_2030 */
@@ -550,3 +589,32 @@ vec_reset(void)
{
setvbr(saved_vbr);
}
+
+/*
+ * vec_get_entry --
+ * Get a vector table entry.
+ */
+void *
+vec_get_entry(int vec)
+{
+ KASSERT(vec >= 0);
+ KASSERT(vec < NVECTORS);
+ return vectab[vec];
+}
+
+/*
+ * vec_set_entry --
+ * Set a vector table entry.
+ */
+void
+vec_set_entry(int vec, void *addr)
+{
+ KASSERT(vec >= 0);
+ KASSERT(vec < NVECTORS);
+ vectab[vec] = addr;
+#if defined(M68040) || defined(M68060)
+ if (cputype == CPU_68040 || cputype == CPU_68060) {
+ DCIS();
+ }
+#endif
+}