forked from M-Labs/libfringe
sneak an extra argument in by using rbx for the jump target
This commit is contained in:
parent
3d35f5280d
commit
e0f2d48196
|
@ -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")
|
||||||
},
|
},
|
||||||
|
|
11
src/arch.s
11
src/arch.s
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue