summaryrefslogtreecommitdiffstats
path: root/tools/KSE/ksetest/kse_asm.S
diff options
context:
space:
mode:
Diffstat (limited to 'tools/KSE/ksetest/kse_asm.S')
-rw-r--r--tools/KSE/ksetest/kse_asm.S88
1 files changed, 88 insertions, 0 deletions
diff --git a/tools/KSE/ksetest/kse_asm.S b/tools/KSE/ksetest/kse_asm.S
new file mode 100644
index 0000000..a12358c
--- /dev/null
+++ b/tools/KSE/ksetest/kse_asm.S
@@ -0,0 +1,88 @@
+/*-
+ * $FreeBSD$
+ */
+
+#include <machine/asmacros.h>
+
+/*****************************************************************************/
+/* Scheduling */
+/*****************************************************************************/
+
+ .data
+
+ .text
+
+#define TF_GS -0x04 /* don't laugh! */
+#define TF_FS 0x00
+#define TF_ES 0x04
+#define TF_DS 0x08
+#define TF_EDI 0x0c
+#define TF_ESI 0x10
+#define TF_EBP 0x14
+#define TF_ISP 0x18
+#define TF_EBX 0x1c
+#define TF_EDX 0x20
+#define TF_ECX 0x24
+#define TF_EAX 0x28
+#define TF_TRAPNO 0x2c
+#define TF_ERR 0x30
+#define TF_EIP 0x34
+#define TF_CS 0x38
+#define TF_EFLAGS 0x3c
+#define TF_ESP 0x40
+#define TF_SS 0x44
+
+/*
+ * savethread
+ */
+GEN_ENTRY(savethread)
+
+ /* Switch to new thread. First, save context as needed. */
+ pushl %edx
+ movl 8(%esp), %edx /* get context area */
+
+ movl %eax,TF_EAX(%edx)
+ movl %ebx,TF_EBX(%edx)
+ movl %ecx,TF_ECX(%edx)
+ popl %eax /* get dx off the stack again */
+ movl %eax,TF_EDX(%edx)
+ movl (%esp),%eax /* get the return address */
+ movl %eax,TF_EIP(%edx)
+ movl %esp,TF_ESP(%edx)
+ movl %esp,TF_ISP(%edx) /* XXX */
+ movl %ebp,TF_EBP(%edx)
+ movl %esi,TF_ESI(%edx)
+ movl %edi,TF_EDI(%edx)
+ movl %cs,TF_CS(%edx)
+ movl %ds,TF_DS(%edx)
+ movl %es,TF_ES(%edx)
+ movl %fs,TF_FS(%edx)
+ movl %gs,TF_GS(%edx)
+ ret
+
+
+GEN_ENTRY(loadthread)
+ mov 4(%esp), %edx /* get context area */
+
+/* movl TF_ISP(%edx), %esp */ /* select which is correct */
+ movl TF_ESP(%edx), %esp /* get the new stack online */
+ movl TF_EBP(%edx), %ebp
+ movl TF_EIP(%edx),%eax
+ push %eax /* return adddress */
+#if 0
+ movl TF_CS(%edx), %cs
+ movl TF_DS(%edx), %ds
+ movl TF_ES(%edx), %es
+ movl TF_FS(%edx), %fs
+ movl TF_GS(%edx), %gs
+#endif
+ movl TF_ESI(%edx), %esi
+ movl TF_EDI(%edx), %edi
+
+ movl TF_EDX(%edx), %eax
+ pushl %eax
+ movl TF_ECX(%edx), %ecx
+ movl TF_EBX(%edx), %ebx
+ movl TF_EAX(%edx), %eax
+ popl %edx
+ ret
OpenPOWER on IntegriCloud