From 664cd341921007cea52c8891f27ce35927dca378 Mon Sep 17 00:00:00 2001 From: rofl0r Date: Tue, 7 Jan 2014 22:53:38 +0100 Subject: x32 port (diff against vanilla x86_64) --- src/fenv/x32/fenv.s | 52 +++++++++++++++++++------------------- src/ldso/x32/start.s | 22 +++++++++++----- src/math/x32/acosl.s | 2 +- src/math/x32/asinl.s | 2 +- src/math/x32/atan2l.s | 4 +-- src/math/x32/atanl.s | 2 +- src/math/x32/exp2l.s | 42 +++++++++++++++--------------- src/math/x32/expl.s | 32 +++++++++++------------ src/math/x32/fabsl.s | 2 +- src/math/x32/floorl.s | 18 ++++++------- src/math/x32/fmodl.s | 4 +-- src/math/x32/llrintl.s | 6 ++--- src/math/x32/log10l.s | 2 +- src/math/x32/log1pl.s | 4 +-- src/math/x32/log2l.s | 2 +- src/math/x32/logl.s | 2 +- src/math/x32/lrintl.s | 6 ++--- src/math/x32/remainderl.s | 4 +-- src/math/x32/rintl.s | 2 +- src/math/x32/sqrtl.s | 2 +- src/process/x32/vfork.s | 2 +- src/signal/x32/restore.s | 2 +- src/thread/x32/__set_thread_area.s | 2 +- src/thread/x32/__unmapself.s | 4 +-- src/thread/x32/clone.s | 6 ++--- src/thread/x32/syscall_cp.s | 6 ++--- 26 files changed, 120 insertions(+), 114 deletions(-) (limited to 'src') diff --git a/src/fenv/x32/fenv.s b/src/fenv/x32/fenv.s index b5aeaf4f..45310465 100644 --- a/src/fenv/x32/fenv.s +++ b/src/fenv/x32/fenv.s @@ -8,14 +8,14 @@ feclearexcept: test %eax,%ecx jz 1f fnclex -1: stmxcsr -8(%rsp) +1: stmxcsr -8(%esp) and $0x3f,%eax - or %eax,-8(%rsp) - test %ecx,-8(%rsp) + or %eax,-8(%esp) + test %ecx,-8(%esp) jz 1f not %ecx - and %ecx,-8(%rsp) - ldmxcsr -8(%rsp) + and %ecx,-8(%esp) + ldmxcsr -8(%esp) 1: xor %eax,%eax ret @@ -23,9 +23,9 @@ feclearexcept: .type feraiseexcept,@function feraiseexcept: and $0x3f,%edi - stmxcsr -8(%rsp) - or %edi,-8(%rsp) - ldmxcsr -8(%rsp) + stmxcsr -8(%esp) + or %edi,-8(%esp) + ldmxcsr -8(%esp) xor %eax,%eax ret @@ -35,15 +35,15 @@ __fesetround: push %rax xor %eax,%eax mov %edi,%ecx - fnstcw (%rsp) - andb $0xf3,1(%rsp) - or %ch,1(%rsp) - fldcw (%rsp) - stmxcsr (%rsp) + fnstcw (%esp) + andb $0xf3,1(%esp) + or %ch,1(%esp) + fldcw (%esp) + stmxcsr (%esp) shl $3,%ch - andb $0x9f,1(%rsp) - or %ch,1(%rsp) - ldmxcsr (%rsp) + andb $0x9f,1(%esp) + or %ch,1(%esp) + ldmxcsr (%esp) pop %rcx ret @@ -51,7 +51,7 @@ __fesetround: .type fegetround,@function fegetround: push %rax - stmxcsr (%rsp) + stmxcsr (%esp) pop %rax shr $3,%eax and $0xc00,%eax @@ -61,27 +61,27 @@ fegetround: .type fegetenv,@function fegetenv: xor %eax,%eax - fnstenv (%rdi) - stmxcsr 28(%rdi) + fnstenv (%edi) + stmxcsr 28(%edi) ret .global fesetenv .type fesetenv,@function fesetenv: xor %eax,%eax - inc %rdi + inc %edi jz 1f - fldenv -1(%rdi) - ldmxcsr 27(%rdi) + fldenv -1(%edi) + ldmxcsr 27(%edi) ret 1: push %rax push %rax pushq $0xffff pushq $0x37f - fldenv (%rsp) + fldenv (%esp) pushq $0x1f80 - ldmxcsr (%rsp) - add $40,%rsp + ldmxcsr (%esp) + add $40,%esp ret .global fetestexcept @@ -89,7 +89,7 @@ fesetenv: fetestexcept: and $0x3f,%edi push %rax - stmxcsr (%rsp) + stmxcsr (%esp) pop %rsi fnstsw %ax or %esi,%eax diff --git a/src/ldso/x32/start.s b/src/ldso/x32/start.s index 80c1d08d..0fcf46dc 100644 --- a/src/ldso/x32/start.s +++ b/src/ldso/x32/start.s @@ -1,16 +1,24 @@ .text .global _start _start: - mov (%rsp),%rdi - lea 8(%rsp),%rsi + mov (%rsp),%rdi /* move argc into 1st argument slot */ + lea 4(%rsp),%rsi /* move argv into 2nd argument slot */ call __dynlink - pop %rdi + /* in case the dynlinker was called directly, it sets the "consumed" + argv values to -1. so we must loop over the array as long as -1 + is in the top argv slot, decrement argc, and then set the stackpointer + to the new argc as well as argc's new value. + as the x32 abi has longs in the argv array, we cannot use push/pop.*/ + movl (%rsp),%edi /* copy argc into edi */ + xor %rdx,%rdx /* we use rdx as an offset to the current argv member */ 1: dec %edi - pop %rsi - cmp $-1,%rsi + addl $4, %edx + movl (%rsp, %rdx), %esi + cmp $-1,%esi jz 1b inc %edi - push %rsi - push %rdi + subl $4, %edx + lea (%rsp, %rdx), %rsp /* set rsp to new argv[-1] */ + movl %edi, (%rsp) /* write new argc there */ xor %edx,%edx jmp *%rax diff --git a/src/math/x32/acosl.s b/src/math/x32/acosl.s index 88e01b49..1abca12e 100644 --- a/src/math/x32/acosl.s +++ b/src/math/x32/acosl.s @@ -3,7 +3,7 @@ .global acosl .type acosl,@function acosl: - fldt 8(%rsp) + fldt 8(%esp) 1: fld %st(0) fld1 fsub %st(0),%st(1) diff --git a/src/math/x32/asinl.s b/src/math/x32/asinl.s index ed212d9a..7fe9f127 100644 --- a/src/math/x32/asinl.s +++ b/src/math/x32/asinl.s @@ -1,7 +1,7 @@ .global asinl .type asinl,@function asinl: - fldt 8(%rsp) + fldt 8(%esp) 1: fld %st(0) fld1 fsub %st(0),%st(1) diff --git a/src/math/x32/atan2l.s b/src/math/x32/atan2l.s index e5f0a3de..1ead0788 100644 --- a/src/math/x32/atan2l.s +++ b/src/math/x32/atan2l.s @@ -1,7 +1,7 @@ .global atan2l .type atan2l,@function atan2l: - fldt 8(%rsp) - fldt 24(%rsp) + fldt 8(%esp) + fldt 24(%esp) fpatan ret diff --git a/src/math/x32/atanl.s b/src/math/x32/atanl.s index df76de5d..f475fe0e 100644 --- a/src/math/x32/atanl.s +++ b/src/math/x32/atanl.s @@ -1,7 +1,7 @@ .global atanl .type atanl,@function atanl: - fldt 8(%rsp) + fldt 8(%esp) fld1 fpatan ret diff --git a/src/math/x32/exp2l.s b/src/math/x32/exp2l.s index 0d6cd563..d9f4d6ed 100644 --- a/src/math/x32/exp2l.s +++ b/src/math/x32/exp2l.s @@ -1,11 +1,11 @@ .global expm1l .type expm1l,@function expm1l: - fldt 8(%rsp) + fldt 8(%esp) fldl2e fmulp - movl $0xc2820000,-4(%rsp) - flds -4(%rsp) + movl $0xc2820000,-4(%esp) + flds -4(%esp) fucomp %st(1) fnstsw %ax sahf @@ -35,21 +35,21 @@ expm1l: .global exp2l .type exp2l,@function exp2l: - fldt 8(%rsp) + fldt 8(%esp) 1: fld %st(0) - sub $16,%rsp - fstpt (%rsp) - mov 8(%rsp),%ax + sub $16,%esp + fstpt (%esp) + mov 8(%esp),%ax and $0x7fff,%ax cmp $0x3fff+13,%ax jb 4f # |x| < 8192 cmp $0x3fff+15,%ax jae 3f # |x| >= 32768 - fsts (%rsp) - cmpl $0xc67ff800,(%rsp) + fsts (%esp) + cmpl $0xc67ff800,(%esp) jb 2f # x > -16382 - movl $0x5f000000,(%rsp) - flds (%rsp) # 0x1p63 + movl $0x5f000000,(%esp) + flds (%esp) # 0x1p63 fld %st(1) fsub %st(1) faddp @@ -57,10 +57,10 @@ exp2l: fnstsw sahf je 2f # x - 0x1p63 + 0x1p63 == x - movl $1,(%rsp) - flds (%rsp) # 0x1p-149 + movl $1,(%esp) + flds (%esp) # 0x1p-149 fdiv %st(1) - fstps (%rsp) # raise underflow + fstps (%esp) # raise underflow 2: fld1 fld %st(1) frndint @@ -70,21 +70,21 @@ exp2l: faddp # 2^(x-rint(x)) 1: fscale fstp %st(1) - add $16,%rsp + add $16,%esp ret 3: xor %eax,%eax 4: cmp $0x3fff-64,%ax fld1 jb 1b # |x| < 0x1p-64 - fstpt (%rsp) - fistl 8(%rsp) - fildl 8(%rsp) + fstpt (%esp) + fistl 8(%esp) + fildl 8(%esp) fsubrp %st(1) - addl $0x3fff,8(%rsp) + addl $0x3fff,8(%esp) f2xm1 fld1 faddp # 2^(x-rint(x)) - fldt (%rsp) # 2^rint(x) + fldt (%esp) # 2^rint(x) fmulp - add $16,%rsp + add $16,%esp ret diff --git a/src/math/x32/expl.s b/src/math/x32/expl.s index 3add810d..aabea45e 100644 --- a/src/math/x32/expl.s +++ b/src/math/x32/expl.s @@ -6,11 +6,11 @@ .global expl .type expl,@function expl: - fldt 8(%rsp) + fldt 8(%esp) # interesting case: 0x1p-32 <= |x| < 16384 # check if (exponent|0x8000) is in [0xbfff-32, 0xbfff+13] - mov 16(%rsp), %ax + mov 16(%esp), %ax or $0x8000, %ax sub $0xbfdf, %ax cmp $45, %ax @@ -29,29 +29,29 @@ expl: # should be 0x1.71547652b82fe178p0L == 0x3fff b8aa3b29 5c17f0bc # it will be wrong on non-nearest rounding mode 2: fldl2e - subq $48, %rsp + sub $48, %esp # hi = log2e_hi*x # 2^hi = exp2l(hi) fmul %st(1),%st fld %st(0) - fstpt (%rsp) - fstpt 16(%rsp) - fstpt 32(%rsp) + fstpt (%esp) + fstpt 16(%esp) + fstpt 32(%esp) call exp2l # if 2^hi == inf return 2^hi fld %st(0) - fstpt (%rsp) - cmpw $0x7fff, 8(%rsp) + fstpt (%esp) + cmpw $0x7fff, 8(%esp) je 1f - fldt 32(%rsp) - fldt 16(%rsp) + fldt 32(%esp) + fldt 16(%esp) # fpu stack: 2^hi x hi # exact mult: x*log2e fld %st(1) # c = 0x1p32+1 movq $0x41f0000000100000,%rax pushq %rax - fldl (%rsp) + fldl (%esp) # xh = x - c*x + c*x # xl = x - xh fmulp @@ -63,7 +63,7 @@ expl: # yh = log2e_hi - c*log2e_hi + c*log2e_hi movq $0x3ff7154765200000,%rax pushq %rax - fldl (%rsp) + fldl (%esp) # fpu stack: 2^hi x hi xh xl yh # lo = hi - xh*yh + xl*yh fld %st(2) @@ -74,7 +74,7 @@ expl: # yl = log2e_hi - yh movq $0x3de705fc2f000000,%rax pushq %rax - fldl (%rsp) + fldl (%esp) # fpu stack: 2^hi x lo xh xl yl # lo += xh*yl + xl*yl fmul %st, %st(2) @@ -87,8 +87,8 @@ expl: pushq %rax movq $0x82f0025f2dc582ee,%rax pushq %rax - fldt (%rsp) - addq $40,%rsp + fldt (%esp) + add $40,%esp # fpu stack: 2^hi x lo log2e_lo # lo += log2e_lo*x # return 2^hi + 2^hi (2^lo - 1) @@ -97,5 +97,5 @@ expl: f2xm1 fmul %st(1), %st faddp -1: addq $48, %rsp +1: add $48, %esp ret diff --git a/src/math/x32/fabsl.s b/src/math/x32/fabsl.s index 4e7ab525..4f215df5 100644 --- a/src/math/x32/fabsl.s +++ b/src/math/x32/fabsl.s @@ -1,6 +1,6 @@ .global fabsl .type fabsl,@function fabsl: - fldt 8(%rsp) + fldt 8(%esp) fabs ret diff --git a/src/math/x32/floorl.s b/src/math/x32/floorl.s index 80da4660..78dcb6da 100644 --- a/src/math/x32/floorl.s +++ b/src/math/x32/floorl.s @@ -1,27 +1,27 @@ .global floorl .type floorl,@function floorl: - fldt 8(%rsp) + fldt 8(%esp) 1: mov $0x7,%al -1: fstcw 8(%rsp) - mov 9(%rsp),%ah - mov %al,9(%rsp) - fldcw 8(%rsp) +1: fstcw 8(%esp) + mov 9(%esp),%ah + mov %al,9(%esp) + fldcw 8(%esp) frndint - mov %ah,9(%rsp) - fldcw 8(%rsp) + mov %ah,9(%esp) + fldcw 8(%esp) ret .global ceill .type ceill,@function ceill: - fldt 8(%rsp) + fldt 8(%esp) mov $0xb,%al jmp 1b .global truncl .type truncl,@function truncl: - fldt 8(%rsp) + fldt 8(%esp) mov $0xf,%al jmp 1b diff --git a/src/math/x32/fmodl.s b/src/math/x32/fmodl.s index ca81e60c..9e4378ab 100644 --- a/src/math/x32/fmodl.s +++ b/src/math/x32/fmodl.s @@ -1,8 +1,8 @@ .global fmodl .type fmodl,@function fmodl: - fldt 24(%rsp) - fldt 8(%rsp) + fldt 24(%esp) + fldt 8(%esp) 1: fprem fstsw %ax sahf diff --git a/src/math/x32/llrintl.s b/src/math/x32/llrintl.s index 1ec0817d..09386079 100644 --- a/src/math/x32/llrintl.s +++ b/src/math/x32/llrintl.s @@ -1,7 +1,7 @@ .global llrintl .type llrintl,@function llrintl: - fldt 8(%rsp) - fistpll 8(%rsp) - mov 8(%rsp),%rax + fldt 8(%esp) + fistpll 8(%esp) + mov 8(%esp),%rax ret diff --git a/src/math/x32/log10l.s b/src/math/x32/log10l.s index 48ea4af7..ef5bea3f 100644 --- a/src/math/x32/log10l.s +++ b/src/math/x32/log10l.s @@ -2,6 +2,6 @@ .type log10l,@function log10l: fldlg2 - fldt 8(%rsp) + fldt 8(%esp) fyl2x ret diff --git a/src/math/x32/log1pl.s b/src/math/x32/log1pl.s index 955c9dbf..2e64fd4b 100644 --- a/src/math/x32/log1pl.s +++ b/src/math/x32/log1pl.s @@ -1,10 +1,10 @@ .global log1pl .type log1pl,@function log1pl: - mov 14(%rsp),%eax + mov 14(%esp),%eax fldln2 and $0x7fffffff,%eax - fldt 8(%rsp) + fldt 8(%esp) cmp $0x3ffd9400,%eax ja 1f fyl2xp1 diff --git a/src/math/x32/log2l.s b/src/math/x32/log2l.s index ba08b9fb..bf88e8e2 100644 --- a/src/math/x32/log2l.s +++ b/src/math/x32/log2l.s @@ -2,6 +2,6 @@ .type log2l,@function log2l: fld1 - fldt 8(%rsp) + fldt 8(%esp) fyl2x ret diff --git a/src/math/x32/logl.s b/src/math/x32/logl.s index 20dd1f81..eff64506 100644 --- a/src/math/x32/logl.s +++ b/src/math/x32/logl.s @@ -2,6 +2,6 @@ .type logl,@function logl: fldln2 - fldt 8(%rsp) + fldt 8(%esp) fyl2x ret diff --git a/src/math/x32/lrintl.s b/src/math/x32/lrintl.s index d587b12b..ee97d1cf 100644 --- a/src/math/x32/lrintl.s +++ b/src/math/x32/lrintl.s @@ -1,7 +1,7 @@ .global lrintl .type lrintl,@function lrintl: - fldt 8(%rsp) - fistpll 8(%rsp) - mov 8(%rsp),%rax + fldt 8(%esp) + fistpll 8(%esp) + mov 8(%esp),%rax ret diff --git a/src/math/x32/remainderl.s b/src/math/x32/remainderl.s index 75c12374..c97f68ad 100644 --- a/src/math/x32/remainderl.s +++ b/src/math/x32/remainderl.s @@ -1,8 +1,8 @@ .global remainderl .type remainderl,@function remainderl: - fldt 24(%rsp) - fldt 8(%rsp) + fldt 24(%esp) + fldt 8(%esp) 1: fprem1 fstsw %ax sahf diff --git a/src/math/x32/rintl.s b/src/math/x32/rintl.s index 64e663cd..be1d2fa7 100644 --- a/src/math/x32/rintl.s +++ b/src/math/x32/rintl.s @@ -1,6 +1,6 @@ .global rintl .type rintl,@function rintl: - fldt 8(%rsp) + fldt 8(%esp) frndint ret diff --git a/src/math/x32/sqrtl.s b/src/math/x32/sqrtl.s index 23cd687d..8d70856e 100644 --- a/src/math/x32/sqrtl.s +++ b/src/math/x32/sqrtl.s @@ -1,5 +1,5 @@ .global sqrtl .type sqrtl,@function -sqrtl: fldt 8(%rsp) +sqrtl: fldt 8(%esp) fsqrt ret diff --git a/src/process/x32/vfork.s b/src/process/x32/vfork.s index 27af46f5..1039f0f2 100644 --- a/src/process/x32/vfork.s +++ b/src/process/x32/vfork.s @@ -5,7 +5,7 @@ __vfork: vfork: pop %rdx - mov $58,%eax + mov $0x4000003a,%eax /* SYS_vfork */ syscall push %rdx mov %rax,%rdi diff --git a/src/signal/x32/restore.s b/src/signal/x32/restore.s index 682af2dd..27cd3cef 100644 --- a/src/signal/x32/restore.s +++ b/src/signal/x32/restore.s @@ -4,5 +4,5 @@ .type __restore,@function __restore_rt: __restore: - movl $15, %eax + movl $0x40000201, %eax /* SYS_rt_sigreturn */ syscall diff --git a/src/thread/x32/__set_thread_area.s b/src/thread/x32/__set_thread_area.s index f3ff4f61..94bc3630 100644 --- a/src/thread/x32/__set_thread_area.s +++ b/src/thread/x32/__set_thread_area.s @@ -5,6 +5,6 @@ __set_thread_area: mov %rdi,%rsi /* shift for syscall */ movl $0x1002,%edi /* SET_FS register */ - movl $158,%eax /* set fs segment to */ + movl $0x4000009e,%eax /* set fs segment to */ syscall /* arch_prctl(SET_FS, arg)*/ ret diff --git a/src/thread/x32/__unmapself.s b/src/thread/x32/__unmapself.s index e2689e65..d9254601 100644 --- a/src/thread/x32/__unmapself.s +++ b/src/thread/x32/__unmapself.s @@ -3,8 +3,8 @@ .global __unmapself .type __unmapself,@function __unmapself: - movl $11,%eax /* SYS_munmap */ + movl $0x4000000b,%eax /* SYS_munmap */ syscall /* munmap(arg2,arg3) */ xor %rdi,%rdi /* exit() args: always return success */ - movl $60,%eax /* SYS_exit */ + movl $0x4000003c,%eax /* SYS_exit */ syscall /* exit(0) */ diff --git a/src/thread/x32/clone.s b/src/thread/x32/clone.s index ee59903a..eed46151 100644 --- a/src/thread/x32/clone.s +++ b/src/thread/x32/clone.s @@ -2,8 +2,7 @@ .global __clone .type __clone,@function __clone: - xor %eax,%eax - mov $56,%al + movl $0x40000038,%eax /* SYS_clone */ mov %rdi,%r11 mov %rdx,%rdi mov %r8,%rdx @@ -20,8 +19,7 @@ __clone: pop %rdi call *%r9 mov %eax,%edi - xor %eax,%eax - mov $60,%al + movl $0x4000003c,%eax /* SYS_exit */ syscall hlt 1: ret diff --git a/src/thread/x32/syscall_cp.s b/src/thread/x32/syscall_cp.s index 788c53cc..70605c19 100644 --- a/src/thread/x32/syscall_cp.s +++ b/src/thread/x32/syscall_cp.s @@ -1,7 +1,7 @@ .text -.global __syscall_cp_asm -.type __syscall_cp_asm,@function -__syscall_cp_asm: +.global __syscall_cp_internal +.type __syscall_cp_internal,@function +__syscall_cp_internal: .global __cp_begin __cp_begin: -- cgit v1.2.1