the new stack. */
#if defined(VGP_x86_linux)
asm("\n"
+ ".text\n"
"\t.globl _start\n"
"\t.type _start,@function\n"
"_start:\n"
);
#elif defined(VGP_amd64_linux)
asm("\n"
+ ".text\n"
"\t.globl _start\n"
"\t.type _start,@function\n"
"_start:\n"
);
#elif defined(VGP_ppc32_linux)
asm("\n"
+ ".text\n"
"\t.globl _start\n"
"\t.type _start,@function\n"
"_start:\n"
#if defined(VGP_x86_linux)
# define _MYSIG(name) \
+ ".text\n" \
"my_sigreturn:\n" \
" movl $" #name ", %eax\n" \
" int $0x80\n"
#elif defined(VGP_amd64_linux)
# define _MYSIG(name) \
+ ".text\n" \
"my_sigreturn:\n" \
" movq $" #name ", %rax\n" \
" syscall\n"
#elif defined(VGP_ppc32_linux)
# define _MYSIG(name) \
+ ".text\n" \
"my_sigreturn:\n" \
" li 0, " #name "\n" \
" sc\n"
UWord a4, UWord a5, UWord a6
);
asm(
+".text\n"
"do_syscall_WRK:\n"
" push %esi\n"
" push %edi\n"
UWord a4, UWord a5, UWord a6
);
asm(
+".text\n"
"do_syscall_WRK:\n"
/* Convert function calling convention --> syscall calling
convention */
UWord a4, UWord a5, UWord a6
);
asm(
+".text\n"
"do_syscall_WRK:\n"
" mr 0,3\n"
" mr 3,4\n"
// %rdx == f
// %rcx == arg1
asm(
+".text\n"
".globl vgModuleLocal_call_on_new_stack_0_1\n"
"vgModuleLocal_call_on_new_stack_0_1:\n"
" movq %rdi, %rsp\n" // set stack
Long* parent_tid,
vki_modify_ldt_t * );
asm(
-"\n"
+".text\n"
"do_syscall_clone_amd64_linux:\n"
// set up child stack, temporarily preserving fn and arg
" subq $16, %rsi\n" // make space on stack
// r5 = f
// r6 = arg1
asm(
+".text\n"
".globl vgModuleLocal_call_on_new_stack_0_1\n"
"vgModuleLocal_call_on_new_stack_0_1:\n"
" mr %r1,%r3\n\t" // stack to %sp
Int* parent_tid,
vki_modify_ldt_t * );
asm(
-"\n"
+".text\n"
"do_syscall_clone_ppc32_linux:\n"
" stwu 1,-32(1)\n"
" stw 29,20(1)\n"
// 12(%esp) == f
// 16(%esp) == arg1
asm(
+".text\n"
".globl vgModuleLocal_call_on_new_stack_0_1\n"
"vgModuleLocal_call_on_new_stack_0_1:\n"
" movl %esp, %esi\n" // remember old stack pointer
Int* parent_tid,
vki_modify_ldt_t * );
asm(
-"\n"
+".text\n"
"do_syscall_clone_x86_linux:\n"
" push %ebx\n"
" push %edi\n"