[RISC-V] Fix 16 byte stack alignment in asm helpers. (#95916)
authorMikhail Kurinnoi <m.kurinnoi@samsung.com>
Wed, 13 Dec 2023 00:05:19 +0000 (03:05 +0300)
committerGleb Balykov/Advanced System SW Lab /SRR/Staff Engineer/Samsung Electronics <g.balykov@samsung.com>
Tue, 26 Dec 2023 08:37:03 +0000 (11:37 +0300)
src/coreclr/pal/inc/unixasmmacrosriscv64.inc
src/coreclr/vm/riscv64/asmhelpers.S

index 56da9af150dc6cb48993de73aab65e9c6259f427..cd61556a906e933ffc184db30264975ce1a272ac 100644 (file)
@@ -256,7 +256,11 @@ C_FUNC(\Name\()_End):
 
     __PWTB_FloatArgumentRegisters = \extraLocals
 
-    .if ((__PWTB_FloatArgumentRegisters % 16) != 0)
+    // Note, stack (see __PWTB_StackAlloc variable) must be 16 byte aligned,
+    // SIZEOF__FloatArgumentRegisters (0x40) is 16 byte aligned, that mean initial
+    // __PWTB_FloatArgumentRegisters value must be not 16 byte aligned and
+    // after add (120 + 64) provide 16 byte aligned result.
+    .if ((__PWTB_FloatArgumentRegisters % 16) == 0)
         __PWTB_FloatArgumentRegisters = __PWTB_FloatArgumentRegisters + 8
     .endif
 
index d692f591a2e5807970cd0b9a3bdceb6d3e60cf21..83f0484296c03b041ad62a273b5519f9a220e7d7 100644 (file)
@@ -687,7 +687,7 @@ LEAF_END JIT_GetSharedGCStaticBaseNoCtor_SingleAppDomain, _TEXT
 // ------------------------------------------------------------------
 // Hijack function for functions which return a scalar type or a struct (value type)
 NESTED_ENTRY OnHijackTripThread, _TEXT, NoHandler
-    PROLOG_SAVE_REG_PAIR_INDEXED   fp, ra, 0x88
+    PROLOG_SAVE_REG_PAIR_INDEXED   fp, ra, 0x90
 
     // Spill callee saved registers
     PROLOG_SAVE_REG_PAIR   s1, s2, 16
@@ -724,7 +724,7 @@ NESTED_ENTRY OnHijackTripThread, _TEXT, NoHandler
     EPILOG_RESTORE_REG_PAIR   s7, s8, 64
     EPILOG_RESTORE_REG_PAIR   s9, s10, 80
     EPILOG_RESTORE_REG  s11, 96 
-    EPILOG_RESTORE_REG_PAIR_INDEXED  fp, ra, 0x88
+    EPILOG_RESTORE_REG_PAIR_INDEXED  fp, ra, 0x90
     EPILOG_RETURN
 NESTED_END OnHijackTripThread, _TEXT
 
@@ -756,7 +756,7 @@ NESTED_ENTRY CallEHFunclet, _TEXT, NoHandler
     // a3 = address of the location where the SP of funclet's caller (i.e. this helper) should be saved.
     //
 
-    PROLOG_SAVE_REG_PAIR_INDEXED   fp, ra, 120, 0
+    PROLOG_SAVE_REG_PAIR_INDEXED   fp, ra, 128, 0
 
     // Spill callee saved registers
     PROLOG_SAVE_REG_PAIR   s1, s2, 16
@@ -796,7 +796,7 @@ NESTED_ENTRY CallEHFunclet, _TEXT, NoHandler
     EPILOG_RESTORE_REG_PAIR   s11, gp, 96
     EPILOG_RESTORE_REG tp, 112
 
-    EPILOG_RESTORE_REG_PAIR_INDEXED   fp, ra, 12
+    EPILOG_RESTORE_REG_PAIR_INDEXED   fp, ra, 128
     EPILOG_RETURN
 NESTED_END CallEHFunclet, _TEXT