2424 */
2525package com .oracle .svm .core .graal .aarch64 ;
2626
27- import com .oracle .svm .core .c .struct .OffsetOf ;
28- import com .oracle .svm .core .deopt .DeoptimizationSlotPacking ;
29- import com .oracle .svm .core .graal .code .InterpreterAccessStubData ;
30- import com .oracle .svm .core .meta .SharedMethod ;
31- import com .oracle .svm .core .util .VMError ;
32- import jdk .graal .compiler .api .replacements .Fold ;
33- import jdk .graal .compiler .asm .Label ;
34- import jdk .graal .compiler .asm .aarch64 .AArch64Address ;
35- import jdk .graal .compiler .asm .aarch64 .AArch64MacroAssembler ;
36- import jdk .graal .compiler .core .common .NumUtil ;
37- import jdk .graal .compiler .lir .asm .CompilationResultBuilder ;
38- import jdk .graal .compiler .word .Word ;
39- import jdk .vm .ci .aarch64 .AArch64 ;
40- import jdk .vm .ci .code .Register ;
41- import jdk .vm .ci .code .RegisterValue ;
42- import jdk .vm .ci .code .StackSlot ;
43- import jdk .vm .ci .meta .AllocatableValue ;
44- import org .graalvm .nativeimage .c .struct .RawField ;
45- import org .graalvm .nativeimage .c .struct .RawStructure ;
46- import org .graalvm .nativeimage .c .struct .SizeOf ;
47- import org .graalvm .word .Pointer ;
48- import org .graalvm .word .PointerBase ;
49-
27+ import static com .oracle .svm .core .Uninterruptible .CALLED_FROM_UNINTERRUPTIBLE_CODE ;
28+ import static jdk .graal .compiler .asm .aarch64 .AArch64Address .createImmediateAddress ;
5029import static jdk .graal .compiler .asm .aarch64 .AArch64Address .AddressingMode .IMMEDIATE_POST_INDEXED ;
5130import static jdk .graal .compiler .asm .aarch64 .AArch64Address .AddressingMode .IMMEDIATE_SIGNED_UNSCALED ;
5231import static jdk .graal .compiler .asm .aarch64 .AArch64Address .AddressingMode .IMMEDIATE_UNSIGNED_SCALED ;
53- import static jdk .graal .compiler .asm .aarch64 .AArch64Address .createImmediateAddress ;
5432import static jdk .vm .ci .aarch64 .AArch64 .r0 ;
5533import static jdk .vm .ci .aarch64 .AArch64 .r1 ;
5634import static jdk .vm .ci .aarch64 .AArch64 .r2 ;
6947import static jdk .vm .ci .aarch64 .AArch64 .v6 ;
7048import static jdk .vm .ci .aarch64 .AArch64 .v7 ;
7149
50+ import org .graalvm .nativeimage .c .struct .RawField ;
51+ import org .graalvm .nativeimage .c .struct .RawStructure ;
52+ import org .graalvm .nativeimage .c .struct .SizeOf ;
53+ import org .graalvm .word .Pointer ;
54+ import org .graalvm .word .PointerBase ;
55+
56+ import com .oracle .svm .core .Uninterruptible ;
57+ import com .oracle .svm .core .c .struct .OffsetOf ;
58+ import com .oracle .svm .core .deopt .DeoptimizationSlotPacking ;
59+ import com .oracle .svm .core .graal .code .InterpreterAccessStubData ;
60+ import com .oracle .svm .core .graal .code .PreparedArgumentType ;
61+ import com .oracle .svm .core .meta .SharedMethod ;
62+ import com .oracle .svm .core .util .VMError ;
63+
64+ import jdk .graal .compiler .api .replacements .Fold ;
65+ import jdk .graal .compiler .asm .Label ;
66+ import jdk .graal .compiler .asm .aarch64 .AArch64Address ;
67+ import jdk .graal .compiler .asm .aarch64 .AArch64MacroAssembler ;
68+ import jdk .graal .compiler .core .common .NumUtil ;
69+ import jdk .graal .compiler .lir .asm .CompilationResultBuilder ;
70+ import jdk .graal .compiler .word .Word ;
71+ import jdk .vm .ci .aarch64 .AArch64 ;
72+ import jdk .vm .ci .code .Register ;
73+
7274public class AArch64InterpreterStubs {
7375
7476 public static final Register TRAMPOLINE_ARGUMENT = AArch64 .r12 ;
@@ -150,16 +152,12 @@ public void enter(CompilationResultBuilder crb) {
150152 super .enter (crb );
151153 AArch64MacroAssembler masm = (AArch64MacroAssembler ) crb .asm ;
152154
153- /* sp points to four reserved stack slots for this stub */
155+ /* sp points to two reserved stack slots for this stub */
154156
155157 /* Pointer to InterpreterData struct */
156158 masm .str (64 , r1 , createImmediateAddress (64 , IMMEDIATE_UNSIGNED_SCALED , sp , 0 ));
157159 /* Variable stack size */
158160 masm .str (64 , r2 , createImmediateAddress (64 , IMMEDIATE_UNSIGNED_SCALED , sp , 8 ));
159- /* gcReferenceMap next */
160- masm .str (64 , r3 , createImmediateAddress (64 , IMMEDIATE_UNSIGNED_SCALED , sp , 16 ));
161-
162- /* 4th slot is for stack alignment to 0x10 */
163161
164162 masm .sub (64 , sp , sp , r2 /* variable stack size */ );
165163 }
@@ -260,11 +258,8 @@ public static int additionalFrameSizeEnterStub() {
260258
261259 public static int additionalFrameSizeLeaveStub () {
262260 int wordSize = 8 ;
263- /*
264- * reserve four slots for: base address of outgoing stack args, variable stack size,
265- * gcReferenceMap, padding
266- */
267- return 4 * wordSize ;
261+ // reserve two slots for: base address of outgoing stack args and variable stack size.
262+ return 2 * wordSize ;
268263 }
269264
270265 @ RawStructure
@@ -509,7 +504,8 @@ public void setSp(Pointer data, int stackSize, Pointer stackBuffer) {
509504 }
510505
511506 @ Override
512- public long getGpArgumentAt (AllocatableValue ccArg , Pointer data , int pos ) {
507+ @ Uninterruptible (reason = REASON_RAW_POINTER , callerMustBe = true )
508+ public long getGpArgumentAt (PreparedArgumentType cArgType , Pointer data , int pos ) {
513509 InterpreterDataAArch64 p = (InterpreterDataAArch64 ) data ;
514510 return switch (pos ) {
515511 case 0 -> p .getAbiGpArg0 ();
@@ -521,18 +517,19 @@ public long getGpArgumentAt(AllocatableValue ccArg, Pointer data, int pos) {
521517 case 6 -> p .getAbiGpArg6 ();
522518 case 7 -> p .getAbiGpArg7 ();
523519 default -> {
524- StackSlot stackSlot = ( StackSlot ) ccArg ;
520+ VMError . guarantee ( cArgType . isStackSlot ()) ;
525521 Pointer spVal = Word .pointer (p .getAbiSpReg ());
526- yield spVal .readLong (stackSlot . getOffset ( 0 ));
522+ yield spVal .readLong (cArgType . getStackOffset ( ));
527523 }
528524 };
529525 }
530526
531527 @ Override
532- public long setGpArgumentAt (AllocatableValue ccArg , Pointer data , int pos , long val ) {
528+ @ Uninterruptible (reason = REASON_RAW_POINTER , callerMustBe = true )
529+ public void setGpArgumentAt (PreparedArgumentType cArgType , Pointer data , int pos , long val , boolean incoming ) {
533530 InterpreterDataAArch64 p = (InterpreterDataAArch64 ) data ;
534531 if (pos >= 0 && pos <= 7 ) {
535- VMError .guarantee (ccArg instanceof RegisterValue );
532+ VMError .guarantee (cArgType . isRegister () );
536533 switch (pos ) {
537534 case 0 -> p .setAbiGpArg0 (val );
538535 case 1 -> p .setAbiGpArg1 (val );
@@ -543,24 +540,21 @@ public long setGpArgumentAt(AllocatableValue ccArg, Pointer data, int pos, long
543540 case 6 -> p .setAbiGpArg6 (val );
544541 case 7 -> p .setAbiGpArg7 (val );
545542 }
546- /* no GC mask required */
547- return 0 ;
543+ return ;
548544 }
549- StackSlot stackSlot = ( StackSlot ) ccArg ;
545+ VMError . guarantee ( cArgType . isStackSlot ()) ;
550546
551547 Pointer spVal = Word .pointer (p .getAbiSpReg ());
552- int offset = stackSlot . getOffset ( 0 );
548+ int offset = cArgType . getStackOffset ( );
553549 VMError .guarantee (spVal .isNonNull ());
554- VMError .guarantee (offset < p .getStackSize ());
550+ VMError .guarantee (incoming || offset < p .getStackSize ());
555551
556552 spVal .writeLong (offset , val );
557-
558- VMError .guarantee ((pos - 8 ) < Long .SIZE , "more than 64 stack args are not supported" );
559- return 1L << (pos - 8 );
560553 }
561554
562555 @ Override
563- public long getFpArgumentAt (AllocatableValue ccArg , Pointer data , int pos ) {
556+ @ Uninterruptible (reason = CALLED_FROM_UNINTERRUPTIBLE_CODE , mayBeInlined = true )
557+ public long getFpArgumentAt (PreparedArgumentType cArgType , Pointer data , int pos ) {
564558 InterpreterDataAArch64 p = (InterpreterDataAArch64 ) data ;
565559 return switch (pos ) {
566560 case 0 -> p .getAbiFpArg0 ();
@@ -572,15 +566,16 @@ public long getFpArgumentAt(AllocatableValue ccArg, Pointer data, int pos) {
572566 case 6 -> p .getAbiFpArg6 ();
573567 case 7 -> p .getAbiFpArg7 ();
574568 default -> {
575- StackSlot stackSlot = ( StackSlot ) ccArg ;
569+ VMError . guarantee ( cArgType . isStackSlot ()) ;
576570 Pointer spVal = Word .pointer (p .getAbiSpReg ());
577- yield spVal .readLong (stackSlot . getOffset ( 0 ));
571+ yield spVal .readLong (cArgType . getStackOffset ( ));
578572 }
579573 };
580574 }
581575
582576 @ Override
583- public void setFpArgumentAt (AllocatableValue ccArg , Pointer data , int pos , long val ) {
577+ @ Uninterruptible (reason = CALLED_FROM_UNINTERRUPTIBLE_CODE , mayBeInlined = true )
578+ public void setFpArgumentAt (PreparedArgumentType cArgType , Pointer data , int pos , long val ) {
584579 InterpreterDataAArch64 p = (InterpreterDataAArch64 ) data ;
585580 switch (pos ) {
586581 case 0 -> p .setAbiFpArg0 (val );
@@ -592,10 +587,10 @@ public void setFpArgumentAt(AllocatableValue ccArg, Pointer data, int pos, long
592587 case 6 -> p .setAbiFpArg6 (val );
593588 case 7 -> p .setAbiFpArg7 (val );
594589 default -> {
595- StackSlot stackSlot = ( StackSlot ) ccArg ;
590+ VMError . guarantee ( cArgType . isStackSlot ()) ;
596591
597592 Pointer spVal = Word .pointer (p .getAbiSpReg ());
598- int offset = stackSlot . getOffset ( 0 );
593+ int offset = cArgType . getStackOffset ( );
599594
600595 VMError .guarantee (spVal .isNonNull ());
601596 VMError .guarantee (offset < p .getStackSize ());
@@ -606,21 +601,25 @@ public void setFpArgumentAt(AllocatableValue ccArg, Pointer data, int pos, long
606601 }
607602
608603 @ Override
604+ @ Uninterruptible (reason = REASON_RAW_POINTER , callerMustBe = true )
609605 public long getGpReturn (Pointer data ) {
610606 return ((InterpreterDataAArch64 ) data ).getAbiGpRet ();
611607 }
612608
613609 @ Override
610+ @ Uninterruptible (reason = REASON_RAW_POINTER , callerMustBe = true )
614611 public void setGpReturn (Pointer data , long gpReturn ) {
615612 ((InterpreterDataAArch64 ) data ).setAbiGpRet (gpReturn );
616613 }
617614
618615 @ Override
616+ @ Uninterruptible (reason = CALLED_FROM_UNINTERRUPTIBLE_CODE , mayBeInlined = true )
619617 public long getFpReturn (Pointer data ) {
620618 return ((InterpreterDataAArch64 ) data ).getAbiFpRet ();
621619 }
622620
623621 @ Override
622+ @ Uninterruptible (reason = CALLED_FROM_UNINTERRUPTIBLE_CODE , mayBeInlined = true )
624623 public void setFpReturn (Pointer data , long fpReturn ) {
625624 ((InterpreterDataAArch64 ) data ).setAbiFpRet (fpReturn );
626625 }
0 commit comments