diff options
author | Nicholas J. Kain <njkain@gmail.com> | 2011-02-15 07:32:09 -0500 |
---|---|---|
committer | Nicholas J. Kain <njkain@gmail.com> | 2011-02-15 07:32:09 -0500 |
commit | 1e12632591ab98a6ea3af8680716c28282552981 (patch) | |
tree | 5b79bd9a0b950d6ab414fef8cbb5dfcd1a6d2e83 /src/thread | |
parent | c2afb747b0296f23cd1903e82ccbdee3fc2978fd (diff) | |
download | musl-1e12632591ab98a6ea3af8680716c28282552981.tar.gz musl-1e12632591ab98a6ea3af8680716c28282552981.tar.bz2 musl-1e12632591ab98a6ea3af8680716c28282552981.tar.xz musl-1e12632591ab98a6ea3af8680716c28282552981.zip |
Port musl to x86-64. One giant commit!
Diffstat (limited to 'src/thread')
-rw-r--r-- | src/thread/x86_64/__set_thread_area.s | 15 | ||||
-rw-r--r-- | src/thread/x86_64/__unmapself.s | 24 | ||||
-rw-r--r-- | src/thread/x86_64/clone.s | 22 |
3 files changed, 61 insertions, 0 deletions
diff --git a/src/thread/x86_64/__set_thread_area.s b/src/thread/x86_64/__set_thread_area.s new file mode 100644 index 00000000..ed35b7a8 --- /dev/null +++ b/src/thread/x86_64/__set_thread_area.s @@ -0,0 +1,15 @@ +/* Copyright 2011 Nicholas J. Kain, licensed GNU LGPL 2.1 or later */ +.text +.global __set_thread_area +.type __set_thread_area,%function +__set_thread_area: + push %rbx /* save x86_64 abi clobbered registers */ + push %r11 + mov %rdi,%rsi /* shift for syscall */ + movl $0x1002,%edi /* SET_FS register */ + movl $158,%eax /* set fs segment to */ + syscall /* arch_prctl(SET_FS, arg)*/ + pop %r11 /* restore clobbered registers */ + pop %rbx + ret +.size __set_thread_area,.-__set_thread_area diff --git a/src/thread/x86_64/__unmapself.s b/src/thread/x86_64/__unmapself.s new file mode 100644 index 00000000..59092eaa --- /dev/null +++ b/src/thread/x86_64/__unmapself.s @@ -0,0 +1,24 @@ +/* Copyright 2011 Nicholas J. Kain, licensed GNU LGPL 2.1 or later */ +.text +.global __unmapself +.type __unmapself,%function +__unmapself: + call 1f /* glibc ABI compat */ + .long -1 + .long -1 +1: push %rsi /* save arg2 for munmap */ + push %rdx /* save arg3 for munmap */ + mov %rdi,%rsi /* rt_sigprocmask() args: move arg1 to rsi */ + xor %rdi,%rdi + xor %rdx,%rdx + movq $8,%r10 + movl $14,%eax /* __NR_rt_sigprocmask */ + syscall /* call rt_sigprocmask(0,arg1,0,8) */ + pop %rsi /* munmap() args: reload from stack */ + pop %rdi + movl $11,%eax /* __NR_munmap */ + syscall /* munmap(arg2,arg3) */ + xor %rdi,%rdi /* exit() args: always return success */ + movl $60,%eax /* __NR_exit */ + syscall /* exit(0) */ +.size __unmapself,.-__unmapself diff --git a/src/thread/x86_64/clone.s b/src/thread/x86_64/clone.s new file mode 100644 index 00000000..51410051 --- /dev/null +++ b/src/thread/x86_64/clone.s @@ -0,0 +1,22 @@ +/* Copyright 2011 Nicholas J. Kain, licensed GNU LGPL 2.1 or later */ +.text +.global __uniclone +.type __uniclone,%function +/* rdi = child_stack, rsi = start, rdx = pthread_struct */ +__uniclone: + subq $16,%rdi /* grow child_stack */ + mov %rsi,8(%rdi) /* push start onto child_stack as return ptr */ + mov %rdx,0(%rdi) /* push pthread_struct onto child_stack */ + mov %rdx,%r8 /* r8 = tls */ + mov %rdi,%rsi /* rsi = child_stack */ + leaq 40(%rdx),%r10 /* r10 = child_id */ + movl $56,%eax /* clone syscall number */ + movl $0x7d0f00,%edi /* rdi = flags */ + mov %r10,%rdx /* rdx = parent_id */ + syscall /* clone(flags, child_stack, parent_id, + * child_id, tls) */ + test %rax,%rax + jnz 1f /* if we're in the parent -> goto 1f */ + pop %rdi /* restore pthread_struct from child stack */ +1: ret +.size __uniclone,.-__uniclone |