diff --git a/src/arch.rs b/src/arch.rs index 20cb45c..b920d63 100644 --- a/src/arch.rs +++ b/src/arch.rs @@ -14,37 +14,39 @@ pub struct Registers { rsp: *mut uintptr_t } -#[inline(always)] -pub unsafe fn swap(regs: &mut Registers) { - asm!(include_str!("swap.s") - : - : "{rdi}" (&mut regs.rsp) - : "rax", "rbx", "rcx", "rdx", "rsi", "rdi", //"rbp", "rsp", - "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", - "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", - "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", - "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23", - "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31" - "cc" - : "volatile"); -} +impl Registers { + #[inline] + pub unsafe fn new(stack: &mut S, f: F) -> Registers where S: Stack, F: FnOnce() { + let sp_limit = stack.limit(); + let mut sp = stack.top() as *mut uintptr_t; + let f_ptr = push(&mut sp, f); -#[inline] -pub unsafe fn initialize_call_frame(stack: &mut S, f: F) -> Registers where S: Stack, F: FnOnce() { - let sp_limit = stack.limit(); - let mut sp = stack.top() as *mut uintptr_t; - let f_ptr = push(&mut sp, f); + asm!(include_str!("init.s") + : "={rdi}"(sp) + : "{rdi}" (sp), + "{rsi}" (rust_trampoline::), + "{rdx}" (f_ptr), + "{rcx}" (sp_limit) + : + : "volatile"); - asm!(include_str!("init.s") - : "={rdi}"(sp) - : "{rdi}" (sp), - "{rsi}" (rust_trampoline::), - "{rdx}" (f_ptr), - "{rcx}" (sp_limit) - : - : "volatile"); + Registers { rsp: sp } + } - Registers { rsp: sp } + #[inline(always)] + pub unsafe fn swap(&mut self) { + asm!(include_str!("swap.s") + : + : "{rdi}" (&mut self.rsp) + : "rax", "rbx", "rcx", "rdx", "rsi", "rdi", //"rbp", "rsp", + "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7", + "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15", + "xmm16", "xmm17", "xmm18", "xmm19", "xmm20", "xmm21", "xmm22", "xmm23", + "xmm24", "xmm25", "xmm26", "xmm27", "xmm28", "xmm29", "xmm30", "xmm31" + "cc" + : "volatile"); + } } unsafe extern "C" fn rust_trampoline(f: *const F) { diff --git a/src/context.rs b/src/context.rs index 00f6c5e..6554a9d 100644 --- a/src/context.rs +++ b/src/context.rs @@ -1,6 +1,6 @@ use core::prelude::*; use platform::Stack; -use arch::{self, Registers}; +use arch::Registers; use platform; pub struct Context { @@ -12,7 +12,7 @@ impl Context { #[inline] pub unsafe fn new(f: F) -> Context where F: FnOnce() + Send + 'static { let mut stack = Stack::new(4 << 20); - let regs = arch::initialize_call_frame(&mut stack, f); + let regs = Registers::new(&mut stack, f); Context { regs: regs, _stack: stack @@ -21,6 +21,6 @@ impl Context { #[inline(always)] pub unsafe fn swap(&mut self) { - arch::swap(&mut self.regs) + self.regs.swap() } }