summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/sparc/syscall/syscall.S
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/sparc/syscall/syscall.S')
-rw-r--r--c/src/lib/libcpu/sparc/syscall/syscall.S78
1 files changed, 78 insertions, 0 deletions
diff --git a/c/src/lib/libcpu/sparc/syscall/syscall.S b/c/src/lib/libcpu/sparc/syscall/syscall.S
new file mode 100644
index 0000000000..fe9b512d81
--- /dev/null
+++ b/c/src/lib/libcpu/sparc/syscall/syscall.S
@@ -0,0 +1,78 @@
+/*
+ * systrap.S
+ *
+ * This file contains emulated system calls using software trap 0.
+ * The following calls are supported:
+ *
+ * + SYS_exit (halt)
+ * + SYS_irqdis (disable interrupts)
+ * + SYS_irqset (set interrupt level)
+ *
+ * COPYRIGHT:
+ *
+ * COPYRIGHT (c) 1995. European Space Agency.
+ *
+ * This terms of the RTEMS license apply to this file.
+ *
+ */
+
+#include <asm.h>
+#include "syscall.h"
+
+ .seg "text"
+ /*
+ * system call
+ *
+ * On entry:
+ *
+ * l0 = psr (from trap table)
+ * l1 = pc
+ * l2 = npc
+ * g1 = system call id
+ */
+
+ PUBLIC(syscall)
+
+SYM(syscall):
+
+ subcc %g1, 2, %g0 ! syscall 2, disable interrupts
+ bne 3f
+ or %l0, 0x0f00, %l4 ! set PIL=15
+ mov %l4, %psr
+ or %l0, SPARC_PSR_ET_MASK, %i0 ! return old psr with ET=1
+ ba,a 9f
+3:
+ subcc %g1, 3, %g0 ! syscall 3, enable interrupts
+ bne 1f
+ and %i0, SPARC_PSR_PIL_MASK, %l4
+ andn %l0, SPARC_PSR_PIL_MASK, %l5
+ or %l5, %l4, %l4
+ mov %l4, %psr
+ ba,a 9f
+
+1:
+ ta 0 ! halt
+9: ! leave
+ mov 0, %g1 ! clear %g1
+ jmpl %l2, %g0
+ rett %l2 + 4
+
+ PUBLIC(sparc_disable_interrupts)
+
+SYM(sparc_disable_interrupts):
+
+ mov SYS_irqdis, %g1
+ ta 0
+ retl
+ nop
+
+ PUBLIC(sparc_enable_interrupts)
+
+SYM(sparc_enable_interrupts):
+
+ mov SYS_irqen, %g1
+ ta 0
+ retl
+ nop
+
+/* end of file */