From fe8340060048f6215f3beabf692201d1fc3e3162 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Wed, 2 Nov 2016 21:45:50 -0600 Subject: [PATCH] Fix syscall ABI --- arch/x86_64/src/interrupt/syscall.rs | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/arch/x86_64/src/interrupt/syscall.rs b/arch/x86_64/src/interrupt/syscall.rs index 04cf5d2..d1527da 100644 --- a/arch/x86_64/src/interrupt/syscall.rs +++ b/arch/x86_64/src/interrupt/syscall.rs @@ -23,17 +23,32 @@ pub unsafe extern fn syscall() { asm!("" : : "{rax}"(a) : : "intel", "volatile"); } - asm!("push r15 + // Push scratch registers, minus rax for the return value + asm!("push rcx + push rdx + push rdi + push rsi + push r8 + push r9 + push r10 + push r11 push fs - mov r15, 0x18 - mov fs, r15" + mov r11, 0x18 + mov fs, r11" : : : : "intel", "volatile"); inner(); // Interrupt return asm!("pop fs - pop r15 + pop r11 + pop r10 + pop r9 + pop r8 + pop rsi + pop rdi + pop rdx + pop rcx iretq" : : : : "intel", "volatile"); }