summaryrefslogtreecommitdiffstats
path: root/c/src/exec/score/cpu/hppa1.1/cpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/exec/score/cpu/hppa1.1/cpu.c')
-rw-r--r--c/src/exec/score/cpu/hppa1.1/cpu.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/c/src/exec/score/cpu/hppa1.1/cpu.c b/c/src/exec/score/cpu/hppa1.1/cpu.c
new file mode 100644
index 0000000000..49a7267ce6
--- /dev/null
+++ b/c/src/exec/score/cpu/hppa1.1/cpu.c
@@ -0,0 +1,184 @@
+/*
+ * HP PA-RISC Dependent Source
+ *
+ * COPYRIGHT (c) 1994 by Division Incorporated
+ *
+ * The license and distribution terms for this file may in
+ * the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * $Id$
+ */
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+void hppa_cpu_halt(unsigned32 the_error);
+
+
+/*PAGE
+ *
+ * _CPU_ISR_install_raw_handler
+ */
+
+void _CPU_ISR_install_raw_handler(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ /*
+ * This is unsupported. For HPPA this function is handled by BSP
+ */
+
+ _CPU_Fatal_halt( 0xdeaddead );
+}
+
+
+
+/*
+ * This is the default handler which is called if
+ * _CPU_ISR_install_vector() has not been called for the
+ * specified vector. It simply forwards onto the spurious
+ * handler defined in the cpu-table.
+ */
+
+static ISR_Handler
+hppa_interrupt_report_spurious(ISR_Vector_number vector,
+ void* rtems_isr_frame) /* HPPA extension */
+{
+
+ /*
+ * If the CPU table defines a spurious_handler, then
+ * call it. If the handler returns halt.
+ */
+ if ( _CPU_Table.spurious_handler )
+ _CPU_Table.spurious_handler(vector, rtems_isr_frame);
+
+ hppa_cpu_halt(vector);
+}
+
+
+/*PAGE
+ *
+ * _CPU_ISR_Get_level
+ */
+
+unsigned32 _CPU_ISR_Get_level(void)
+{
+ int level;
+ HPPA_ASM_SSM(0, level); /* change no bits; just get copy */
+ if (level & HPPA_PSW_I)
+ return 0;
+ return 1;
+}
+
+/*PAGE
+ *
+ * _CPU_ISR_install_vector
+ *
+ * This kernel routine installs the RTEMS handler for the
+ * specified vector. The handler is a C callable routine.
+ *
+ * Input parameters:
+ * vector - interrupt vector number
+ * old_handler - former ISR for this vector number
+ * new_handler - replacement ISR for this vector number
+ *
+ * Output parameters: NONE
+ *
+ */
+
+void _CPU_ISR_install_vector(
+ unsigned32 vector,
+ proc_ptr new_handler,
+ proc_ptr *old_handler
+)
+{
+ *old_handler = _ISR_Vector_table[vector];
+
+ _ISR_Vector_table[vector] = new_handler;
+}
+
+/* _CPU_Initialize
+ *
+ * This routine performs processor dependent initialization.
+ *
+ * INPUT PARAMETERS:
+ * cpu_table - CPU table to initialize
+ * thread_dispatch - address of disptaching routine
+ *
+ */
+
+void _CPU_Initialize(
+ rtems_cpu_table *cpu_table,
+ void (*thread_dispatch) /* ignored on this CPU */
+)
+{
+ register unsigned8 *fp_context;
+ unsigned32 i;
+ proc_ptr old_handler;
+
+ /*
+ * This is the default fp context for all tasks
+ * Set it up so that denormalized results go to zero.
+ */
+
+ fp_context = (unsigned8*) &_CPU_Null_fp_context;
+ for (i=0 ; i<sizeof(Context_Control_fp); i++)
+ *fp_context++ = 0;
+ *((unsigned32 *) &_CPU_Null_fp_context) = HPPA_FPSTATUS_D;
+
+ /*
+ * Save r27 into _CPU_Default_gr27 so it will hopefully be the correct
+ * global data pointer for the entire system.
+ */
+
+ asm volatile( "stw %%r27,%0" : "=m" (_CPU_Default_gr27): );
+
+ /*
+ * Init the 2nd level interrupt handlers
+ */
+
+ for (i=0; i < CPU_INTERRUPT_NUMBER_OF_VECTORS; i++)
+ _CPU_ISR_install_vector(i,
+ hppa_interrupt_report_spurious,
+ &old_handler);
+
+ _CPU_Table = *cpu_table;
+
+}
+
+
+/*
+ * Halt the system.
+ * Called by the _CPU_Fatal_halt macro
+ *
+ * XXX
+ * Later on, this will allow us to return to the prom.
+ * For now, we just ignore 'type_of_halt'
+ *
+ * XXX
+ * NOTE: for gcc, this function must be at the bottom
+ * of the file, that is because if it is at the top
+ * of the file, gcc will inline it's calls. Since
+ * the function uses the HPPA_ASM_LABEL() macro, when
+ * gcc inlines it, you get two definitions of the same
+ * label name, which is an assembly error.
+ */
+
+
+void
+hppa_cpu_halt(unsigned32 the_error)
+{
+ unsigned32 isrlevel;
+
+ _CPU_ISR_Disable(isrlevel);
+
+ /*
+ * XXXXX NOTE: This label is only needed that that when
+ * the simulator stops, it shows the label name specified
+ */
+ HPPA_ASM_LABEL("_hppa_cpu_halt");
+ HPPA_ASM_BREAK(0, 0);
+}
+