diff options
Diffstat (limited to 'c/src/lib/libcpu/mips/shared/interrupts')
5 files changed, 166 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/mips/shared/interrupts/.cvsignore b/c/src/lib/libcpu/mips/shared/interrupts/.cvsignore new file mode 100644 index 0000000000..282522db03 --- /dev/null +++ b/c/src/lib/libcpu/mips/shared/interrupts/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/c/src/lib/libcpu/mips/shared/interrupts/Makefile.am b/c/src/lib/libcpu/mips/shared/interrupts/Makefile.am new file mode 100644 index 0000000000..434f2a38ec --- /dev/null +++ b/c/src/lib/libcpu/mips/shared/interrupts/Makefile.am @@ -0,0 +1,32 @@ +## +## $Id$ +## + +AUTOMAKE_OPTIONS = foreign 1.4 + +PGM = $(ARCH)/interrupts.rel + +C_FILES = installisrentries.c maxvectors.c + +S_FILES = isr_entries.S + +interrupts_rel_OBJECTS = $(C_FILES:%.c=$(ARCH)/%.o) $(S_FILES:%.S=$(ARCH)/%.o) + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../../../../../automake/compile.am +include $(top_srcdir)/../../../../../automake/lib.am + +# +# (OPTIONAL) Add local stuff here using += +# + +$(PGM): $(interrupts_rel_OBJECTS) + $(make-rel) + +all-local: $(ARCH) $(interrupts_rel_OBJECTS) $(PGM) + +.PRECIOUS: $(PGM) + +EXTRA_DIST = maxvectors.c + +include $(top_srcdir)/../../../../../automake/local.am diff --git a/c/src/lib/libcpu/mips/shared/interrupts/installisrentries.c b/c/src/lib/libcpu/mips/shared/interrupts/installisrentries.c new file mode 100644 index 0000000000..5dd37f82bb --- /dev/null +++ b/c/src/lib/libcpu/mips/shared/interrupts/installisrentries.c @@ -0,0 +1,29 @@ +/* + * $Id$ + */ + +#include <rtems.h> +#include <idtcpu.h> +#include <stdlib.h> + +void mips_install_isr_entries( void ) +{ +#if __mips == 1 + void exc_utlb_code(void); + void exc_norm_code(void); + + memcpy( (void *)UT_VEC, exc_utlb_code, 40 ); /* utlbmiss vector */ + memcpy( (void *)E_VEC, exc_norm_code, 40 ); /* exception vevtor */ +#elif __mips == 3 + void exc_tlb_code(void); + void exc_utlb_code(void); + void exc_cache_code(void); + void exc_norm_code(void); + + memcpy( (void *)T_VEC, exc_tlb_code, 40 ); /* tlbmiss vector */ + memcpy( (void *)X_VEC, exc_xtlb_code, 40 ); /* xtlbmiss vector */ + memcpy( (void *)C_VEC, exc_cache_code, 40 ); /* cache error vector */ + memcpy( (void *)E_VEC, exc_norm_code, 40 ); /* exception vector */ +#endif + rtems_cache_flush_entire_data(); +} diff --git a/c/src/lib/libcpu/mips/shared/interrupts/isr_entries.S b/c/src/lib/libcpu/mips/shared/interrupts/isr_entries.S new file mode 100644 index 0000000000..8fe31cd6e2 --- /dev/null +++ b/c/src/lib/libcpu/mips/shared/interrupts/isr_entries.S @@ -0,0 +1,74 @@ +/* + * This file contains the raw entry points for the exceptions. + * + * COPYRIGHT (c) 1989-2000. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ +/* @(#)cpu_asm.S 08/20/96 1.15 */ + +#include <asm.h> +#include "iregdef.h" +#include "idtcpu.h" + +/* + * MIPS ISA Level 1 entries + */ + +#if __mips == 1 + +FRAME(exc_norm_code,sp,0,ra) + la k0, _ISR_Handler /* generic external int hndlr */ + j k0 + nop +ENDFRAME(exc_norm_code) + +/* XXX this is dependent on IDT/SIM and needs to be addressed */ +FRAME(exc_utlb_code,sp,0,ra) + la k0, (R_VEC+((48)*8)) + j k0 + nop +ENDFRAME(exc_tlb_code) + +/* + * MIPS ISA Level 3 + * XXX Again, reliance on SIM. Not good. + */ +#elif __mips == 3 + +FRAME(exc_tlb_code,sp,0,ra) + la k0, (R_VEC+((112)*8)) /* R4000 Sim location */ + j k0 + nop +ENDFRAME(exc_tlb_code) + +FRAME(exc_xtlb_code,sp,0,ra) + la k0, (R_VEC+((112)*8)) /* R4000 Sim location */ + j k0 + nop + +ENDFRAME(exc_xtlb_code) + +FRAME(exc_cache_code,sp,0,ra) + la k0, (R_VEC+((112)*8)) /* R4000 Sim location */ + j k0 + nop +ENDFRAME(exc_cache_code) + +FRAME(exc_norm_code,sp,0,ra) + la k0, _ISR_Handler /* generic external int hndlr */ + j k0 + nop +ENDFRAME(exc_norm_code) + +#else + +#error "isr_entries.S: ISA support problem" + +#endif + diff --git a/c/src/lib/libcpu/mips/shared/interrupts/maxvectors.c b/c/src/lib/libcpu/mips/shared/interrupts/maxvectors.c new file mode 100644 index 0000000000..c1e5df20a4 --- /dev/null +++ b/c/src/lib/libcpu/mips/shared/interrupts/maxvectors.c @@ -0,0 +1,29 @@ +/* + * This file contains the maximum number of vectors. This can not + * be determined without knowing the RTEMS CPU model. + * + * COPYRIGHT (c) 1989-2000. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + + +/* + * The tx3904 attaches 4 of the eight interrupt bits to an on-CPU interrupt + * controller so that these four bits map to 16 unique interrupts. + * So you have: 2 software interrupts, an NMI, and 16 others. + */ +#if defined(tx3904) +#define MAX_VECTORS 19 +#endif + +#ifndef MAX +#define MAX_VECTORS 8 +#endif + +unsigned int mips_interrupt_number_of_vectors = MAX_VECTORS; |