From 9bc8a11afeed3569736b89754012e3ca22ee10f6 Mon Sep 17 00:00:00 2001 From: pommicket Date: Sun, 20 Feb 2022 13:18:21 -0800 Subject: conclusion --- .../src/thread/x86_64/__set_thread_area.s | 11 ++++++++++ 05/musl-0.6.0/src/thread/x86_64/__unmapself.s | 24 ++++++++++++++++++++++ 05/musl-0.6.0/src/thread/x86_64/clone.s | 22 ++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 05/musl-0.6.0/src/thread/x86_64/__set_thread_area.s create mode 100644 05/musl-0.6.0/src/thread/x86_64/__unmapself.s create mode 100644 05/musl-0.6.0/src/thread/x86_64/clone.s (limited to '05/musl-0.6.0/src/thread/x86_64') diff --git a/05/musl-0.6.0/src/thread/x86_64/__set_thread_area.s b/05/musl-0.6.0/src/thread/x86_64/__set_thread_area.s new file mode 100644 index 0000000..faf73ec --- /dev/null +++ b/05/musl-0.6.0/src/thread/x86_64/__set_thread_area.s @@ -0,0 +1,11 @@ +/* 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: + 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)*/ + ret +.size __set_thread_area,.-__set_thread_area diff --git a/05/musl-0.6.0/src/thread/x86_64/__unmapself.s b/05/musl-0.6.0/src/thread/x86_64/__unmapself.s new file mode 100644 index 0000000..59092ea --- /dev/null +++ b/05/musl-0.6.0/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/05/musl-0.6.0/src/thread/x86_64/clone.s b/05/musl-0.6.0/src/thread/x86_64/clone.s new file mode 100644 index 0000000..3cefd93 --- /dev/null +++ b/05/musl-0.6.0/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 $8,%rsp /* pad parent stack to prevent branch later */ + 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) */ + pop %rdi /* child stack: restore pthread_struct + * parent stack: undo rsp displacement */ + ret +.size __uniclone,.-__uniclone -- cgit v1.2.3