rt: Give upcall_new_stack the same convention as other upcalls

This commit is contained in:
Brian Anderson 2011-12-19 15:58:03 -08:00
parent bedcaad97e
commit 50dc80f617
3 changed files with 34 additions and 59 deletions

View file

@ -68,30 +68,27 @@
#if defined(__APPLE__)
#define RUST_GET_TASK L_rust_get_task$stub
#define UPCALL_NEW_STACK L_upcall_new_stack$stub
#define UPCALL_DEL_STACK L_upcall_del_stack$stub
#define UPCALL_CALL_C L_upcall_call_shim_on_c_stack$stub
#define MORESTACK ___morestack
#else
#if defined(__linux__)
#define UPCALL_NEW_STACK upcall_new_stack
#define UPCALL_DEL_STACK upcall_del_stack
#define RUST_GET_TASK rust_get_task
#define UPCALL_CALL_C upcall_call_shim_on_c_stack
#define MORESTACK __morestack
#else
#define UPCALL_NEW_STACK _upcall_new_stack
#define UPCALL_DEL_STACK _upcall_del_stack
#define RUST_GET_TASK _rust_get_task
#define UPCALL_CALL_C _upcall_call_shim_on_c_stack
#define MORESTACK ___morestack
#endif
#endif
.globl UPCALL_NEW_STACK
#ifndef __APPLE__
.globl UPCALL_NEW_STACK
.globl UPCALL_DEL_STACK
.globl RUST_GET_TASK
.globl UPCALL_CALL_C_STACK
#endif
.globl MORESTACK
@ -170,29 +167,19 @@ MORESTACK:
// The size of the stack arguments to copy to the new stack,
// ane of the the arguments to __morestack
movl 56(%esp),%eax
movl %eax,20(%esp)
movl %eax,8(%esp)
// The address of the stack arguments to the original function
leal 64(%esp),%eax
movl %eax,16(%esp)
movl %eax,4(%esp)
// The amount of stack needed for the original function,
// the other argument to __morestack
movl 52(%esp),%eax // The amount of stack needed
movl %eax,12(%esp)
// Out pointer to the new stack
movl $0, 8(%esp)
#ifdef __APPLE__
call 1f
1: popl %eax
movl L_upcall_new_stack$non_lazy_ptr-1b(%eax),%eax
movl %eax, 4(%esp)
#else
movl $UPCALL_NEW_STACK,4(%esp)
#endif
leal 8(%esp), %eax
movl %eax,(%esp)
call UPCALL_CALL_C
call UPCALL_NEW_STACK
// Save the address of the new stack
movl %eax, (%esp)
// Grab the __morestack return pointer
movl 48(%esp),%eax
@ -204,7 +191,7 @@ MORESTACK:
movl 24(%esp), %edx
// Switch stacks
movl 8(%esp),%esp
movl (%esp),%esp
// Re-enter the function that called us
call *%eax
@ -253,11 +240,6 @@ MORESTACK:
#ifdef __APPLE__
.section __IMPORT,__pointers,non_lazy_symbol_pointers
L_upcall_new_stack$non_lazy_ptr:
.indirect_symbol _upcall_new_stack
.long 0
.section __IMPORT,__jump_table,symbol_stubs,pure_instructions+self_modifying_code,5
// Linker will replace the hlts (the ascii) with jmp
@ -265,14 +247,14 @@ L_rust_get_task$stub:
.indirect_symbol _rust_get_task
.ascii "\364\364\364\364\364"
L_upcall_new_stack$stub:
.indirect_symbol _upcall_new_stack
.ascii "\364\364\364\364\364"
L_upcall_del_stack$stub:
.indirect_symbol _upcall_del_stack
.ascii "\364\364\364\364\364"
L_upcall_call_shim_on_c_stack$stub:
.indirect_symbol _upcall_call_shim_on_c_stack
.ascii "\364\364\364\364\364"
.subsections_via_symbols
#endif

View file

@ -9,18 +9,15 @@
#if defined(__APPLE__) || defined(_WIN32)
#define UPCALL_NEW_STACK _upcall_new_stack
#define UPCALL_DEL_STACK _upcall_del_stack
#define UPCALL_CALL_C _upcall_call_shim_on_c_stack
#define MORESTACK ___morestack
#else
#define UPCALL_NEW_STACK upcall_new_stack
#define UPCALL_DEL_STACK upcall_del_stack
#define UPCALL_CALL_C upcall_call_shim_on_c_stack
#define MORESTACK __morestack
#endif
.globl UPCALL_NEW_STACK
.globl UPCALL_DEL_STACK
.globl UPCALL_CALL_C
.globl MORESTACK
#if defined(__linux__)
@ -70,29 +67,22 @@ MORESTACK:
// Calculate the address of the stack arguments.
// We have the base pointer, __morestack's return address,
// and __morestack's caller's return address to skip
movq %rbp, %rcx
addq $24, %rcx // Base pointer, return address x2
movq %rbp, %rax
addq $24, %rax // Base pointer, return address x2
// The arguments to __morestack are passed in %r10 & %r11
pushq %r11 // Size of stack arguments
pushq %rcx // Address of stack arguments
pushq %r10 // The amount of stack needed
pushq $0 // Out pointer
movq %r11, %rdx // Size of stack arguments
movq %rax, %rsi // Address of stack arguments
movq %r10, %rdi // The amount of stack needed
movq UPCALL_NEW_STACK@GOTPCREL(%rip), %rsi
movq %rsp, %rdi
#ifdef __APPLE__
call UPCALL_CALL_C
call UPCALL_NEW_STACK
#endif
#ifdef __linux__
call UPCALL_CALL_C@PLT
call UPCALL_NEW_STACK@PLT
#endif
// Pop the new_stack_args struct
popq %rax
addq $24, %rsp
// Pop the saved arguments
popq %r9
popq %r8

View file

@ -595,23 +595,26 @@ upcall_log_type(const type_desc *tydesc, uint8_t *data, uint32_t level) {
UPCALL_SWITCH_STACK(&args, upcall_s_log_type);
}
struct rust_new_stack2_args {
void *new_stack;
struct s_new_stack_args {
void *result;
size_t stk_sz;
void *args_addr;
size_t args_sz;
};
// A new stack function suitable for calling through
// upcall_call_shim_on_c_stack
// FIXME: Convert this to the same arrangement as
// the other upcalls, simplify __morestack
extern "C" CDECL void
upcall_new_stack(struct rust_new_stack2_args *args) {
upcall_s_new_stack(struct s_new_stack_args *args) {
rust_task *task = rust_scheduler::get_task();
args->new_stack = task->new_stack(args->stk_sz,
args->args_addr,
args->args_sz);
args->result = task->new_stack(args->stk_sz,
args->args_addr,
args->args_sz);
}
extern "C" CDECL void *
upcall_new_stack(size_t stk_sz, void *args_addr, size_t args_sz) {
s_new_stack_args args = {NULL, stk_sz, args_addr, args_sz};
UPCALL_SWITCH_STACK(&args, upcall_s_new_stack);
return args.result;
}
extern "C" CDECL void