summaryrefslogtreecommitdiff
path: root/sys/arch/mvme88k
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2004-08-01 17:18:06 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2004-08-01 17:18:06 +0000
commit3ff16f986065e55c700fe254c2e867b24c5b9431 (patch)
tree174b6d62b4428905575ec0b2dfa9251d479c99d0 /sys/arch/mvme88k
parentaf791ccb4611f1991b112519f0e3557de3ee628b (diff)
Move 88100 DAE code to its own file, shared between luna88k and mvme88k.
Diffstat (limited to 'sys/arch/mvme88k')
-rw-r--r--sys/arch/mvme88k/include/locore.h26
-rw-r--r--sys/arch/mvme88k/mvme88k/locore_c_routines.c241
2 files changed, 3 insertions, 264 deletions
diff --git a/sys/arch/mvme88k/include/locore.h b/sys/arch/mvme88k/include/locore.h
index 630f999246e..642e77a7c87 100644
--- a/sys/arch/mvme88k/include/locore.h
+++ b/sys/arch/mvme88k/include/locore.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore.h,v 1.23 2004/07/28 12:28:48 miod Exp $ */
+/* $OpenBSD: locore.h,v 1.24 2004/08/01 17:18:05 miod Exp $ */
#ifndef _MACHINE_LOCORE_H_
#define _MACHINE_LOCORE_H_
@@ -9,26 +9,7 @@
* C prototypes for various routines defined in locore_* and friends
*/
-/* locore_asm_routines.S */
-
-unsigned int do_load_word(vaddr_t address,
- boolean_t supervisor_mode);
-unsigned int do_load_half(vaddr_t address,
- boolean_t supervisor_mode);
-unsigned int do_load_byte(vaddr_t address,
- boolean_t supervisor_mode);
-
-void do_store_word(vaddr_t address, unsigned int data,
- boolean_t supervisor_mode);
-void do_store_half(vaddr_t address, unsigned int data,
- boolean_t supervisor_mode);
-void do_store_byte(vaddr_t address, unsigned int data,
- boolean_t supervisor_mode);
-
-unsigned do_xmem_word(vaddr_t address, unsigned int data,
- boolean_t supervisor_mode);
-unsigned do_xmem_byte(vaddr_t address, unsigned int data,
- boolean_t supervisor_mode);
+/* subr.S */
unsigned read_processor_identification_register(void);
int badaddr(vaddr_t addr, int size);
@@ -41,9 +22,6 @@ int guarded_access(unsigned char *volatile address,
/* locore_c_routines.c */
-void dae_print(unsigned *eframe);
-void data_access_emulation(unsigned *eframe);
-
unsigned getipl(void);
/* machdep.c */
diff --git a/sys/arch/mvme88k/mvme88k/locore_c_routines.c b/sys/arch/mvme88k/mvme88k/locore_c_routines.c
index fbbd0d86500..91ff8c73d86 100644
--- a/sys/arch/mvme88k/mvme88k/locore_c_routines.c
+++ b/sys/arch/mvme88k/mvme88k/locore_c_routines.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: locore_c_routines.c,v 1.40 2004/07/22 18:58:04 miod Exp $ */
+/* $OpenBSD: locore_c_routines.c,v 1.41 2004/08/01 17:18:05 miod Exp $ */
/*
* Mach Operating System
* Copyright (c) 1993-1991 Carnegie Mellon University
@@ -26,23 +26,16 @@
* rights to redistribute these changes.
*/
-#include "assym.h"
-
#include <sys/param.h>
-#include <sys/types.h>
#include <sys/systm.h>
#include <machine/board.h> /* m188 bit defines */
-#include <machine/cmmu.h> /* DMT_VALID */
#include <machine/asm.h> /* END_OF_VECTOR_LIST, etc. */
#include <machine/asm_macro.h> /* enable/disable interrupts */
#include <machine/cpu_number.h> /* cpu_number() */
#include <machine/locore.h>
#include <machine/prom.h>
#include <machine/trap.h>
-#ifdef M88100
-#include <machine/m88100.h>
-#endif
typedef struct {
unsigned word_one, word_two;
@@ -51,241 +44,9 @@ typedef struct {
extern unsigned int *volatile int_mask_reg[MAX_CPUS]; /* in machdep.c */
extern unsigned master_cpu; /* in cmmu.c */
-/* FORWARDS */
void setlevel(unsigned int);
void vector_init(m88k_exception_vector_area *, unsigned *);
-#ifdef M88100
-
-/*
- * data access emulation for M88100 exceptions
- */
-
-#define DMT_BYTE 1
-#define DMT_HALF 2
-#define DMT_WORD 4
-
-const struct {
- unsigned char offset;
- unsigned char size;
-} dmt_en_info[16] = {
- {0, 0}, {3, DMT_BYTE}, {2, DMT_BYTE}, {2, DMT_HALF},
- {1, DMT_BYTE}, {0, 0}, {0, 0}, {0, 0},
- {0, DMT_BYTE}, {0, 0}, {0, 0}, {0, 0},
- {0, DMT_HALF}, {0, 0}, {0, 0}, {0, DMT_WORD}
-};
-
-#ifdef DATA_DEBUG
-int data_access_emulation_debug = 0;
-#define DAE_DEBUG(stuff) \
- do { \
- if (data_access_emulation_debug != 0) { \
- stuff; \
- } \
- } while (0)
-#else
-#define DAE_DEBUG(stuff)
-#endif
-
-void
-dae_print(unsigned *eframe)
-{
- int x;
- unsigned dmax, dmdx, dmtx;
-
- if (!ISSET(eframe[EF_DMT0], DMT_VALID))
- return;
-
- for (x = 0; x < 3; x++) {
- dmtx = eframe[EF_DMT0 + x * 3];
- if (!ISSET(dmtx, DMT_VALID))
- continue;
-
- dmdx = eframe[EF_DMD0 + x * 3];
- dmax = eframe[EF_DMA0 + x * 3];
-
- if (ISSET(dmtx, DMT_WRITE))
- printf("[DMT%d=%x: st.%c %x to %x as %d %s %s]\n",
- x, dmtx, dmtx & DMT_DAS ? 's' : 'u', dmdx, dmax,
- DMT_ENBITS(dmtx),
- dmtx & DMT_DOUB1 ? "double": "not double",
- dmtx & DMT_LOCKBAR ? "xmem": "not xmem");
- else
- printf("[DMT%d=%x: ld.%c r%d <- %x as %d %s %s]\n",
- x, dmtx, dmtx & DMT_DAS ? 's' : 'u',
- DMT_DREGBITS(dmtx), dmax, DMT_ENBITS(dmtx),
- dmtx & DMT_DOUB1 ? "double": "not double",
- dmtx & DMT_LOCKBAR ? "xmem": "not xmem");
- }
-}
-
-void
-data_access_emulation(unsigned *eframe)
-{
- int x;
- unsigned dmax, dmdx, dmtx;
- unsigned v, reg;
-
- dmtx = eframe[EF_DMT0];
- if (!ISSET(dmtx, DMT_VALID))
- return;
-
- for (x = 0; x < 3; x++) {
- dmtx = eframe[EF_DMT0 + x * 3];
- if (!ISSET(dmtx, DMT_VALID) || ISSET(dmtx, DMT_SKIP))
- continue;
-
- dmdx = eframe[EF_DMD0 + x * 3];
- dmax = eframe[EF_DMA0 + x * 3];
-
- DAE_DEBUG(
- if (ISSET(dmtx, DMT_WRITE))
- printf("[DMT%d=%x: st.%c %x to %x as %d %s %s]\n",
- x, dmtx, dmtx & DMT_DAS ? 's' : 'u', dmdx, dmax,
- DMT_ENBITS(dmtx),
- dmtx & DMT_DOUB1 ? "double": "not double",
- dmtx & DMT_LOCKBAR ? "xmem": "not xmem");
- else
- printf("[DMT%d=%x: ld.%c r%d <- %x as %d %s %s]\n",
- x, dmtx, dmtx & DMT_DAS ? 's' : 'u',
- DMT_DREGBITS(dmtx), dmax, DMT_ENBITS(dmtx),
- dmtx & DMT_DOUB1 ? "double": "not double",
- dmtx & DMT_LOCKBAR ? "xmem": "not xmem")
- );
-
- dmax += dmt_en_info[DMT_ENBITS(dmtx)].offset;
- reg = DMT_DREGBITS(dmtx);
-
- if (!ISSET(dmtx, DMT_LOCKBAR)) {
- /* the fault is not during an XMEM */
-
- if (x == 2 && ISSET(dmtx, DMT_DOUB1)) {
- /* pipeline 2 (earliest stage) for a double */
-
- if (ISSET(dmtx, DMT_WRITE)) {
- /*
- * STORE DOUBLE WILL BE REINITIATED
- * BY rte
- */
- } else {
- /* EMULATE ld.d INSTRUCTION */
- v = do_load_word(dmax, dmtx & DMT_DAS);
- if (reg != 0)
- eframe[EF_R0 + reg] = v;
- v = do_load_word(dmax ^ 4,
- dmtx & DMT_DAS);
- if (reg != 31)
- eframe[EF_R0 + reg + 1] = v;
- }
- } else {
- /* not pipeline #2 with a double */
- if (dmtx & DMT_WRITE) {
- switch (dmt_en_info[DMT_ENBITS(dmtx)].size) {
- case DMT_BYTE:
- DAE_DEBUG(
- printf("[byte %x -> [%x(%c)]\n",
- dmdx & 0xff, dmax,
- ISSET(dmtx, DMT_DAS) ? 's' : 'u')
- );
- do_store_byte(dmax, dmdx,
- dmtx & DMT_DAS);
- break;
- case DMT_HALF:
- DAE_DEBUG(
- printf("[half %x -> [%x(%c)]\n",
- dmdx & 0xffff, dmax,
- ISSET(dmtx, DMT_DAS) ? 's' : 'u')
- );
- do_store_half(dmax, dmdx,
- dmtx & DMT_DAS);
- break;
- case DMT_WORD:
- DAE_DEBUG(
- printf("[word %x -> [%x(%c)]\n",
- dmdx, dmax,
- ISSET(dmtx, DMT_DAS) ? 's' : 'u')
- );
- do_store_word(dmax, dmdx,
- dmtx & DMT_DAS);
- break;
- }
- } else {
- /* else it's a read */
- switch (dmt_en_info[DMT_ENBITS(dmtx)].size) {
- case DMT_BYTE:
- v = do_load_byte(dmax,
- dmtx & DMT_DAS);
- if (!ISSET(dmtx, DMT_SIGNED))
- v &= 0x000000ff;
- break;
- case DMT_HALF:
- v = do_load_half(dmax,
- dmtx & DMT_DAS);
- if (!ISSET(dmtx, DMT_SIGNED))
- v &= 0x0000ffff;
- break;
- case DMT_WORD:
- v = do_load_word(dmax,
- dmtx & DMT_DAS);
- break;
- }
- DAE_DEBUG(
- if (reg == 0)
- printf("[no write to r0 done]\n");
- else
- printf("[r%d <- %x]\n", reg, v);
- );
- if (reg != 0)
- eframe[EF_R0 + reg] = v;
- }
- }
- } else {
- /* if lockbar is set... it's part of an XMEM */
- /*
- * According to Motorola's "General Information",
- * the DMT_DOUB1 bit is never set in this case, as it
- * should be.
- * If lockbar is set (as it is if we're here) and if
- * the write is not set, then it's the same as if DOUB1
- * was set...
- */
- if (!ISSET(dmtx, DMT_WRITE)) {
- if (x != 2) {
- /* RERUN xmem WITH DMD(x+1) */
- x++;
- dmdx = eframe[EF_DMD0 + x * 3];
- } else {
- /* RERUN xmem WITH DMD2 */
- }
-
- if (dmt_en_info[DMT_ENBITS(dmtx)].size ==
- DMT_WORD) {
- v = do_xmem_word(dmax, dmdx,
- dmtx & DMT_DAS);
- } else {
- v = do_xmem_byte(dmax, dmdx,
- dmtx & DMT_DAS);
- }
- if (reg != 0)
- eframe[EF_R0 + reg] = v;
- } else {
- if (x == 0) {
- if (reg != 0)
- eframe[EF_R0 + reg] = dmdx;
- eframe[EF_SFIP] = eframe[EF_SNIP];
- eframe[EF_SNIP] = eframe[EF_SXIP];
- eframe[EF_SXIP] = 0;
- /* xmem RERUN ON rte */
- eframe[EF_DMT0] = 0;
- return;
- }
- }
- }
- }
- eframe[EF_DMT0] = 0;
-}
-#endif /* M88100 */
-
#define SIGSYS_MAX 501
#define SIGTRAP_MAX 510