aboutsummaryrefslogtreecommitdiff
path: root/lib/darwin/inject-asm-raw.S
diff options
context:
space:
mode:
Diffstat (limited to 'lib/darwin/inject-asm-raw.S')
-rw-r--r--lib/darwin/inject-asm-raw.S113
1 files changed, 113 insertions, 0 deletions
diff --git a/lib/darwin/inject-asm-raw.S b/lib/darwin/inject-asm-raw.S
new file mode 100644
index 0000000..a8980c3
--- /dev/null
+++ b/lib/darwin/inject-asm-raw.S
@@ -0,0 +1,113 @@
+.text
+.align 2
+/* sp -> {pthread_create, dlopen, dylib} */
+#if defined(__x86_64__)
+ lea -8(%rsp), %rdi /* thread */
+ xor %rsi, %rsi /* attr */
+ lea thread_func(%rip), %rdx /* start_routine */
+ mov %rsp, %rcx /* arg */
+ mov %rdi, %rsp
+ call *(%rcx)
+/* suicide */
+ mov $361, %rax /* bsdthread_terminate */
+ xor %rdi, %rdi /* stackaddr */
+ xor %rsi, %rsi /* freesize */
+ xor %rdx, %rdx /* port */
+ xor %rcx, %rcx /* sem */
+ syscall
+/* still here? */
+ mov $0xbad, %rax
+ jmp *%rax
+
+thread_func:
+ mov 0x8(%rdi), %rax /* dlopen */
+ mov 0x10(%rdi), %rdi /* dylib */
+ xor %rsi, %rsi
+ jmp *%rax
+
+#elif defined(__i386__)
+
+ mov %esp, %ecx
+ push %ecx /* arg */
+ call 1f
+1:
+ pop %eax
+ add $(thread_func - 1b), %eax
+ push %eax /* start_routine */
+ xor %eax, %eax
+ push %eax /* attr */
+ push %esp /* thread */
+ call *(%ecx)
+/* suicide */
+ mov $361, %eax /* bsdthread_terminate */
+ xor %edx, %edx
+ push %edx /* sem */
+ push %edx /* port */
+ push %edx /* freesize */
+ push %edx /* stackaddr */
+ syscall
+/* still here? */
+ mov $0xbad, %eax
+ jmp *%eax
+
+thread_func:
+ xor %edx, %edx
+ push %edx
+ mov 0x4(%esp), %ecx /* arg */
+ mov 0x8(%ecx), %edx /* dylib */
+ push %edx
+ mov 0x4(%ecx), %edx /* dlopen */
+ push %edx
+ call *%eax
+ add $8, %esp
+ ret
+
+#elif defined(__arm__)
+
+ sub sp, #4
+ mov r0, sp
+ mov r1, #0
+ adr r2, thread_func
+ add r3, sp, #4
+ ldr r9, [r3]
+ blx r9
+/* suicide */
+ mov r0, #0
+ mov r1, #0
+ mov r2, #0
+ mov r3, #0
+ mov r12, #361
+ svc #0x80
+/* still here? */
+ mov r0, #0xbad
+ bx r0
+thread_func:
+ ldr r2, [r0]
+ ldr r0, [r0, #4]
+ mov r1, #0
+ bx r2
+
+#elif defined(__arm64__)
+ sub sp, sp, #8
+ mov x0, sp
+ mov x1, #0
+ adr x2, 1f
+ add x3, sp, #4
+ ldr x9, [x3]
+ blr x9
+/* suicide */
+ mov x0, #0
+ mov x1, #0
+ mov x2, #0
+ mov x3, #0
+ mov x12, #361 /* ??? */
+ svc #0x80
+/* still here? */
+ mov x0, #0xbad
+ br x0
+1:
+ ldr x2, [x0]
+ ldr x0, [x0, #8]
+ mov x1, #0
+ br x2
+#endif