aboutsummaryrefslogtreecommitdiff
path: root/src/libthread/OpenBSD-386-asm.s
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-07-19 11:48:01 +0000
committerrsc <devnull@localhost>2005-07-19 11:48:01 +0000
commitbea4b9f7246169ee1bd2a64a4b2be2c02ffcec8b (patch)
treecdcd8c46e07e0c2cb0fda82c0c574162bf7e5253 /src/libthread/OpenBSD-386-asm.s
parent9d654ebc8c4824a46483e0d5cf37a3e0181fe552 (diff)
downloadplan9port-bea4b9f7246169ee1bd2a64a4b2be2c02ffcec8b.tar.gz
plan9port-bea4b9f7246169ee1bd2a64a4b2be2c02ffcec8b.tar.bz2
plan9port-bea4b9f7246169ee1bd2a64a4b2be2c02ffcec8b.zip
openbsd
Diffstat (limited to 'src/libthread/OpenBSD-386-asm.s')
-rw-r--r--src/libthread/OpenBSD-386-asm.s54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/libthread/OpenBSD-386-asm.s b/src/libthread/OpenBSD-386-asm.s
new file mode 100644
index 00000000..f9a80255
--- /dev/null
+++ b/src/libthread/OpenBSD-386-asm.s
@@ -0,0 +1,54 @@
+.globl _tas
+_tas:
+ movl $0xCAFEBABE, %eax
+ movl 4(%esp), %ecx
+ xchgl %eax, 0(%ecx)
+ ret
+
+.globl setmcontext
+setmcontext:
+ movl 4(%esp), %edx
+ movl 8(%edx), %fs
+ movl 12(%edx), %es
+ movl 16(%edx), %ds
+ movl 76(%edx), %ss
+ movl 20(%edx), %edi
+ movl 24(%edx), %esi
+ movl 28(%edx), %ebp
+ movl %esp, %ecx
+ movl 72(%edx), %esp
+ pushl 60(%edx) /* eip */
+ pushl 44(%edx) /* ecx */
+ pushl 48(%edx) /* eax */
+ movl 36(%edx), %ebx
+ movl 40(%edx), %edx
+ movl 12(%ecx), %eax
+ popl %eax
+ popl %ecx
+ ret
+
+.globl getmcontext
+getmcontext:
+ pushl %edx
+ movl 8(%esp), %edx
+ movl %fs, 8(%edx)
+ movl %es, 12(%edx)
+ movl %ds, 16(%edx)
+ movl %ss, 76(%edx)
+ movl %edi, 20(%edx)
+ movl %esi, 24(%edx)
+ movl %ebp, 28(%edx)
+ movl %ebx, 36(%edx)
+ movl $1, 48(%edx)
+ popl %eax
+ movl %eax, 40(%edx)
+ movl %ecx, 44(%edx)
+ movl (%esp), %eax /* eip */
+ movl %eax, 60(%edx)
+ movl %esp, %eax
+ addl $4, %eax /* setmcontext will re-push the eip */
+ movl %eax, 72(%edx)
+ movl 40(%edx), %edx
+ xorl %eax, %eax
+ ret
+