From 1bfc4e2e6c931ca59d31e4621608e05035945f0b Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 19 Dec 2011 16:16:00 -0800 Subject: [PATCH] rt: Save and restore %rax/%eax in __morestack This doesn't matter now since we use an out pointer for return values but it's sure to show up mysteriously someday. --- src/rt/arch/i386/morestack.S | 6 ++++++ src/rt/arch/x86_64/morestack.S | 6 +++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/rt/arch/i386/morestack.S b/src/rt/arch/i386/morestack.S index c34d1a0fe88a..c4090df109d8 100644 --- a/src/rt/arch/i386/morestack.S +++ b/src/rt/arch/i386/morestack.S @@ -198,11 +198,17 @@ MORESTACK: // Realign stack - remember that __morestack was called misaligned subl $12, %esp + // Save the return value of the function we allocated space for + movl %eax, (%esp) + // Now that we're on the return path we want to avoid // stomping on %eax. FIXME: Need to save and restore %eax to // actually preserve it across the call to delete the stack call UPCALL_DEL_STACK + // And restore it + movl (%esp), %eax + addl $12,%esp popl %ebp diff --git a/src/rt/arch/x86_64/morestack.S b/src/rt/arch/x86_64/morestack.S index 93ce0e4c698b..f4d897f1cf4a 100644 --- a/src/rt/arch/x86_64/morestack.S +++ b/src/rt/arch/x86_64/morestack.S @@ -100,8 +100,8 @@ MORESTACK: // Switch back to the rust stack movq %rbp, %rsp - // Align the stack again - pushq $0 + // Save the return value + pushq %rax // FIXME: Should preserve %rax here #ifdef __APPLE__ @@ -111,7 +111,7 @@ MORESTACK: call UPCALL_DEL_STACK@PLT #endif - addq $8, %rsp + popq %rax // Restore the return value popq %rbp // FIXME: I don't think these rules are necessary // since the unwinder should never encounter an instruction