summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/sparc/tbr/tbr.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--c/src/lib/libcpu/sparc/tbr/tbr.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/sparc/tbr/tbr.c b/c/src/lib/libcpu/sparc/tbr/tbr.c
new file mode 100644
index 0000000000..7106c58db2
--- /dev/null
+++ b/c/src/lib/libcpu/sparc/tbr/tbr.c
@@ -0,0 +1,50 @@
+/*
+ * SPARC Dependent Source
+ *
+ * COPYRIGHT (c) 1989-1999.
+ * 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$
+ */
+
+#include <libcpu/tbr.h>
+
+void
+sparc_init_tbr ()
+{
+#ifndef NO_TABLE_MOVE
+ unsigned32 trap_table_start;
+ unsigned32 tbr_value;
+ CPU_Trap_table_entry *old_tbr;
+ CPU_Trap_table_entry *trap_table;
+
+ /*
+ * Install the executive's trap table. All entries from the original
+ * trap table are copied into the executive's trap table. This is essential
+ * since this preserves critical trap handlers such as the window underflow
+ * and overflow handlers. It is the responsibility of the BSP to provide
+ * install these in the initial trap table.
+ */
+
+
+ trap_table_start = (unsigned32) & _CPU_Trap_Table_area;
+ if (trap_table_start & (SPARC_TRAP_TABLE_ALIGNMENT - 1))
+ trap_table_start = (trap_table_start + SPARC_TRAP_TABLE_ALIGNMENT) &
+ ~(SPARC_TRAP_TABLE_ALIGNMENT - 1);
+
+ trap_table = (CPU_Trap_table_entry *) trap_table_start;
+
+ sparc_get_tbr (tbr_value);
+
+ old_tbr = (CPU_Trap_table_entry *) (tbr_value & 0xfffff000);
+
+ memcpy (trap_table, (void *) old_tbr, 256 * sizeof (CPU_Trap_table_entry));
+
+ sparc_set_tbr (trap_table_start);
+
+#endif
+}