@@ -1,8 +1,5 @@
11use crate::{Device, Uxn};
223-#[cfg(target_arch = "aarch64")]
4-mod aarch64;
5-63#[cfg(not(target_arch = "aarch64"))]
74compile_error!("no native implementation for this platform");
85@@ -92,35 +89,32 @@ extern "C" fn dei_2kr_entry(vm: &mut Uxn, dev: &mut DeviceHandle) -> bool {
92899390////////////////////////////////////////////////////////////////////////////////
949195-#[repr(C)]
96-pub(crate) struct EntryHandle {
97-stack_data: *mut u8,
98-stack_index: *mut u8,
99-ret_data: *mut u8,
100-ret_index: *mut u8,
101-ram: *mut u8,
102-vm: *mut core::ffi::c_void, // *Uxn
103-dev: *mut core::ffi::c_void, // *DeviceHandle
104-}
105-10692struct DeviceHandle<'a>(&'a mut dyn Device);
1079310894pub fn entry(vm: &mut Uxn, dev: &mut dyn Device, pc: u16) -> u16 {
10995let mut h = DeviceHandle(dev);
110-let mut e = EntryHandle {
111-stack_data: vm.stack.data.as_mut_ptr(),
112-stack_index: &mut vm.stack.index as *mut _,
113-ret_data: vm.ret.data.as_mut_ptr(),
114-ret_index: &mut vm.ret.index as *mut _,
115-ram: (*vm.ram).as_mut_ptr(),
116-vm: vm as *mut _ as *mut _,
117-dev: &mut h as *mut _ as *mut _,
118-};
96+let r: usize;
1199712098// SAFETY: do you trust me?
121-unsafe { aarch64::aarch64_entry(&mut e as *mut _, pc, JUMP_TABLE.as_ptr()) }
99+unsafe {
100+ core::arch::asm!(
101+"bl aarch64_entry",
102+ inout("x0") vm.stack.data.as_mut_ptr() as usize => r,
103+ in("x1") &mut vm.stack.index as *mut _,
104+ in("x2") vm.ret.data.as_mut_ptr(),
105+ in("x3") &mut vm.ret.index as *mut _,
106+ in("x4") (*vm.ram).as_mut_ptr(),
107+ in("x5") pc,
108+ in("x6") vm as *mut _,
109+ in("x7") &mut h as *mut _,
110+ in("x8") JUMP_TABLE.as_ptr(),
111+);
112+}
113+ r as u16
122114}
123115116+core::arch::global_asm!(include_str!("aarch64.s"));
117+124118// Helper macro to generate opcode tables
125119macro_rules! opcodes {
126120($($op:ident),+ $(,)?) => {