]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/bootstrap/assembler/arm.64.factor
arm64: 9999 BRK works again
[factor.git] / basis / bootstrap / assembler / arm.64.factor
index 944c83ef15af50be31c760fda6d900eeff6659e4..6079c7a0c9dba7498874f6f9fee9cd605f88b26a 100644 (file)
@@ -25,7 +25,8 @@ big-endian off
 ! x29/fp       Non-volatile    Frame pointer
 ! x30/lr       Non-volatile    Link registers
 
-: stack-frame-size ( -- n ) 4 bootstrap-cells ;
+! varargs https://developer.arm.com/documentation/ihi0055/d/?lang=en
+: stack-frame-size ( -- n ) 8 bootstrap-cells ;
 : volatile-regs ( -- seq ) { X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 } ;
 ! windows arm - X18 is non-volatile https://docs.microsoft.com/en-us/cpp/build/arm64-windows-abi-conventions?view=msvc-160
 : nv-regs ( -- seq ) { X18 X19 X20 X21 X22 X23 X24 X25 X26 X27 X28 X29 X30 } ;
@@ -98,7 +99,7 @@ big-endian off
 : stack-reg ( -- reg ) SP ;
 ! https://developer.arm.com/documentation/dui0801/a/Overview-of-AArch64-state/Link-registers
 : link-reg ( -- reg ) X30 ; ! LR
-: stack-frame-reg ( -- reg ) X29 ; ! FP
+: stack-frame-reg ( -- reg ) X29 ; ! FP
 : vm-reg ( -- reg ) X28 ;
 : ds-reg ( -- reg ) X27 ;
 : rs-reg ( -- reg ) X26 ;
@@ -299,6 +300,9 @@ big-endian off
 ! # All arm.64 subprimitives
 {
     { c-to-factor [
+            ! Set up the datastack and retainstack registers
+            ! and jump into the quotation
+
 
             ! write()
             ! 68 X8 MOVwi64
@@ -443,6 +447,8 @@ big-endian off
 
 ! C to Factor entry point
 [
+
+    9999 BRK
     ! ! Optimizing compiler's side of callback accesses
     ! ! arguments that are on the stack via the frame pointer.
     ! ! On x86-32 fastcall, and x86-64, some arguments are passed
@@ -597,13 +603,25 @@ big-endian off
     ! temp0 word-entry-point-offset [+] JMP
 ] JIT-EXECUTE jit-define
 
+
+! https://elixir.bootlin.com/linux/latest/source/arch/arm64/kernel/stacktrace.c#L22
 [
-    ! stack-reg stack-framrcee-size bootstrap-cell - SUB
-    stack-frame-size bootstrap-cell - stack-reg stack-reg SUBi64
+    ! x64 ! stack-reg stack-frame-size bootstrap-cell - SUB
+
+
+    ! : link-reg ( -- reg ) X30 ; ! LR
+    ! : stack-frame-reg ( -- reg ) X29 ; ! FP
+
+    ! ! make room for LR plus magic number of callback, 16byte align
+    stack-frame-size bootstrap-cell 2 * + stack-reg stack-reg SUBi64
+    ! link-reg X29 stack-reg STP
+    -16 SP link-reg X29 STP-pre
 ] JIT-PROLOG jit-define
 
 [
-    ! stack-reg stack-frame-size bootstrap-cell - ADD
+    ! x64 ! stack-reg stack-frame-size bootstrap-cell - ADD
+    -16 SP link-reg X29 LDP-pre
+    stack-frame-size bootstrap-cell 2 * + stack-reg stack-reg ADDi64
 ] JIT-EPILOG jit-define
 
 [