1
0
Fork 0

sneak an extra argument in by using rbx for the jump target

This commit is contained in:
edef 2014-12-24 06:48:49 +01:00
parent 3d35f5280d
commit e0f2d48196
2 changed files with 8 additions and 7 deletions

View File

@ -62,11 +62,11 @@ pub fn initialise_call_frame(stack: &mut Stack, init: uintptr_t, args: &[uintptr
rbp: 0, rbp: 0,
rsp: sp as uintptr_t, rsp: sp as uintptr_t,
ip: bootstrap as uintptr_t, ip: bootstrap as uintptr_t,
r12: init, rbx: init,
.. Registers::new() .. Registers::new()
}; };
match into_fields!(regs { rdi, r13, r14, r15 } <- args.iter().cloned()) { match into_fields!(regs { rdi, r12, r13, r14, r15 } <- args.iter().cloned()) {
Some(mut args) => if args.next().is_some() { Some(mut args) => if args.next().is_some() {
panic!("too many arguments") panic!("too many arguments")
}, },

View File

@ -84,11 +84,12 @@ lwt_bootstrap:
;; places the parameters in unrelated registers, and we frob them into place ;; places the parameters in unrelated registers, and we frob them into place
;; out here, in assembly-land. below are the parameter registers in order, ;; out here, in assembly-land. below are the parameter registers in order,
;; along with the alternative register used in parentheses, if there is one. ;; along with the alternative register used in parentheses, if there is one.
;; rdi, rsi (r13), rdx (r14), rcx (r15), r8, r9 ;; rdi, rsi (r12), rdx (r13), rcx (r14), r8(r15), r9
mov rsi, r13 mov rsi, r12
mov rdx, r14 mov rdx, r13
mov rcx, r15 mov rcx, r14
jmp r12 mov r8, r15
jmp rbx
;; Rust stores a stack limit at [fs:0x70]. These two functions set and retrieve ;; Rust stores a stack limit at [fs:0x70]. These two functions set and retrieve