mirror of https://github.com/hnes/libaco
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
5.3 KiB
192 lines
5.3 KiB
.text
|
|
.globl acosw
|
|
#if defined(__APPLE__)
|
|
#else
|
|
.type acosw, @function
|
|
#endif
|
|
.intel_syntax noprefix
|
|
acosw:
|
|
/*
|
|
extern void acosw(aco_t* from_co, aco_t* to_co);
|
|
|
|
struct aco_t {
|
|
void* reg[X];
|
|
// ...
|
|
}
|
|
|
|
reference:
|
|
https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI
|
|
|
|
pitfall:
|
|
http://man7.org/linux/man-pages/man7/signal.7.html
|
|
http://man7.org/linux/man-pages/man2/sigaltstack.2.html
|
|
|
|
> $ man 7 signal
|
|
> ...
|
|
> By default, the signal handler is invoked on the normal process
|
|
> stack. It is possible to arrange that the signal handler
|
|
> uses an alternate stack; see sigaltstack(2) for a discussion of
|
|
> how to do this and when it might be useful.
|
|
> ...
|
|
|
|
This is a BUG example:
|
|
https://github.com/Tencent/libco/blob/v1.0/coctx_swap.S#L27
|
|
|
|
proof of correctness:
|
|
https://github.com/hnes/libaco
|
|
|
|
mxcsr & fpu:
|
|
fnstcw * m2byte
|
|
Store FPU control word to m2byte without checking for
|
|
pending unmasked floating-point exceptions.
|
|
|
|
fldcw m2byte
|
|
Load FPU control word from m2byte.
|
|
|
|
stmxcsr m32
|
|
Store contents of MXCSR register to m32
|
|
|
|
ldmxcsr m32
|
|
Load MXCSR register from m32.
|
|
*/
|
|
/*
|
|
0x00 --> 0xff
|
|
eip esp ebp edi esi ebx fpucw16 mxcsr32
|
|
0 4 8 c 10 14 18 1c
|
|
*/
|
|
#ifdef __i386__
|
|
mov eax,DWORD PTR [esp+0x4] // from_co
|
|
mov edx,DWORD PTR [esp] // retaddr
|
|
lea ecx,[esp+0x4] // esp
|
|
mov DWORD PTR [eax+0x8],ebp //<ebp
|
|
mov DWORD PTR [eax+0x4],ecx //<esp
|
|
mov DWORD PTR [eax+0x0],edx //<retaddr
|
|
mov DWORD PTR [eax+0xc],edi //<edi
|
|
mov ecx,DWORD PTR [esp+0x8] // to_co
|
|
mov DWORD PTR [eax+0x10],esi //<esi
|
|
mov DWORD PTR [eax+0x14],ebx //<ebx
|
|
#ifndef ACO_CONFIG_SHARE_FPU_MXCSR_ENV
|
|
fnstcw WORD PTR [eax+0x18] //<fpucw
|
|
stmxcsr DWORD PTR [eax+0x1c] //<mxcsr
|
|
#endif
|
|
mov edx,DWORD PTR [ecx+0x4] //>esp
|
|
mov ebp,DWORD PTR [ecx+0x8] //>ebp
|
|
mov eax,DWORD PTR [ecx+0x0] //>retaddr
|
|
mov edi,DWORD PTR [ecx+0xc] //>edi
|
|
mov esi,DWORD PTR [ecx+0x10] //>esi
|
|
mov ebx,DWORD PTR [ecx+0x14] //>ebx
|
|
#ifndef ACO_CONFIG_SHARE_FPU_MXCSR_ENV
|
|
fldcw WORD PTR [ecx+0x18] //>fpucw
|
|
ldmxcsr DWORD PTR [ecx+0x1c] //>mxcsr
|
|
#endif
|
|
xor ecx,ecx
|
|
mov esp,edx
|
|
xor edx,edx
|
|
jmp eax
|
|
#elif __x86_64__
|
|
/*
|
|
0x00 --> 0xff
|
|
r12 r13 r14 r15 rip rsp rbx rbp fpucw16 mxcsr32
|
|
0 8 10 18 20 28 30 38 40 44
|
|
*/
|
|
// rdi - from_co | rsi - to_co
|
|
mov rdx,QWORD PTR [rsp] // retaddr
|
|
lea rcx,[rsp+0x8] // rsp
|
|
mov QWORD PTR [rdi+0x0], r12
|
|
mov QWORD PTR [rdi+0x8], r13
|
|
mov QWORD PTR [rdi+0x10],r14
|
|
mov QWORD PTR [rdi+0x18],r15
|
|
mov QWORD PTR [rdi+0x20],rdx // retaddr
|
|
mov QWORD PTR [rdi+0x28],rcx // rsp
|
|
mov QWORD PTR [rdi+0x30],rbx
|
|
mov QWORD PTR [rdi+0x38],rbp
|
|
#ifndef ACO_CONFIG_SHARE_FPU_MXCSR_ENV
|
|
fnstcw WORD PTR [rdi+0x40]
|
|
stmxcsr DWORD PTR [rdi+0x44]
|
|
#endif
|
|
mov r12,QWORD PTR [rsi+0x0]
|
|
mov r13,QWORD PTR [rsi+0x8]
|
|
mov r14,QWORD PTR [rsi+0x10]
|
|
mov r15,QWORD PTR [rsi+0x18]
|
|
mov rax,QWORD PTR [rsi+0x20] // retaddr
|
|
mov rcx,QWORD PTR [rsi+0x28] // rsp
|
|
mov rbx,QWORD PTR [rsi+0x30]
|
|
mov rbp,QWORD PTR [rsi+0x38]
|
|
#ifndef ACO_CONFIG_SHARE_FPU_MXCSR_ENV
|
|
fldcw WORD PTR [rsi+0x40]
|
|
ldmxcsr DWORD PTR [rsi+0x44]
|
|
#endif
|
|
mov rsp,rcx
|
|
jmp rax
|
|
#else
|
|
#error "platform not support"
|
|
#endif
|
|
|
|
.globl aco_save_fpucw_mxcsr
|
|
#if defined(__APPLE__)
|
|
#else
|
|
.type aco_save_fpucw_mxcsr, @function
|
|
#endif
|
|
.intel_syntax noprefix
|
|
aco_save_fpucw_mxcsr:
|
|
#ifdef __i386__
|
|
mov eax,DWORD PTR [esp+0x4] // ptr
|
|
fnstcw WORD PTR [eax]
|
|
stmxcsr DWORD PTR [eax+0x4]
|
|
ret
|
|
#elif __x86_64__
|
|
fnstcw WORD PTR [rdi]
|
|
stmxcsr DWORD PTR [rdi+0x4]
|
|
ret
|
|
#else
|
|
#error "platform not support"
|
|
#endif
|
|
|
|
#if defined(__APPLE__)
|
|
.globl _abort
|
|
.globl _aco_funcp_protector
|
|
#else
|
|
.globl abort
|
|
.globl aco_funcp_protector
|
|
#endif
|
|
|
|
.globl aco_funcp_protector_asm
|
|
#if defined(__APPLE__)
|
|
#else
|
|
.type aco_funcp_protector_asm, @function
|
|
#endif
|
|
.intel_syntax noprefix
|
|
aco_funcp_protector_asm:
|
|
#ifdef __i386__
|
|
and esp,0xfffffff0
|
|
#if defined(__APPLE__)
|
|
call _aco_funcp_protector
|
|
call _abort
|
|
#else
|
|
#if defined(__pic__) || defined(__PIC__)
|
|
call aco_funcp_protector@PLT
|
|
call abort@PLT
|
|
#else
|
|
call aco_funcp_protector
|
|
call abort
|
|
#endif
|
|
#endif
|
|
ret
|
|
#elif __x86_64__
|
|
and rsp,0xfffffffffffffff0
|
|
#if defined(__APPLE__)
|
|
call _aco_funcp_protector
|
|
call _abort
|
|
#else
|
|
#if defined(__pic__) || defined(__PIC__)
|
|
call aco_funcp_protector@PLT
|
|
call abort@PLT
|
|
#else
|
|
call aco_funcp_protector
|
|
call abort
|
|
#endif
|
|
#endif
|
|
ret
|
|
#else
|
|
#error "platform not support"
|
|
#endif
|
|
|