summaryrefslogtreecommitdiff
path: root/src/thread/i386
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-03-25 22:13:57 -0400
committerRich Felker <dalias@aerifal.cx>2011-03-25 22:13:57 -0400
commitea343364a719add2cd8adf8a50c15bb5f9400dd8 (patch)
tree36056bd0bd1c4c49118b6b3366db6432f7c80fc1 /src/thread/i386
parent92b52b70e8c0786c95cb73a691e1f6e89a73be46 (diff)
downloadmusl-ea343364a719add2cd8adf8a50c15bb5f9400dd8.tar.gz
musl-ea343364a719add2cd8adf8a50c15bb5f9400dd8.tar.bz2
musl-ea343364a719add2cd8adf8a50c15bb5f9400dd8.tar.xz
musl-ea343364a719add2cd8adf8a50c15bb5f9400dd8.zip
match glibc/lsb cancellation abi on i386
glibc made the ridiculous choice to use pass-by-register calling convention for these functions, which is impossible to duplicate directly on non-gcc compilers. instead, we use ugly asm to wrap and convert the calling convention. presumably this works with every compiler anyone could potentially want to use.
Diffstat (limited to 'src/thread/i386')
-rw-r--r--src/thread/i386/cancellation2.s16
-rw-r--r--src/thread/i386/cancellation3.s8
2 files changed, 24 insertions, 0 deletions
diff --git a/src/thread/i386/cancellation2.s b/src/thread/i386/cancellation2.s
new file mode 100644
index 00000000..859aa239
--- /dev/null
+++ b/src/thread/i386/cancellation2.s
@@ -0,0 +1,16 @@
+.text
+.global __pthread_register_cancel
+.type __pthread_register_cancel,%function
+__pthread_register_cancel:
+ pushl %eax
+ call __pthread_register_cancel_3
+ popl %eax
+ ret
+
+.global __pthread_unregister_cancel
+.type __pthread_unregister_cancel,%function
+__pthread_unregister_cancel:
+ pushl %eax
+ call __pthread_unregister_cancel_3
+ popl %eax
+ ret
diff --git a/src/thread/i386/cancellation3.s b/src/thread/i386/cancellation3.s
new file mode 100644
index 00000000..210293e2
--- /dev/null
+++ b/src/thread/i386/cancellation3.s
@@ -0,0 +1,8 @@
+.text
+.global __pthread_unwind_next
+.type __pthread_unwind_next,%function
+__pthread_unwind_next:
+ pushl %eax
+ call __pthread_unwind_next_3
+ popl %eax
+ ret