mirror of
https://github.com/fluencelabs/wasmer
synced 2025-06-27 15:41:33 +00:00
Fix entry with more than 5/6 arguments.
This commit is contained in:
@ -300,16 +300,78 @@ impl RunnableModule for X64ExecutionContext {
|
|||||||
}
|
}
|
||||||
#[cfg(target_arch = "aarch64")]
|
#[cfg(target_arch = "aarch64")]
|
||||||
{
|
{
|
||||||
let callable: extern "C" fn(u64, u64, u64, u64, u64, u64) -> u64 =
|
// Fix this
|
||||||
std::mem::transmute(func);
|
let callable: extern "C" fn(
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
u64,
|
||||||
|
) -> u64 = std::mem::transmute(func);
|
||||||
|
let mut args = args.iter();
|
||||||
callable(
|
callable(
|
||||||
ctx as u64,
|
ctx as u64,
|
||||||
args.get(0).cloned().unwrap_or(0),
|
args.next().cloned().unwrap_or(0),
|
||||||
args.get(1).cloned().unwrap_or(0),
|
args.next().cloned().unwrap_or(0),
|
||||||
args.get(2).cloned().unwrap_or(0),
|
args.next().cloned().unwrap_or(0),
|
||||||
args.get(3).cloned().unwrap_or(0),
|
args.next().cloned().unwrap_or(0),
|
||||||
args.get(4).cloned().unwrap_or(0),
|
args.next().cloned().unwrap_or(0),
|
||||||
);
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
args.next().cloned().unwrap_or(0),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Some(execution_context.breakpoints.clone()),
|
Some(execution_context.breakpoints.clone()),
|
||||||
|
@ -1744,7 +1744,28 @@ impl Emitter for Assembler {
|
|||||||
fn arch_emit_entry_trampoline(&mut self) {
|
fn arch_emit_entry_trampoline(&mut self) {
|
||||||
dynasm!(
|
dynasm!(
|
||||||
self
|
self
|
||||||
; sub sp, sp, 96
|
; mov x18, x28
|
||||||
|
; mov x28, sp // WASM stack pointer
|
||||||
|
; ldr x9, >v_65536
|
||||||
|
; sub sp, sp, x9 // Pre-allocate the WASM stack
|
||||||
|
; sub x28, x28, 16 // for the last two arguments
|
||||||
|
|
||||||
|
// Fixup param locations.
|
||||||
|
; str x0, [sp, 0]
|
||||||
|
; str x1, [sp, 8]
|
||||||
|
; str x2, [sp, 16]
|
||||||
|
; str x3, [sp, 24]
|
||||||
|
; str x4, [sp, 32]
|
||||||
|
; str x5, [sp, 40]
|
||||||
|
; str x6, [x28, 0]
|
||||||
|
; str x7, [x28, 8]
|
||||||
|
; ldr X(map_gpr(GPR::RDI).x()), [sp, 0]
|
||||||
|
; ldr X(map_gpr(GPR::RSI).x()), [sp, 8]
|
||||||
|
; ldr X(map_gpr(GPR::RDX).x()), [sp, 16]
|
||||||
|
; ldr X(map_gpr(GPR::RCX).x()), [sp, 24]
|
||||||
|
; ldr X(map_gpr(GPR::R8).x()), [sp, 32]
|
||||||
|
; ldr X(map_gpr(GPR::R9).x()), [sp, 40]
|
||||||
|
|
||||||
; str x19, [sp, 0]
|
; str x19, [sp, 0]
|
||||||
; str x20, [sp, 8]
|
; str x20, [sp, 8]
|
||||||
; str x21, [sp, 16]
|
; str x21, [sp, 16]
|
||||||
@ -1754,26 +1775,9 @@ impl Emitter for Assembler {
|
|||||||
; str x25, [sp, 48]
|
; str x25, [sp, 48]
|
||||||
; str x26, [sp, 56]
|
; str x26, [sp, 56]
|
||||||
; str x27, [sp, 64]
|
; str x27, [sp, 64]
|
||||||
; str x28, [sp, 72]
|
; str x18, [sp, 72] // previously x28
|
||||||
; str x29, [sp, 80]
|
; str x29, [sp, 80]
|
||||||
; str x30, [sp, 88]
|
; str x30, [sp, 88]
|
||||||
; mov x28, sp // WASM stack pointer
|
|
||||||
; ldr x9, >v_65536
|
|
||||||
; sub sp, sp, x9 // Pre-allocate the WASM stack
|
|
||||||
|
|
||||||
// Fixup param locations.
|
|
||||||
; str x0, [sp, 0]
|
|
||||||
; str x1, [sp, 8]
|
|
||||||
; str x2, [sp, 16]
|
|
||||||
; str x3, [sp, 24]
|
|
||||||
; str x4, [sp, 32]
|
|
||||||
; str x5, [sp, 40]
|
|
||||||
; ldr X(map_gpr(GPR::RDI).x()), [sp, 0]
|
|
||||||
; ldr X(map_gpr(GPR::RSI).x()), [sp, 8]
|
|
||||||
; ldr X(map_gpr(GPR::RDX).x()), [sp, 16]
|
|
||||||
; ldr X(map_gpr(GPR::RCX).x()), [sp, 24]
|
|
||||||
; ldr X(map_gpr(GPR::R8).x()), [sp, 32]
|
|
||||||
; ldr X(map_gpr(GPR::R9).x()), [sp, 40]
|
|
||||||
|
|
||||||
// return address
|
// return address
|
||||||
; adr x20, >done
|
; adr x20, >done
|
||||||
@ -1784,8 +1788,6 @@ impl Emitter for Assembler {
|
|||||||
; b >real_entry
|
; b >real_entry
|
||||||
|
|
||||||
; done:
|
; done:
|
||||||
; ldr x9, >v_65536
|
|
||||||
; add sp, sp, x9 // Resume stack pointer
|
|
||||||
; ldr x19, [sp, 0]
|
; ldr x19, [sp, 0]
|
||||||
; ldr x20, [sp, 8]
|
; ldr x20, [sp, 8]
|
||||||
; ldr x21, [sp, 16]
|
; ldr x21, [sp, 16]
|
||||||
@ -1798,7 +1800,8 @@ impl Emitter for Assembler {
|
|||||||
; ldr x28, [sp, 72]
|
; ldr x28, [sp, 72]
|
||||||
; ldr x29, [sp, 80]
|
; ldr x29, [sp, 80]
|
||||||
; ldr x30, [sp, 88]
|
; ldr x30, [sp, 88]
|
||||||
; add sp, sp, 96
|
; ldr x9, >v_65536
|
||||||
|
; add sp, sp, x9 // Resume stack pointer
|
||||||
; br x30 // LR
|
; br x30 // LR
|
||||||
|
|
||||||
; v_65536:
|
; v_65536:
|
||||||
|
Reference in New Issue
Block a user