[vm/ffi] Align stack frame when entering and exiting safe point
Closes: https://github.com/dart-lang/sdk/issues/36993
Change-Id: Idc3b2f26142a5c1a358ebf5f71cd226978181b73
Cq-Include-Trybots: luci.dart.try:vm-kernel-linux-debug-simdbc64-try, vm-kernel-mac-debug-simdbc64-try, vm-kernel-reload-mac-debug-simdbc64-try, vm-kernel-linux-debug-ia32-try, vm-dartkb-linux-debug-simarm64-try, vm-kernel-win-debug-x64-try, vm-kernel-mac-debug-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/103136
Reviewed-by: Samir Jindel <sjindel@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index e82fa9f..4f23b00 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -274,8 +274,13 @@
RegisterSet all_registers;
all_registers.AddAllGeneralRegisters();
__ PushRegisters(all_registers);
+
+ __ EnterFrame((1 << FP) | (1 << LR), 0);
+ __ ReserveAlignedFrameSpace(0);
__ ldr(R0, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
__ blx(R0);
+ __ LeaveFrame((1 << FP) | (1 << LR), 0);
+
__ PopRegisters(all_registers);
__ Ret();
}
@@ -284,8 +289,13 @@
RegisterSet all_registers;
all_registers.AddAllGeneralRegisters();
__ PushRegisters(all_registers);
+
+ __ EnterFrame((1 << FP) | (1 << LR), 0);
+ __ ReserveAlignedFrameSpace(0);
__ ldr(R0, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
__ blx(R0);
+ __ LeaveFrame((1 << FP) | (1 << LR), 0);
+
__ PopRegisters(all_registers);
__ Ret();
}
@@ -1748,7 +1758,7 @@
EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
}
- __ LeaveDartFrameAndReturn(); // Restores correct SP.
+ __ LeaveDartFrameAndReturn(); // Restores correct SP.
}
// Called for invoking "dynamic noSuchMethod(Invocation invocation)" function
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 9bee589..59cb997 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -209,12 +209,14 @@
RegisterSet all_registers;
all_registers.AddAllGeneralRegisters();
__ PushRegisters(all_registers);
- __ mov(CallingConventions::kFirstCalleeSavedCpuReg, SP);
+
+ __ EnterFrame(0);
__ ReserveAlignedFrameSpace(0);
__ mov(CSP, SP);
__ ldr(R0, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
__ blr(R0);
- __ mov(SP, CallingConventions::kFirstCalleeSavedCpuReg);
+ __ LeaveFrame();
+
__ PopRegisters(all_registers);
__ mov(CSP, SP);
__ Ret();
@@ -224,12 +226,14 @@
RegisterSet all_registers;
all_registers.AddAllGeneralRegisters();
__ PushRegisters(all_registers);
- __ mov(CallingConventions::kFirstCalleeSavedCpuReg, SP);
+
+ __ EnterFrame(0);
__ ReserveAlignedFrameSpace(0);
__ mov(CSP, SP);
__ ldr(R0, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
__ blr(R0);
- __ mov(SP, CallingConventions::kFirstCalleeSavedCpuReg);
+ __ LeaveFrame();
+
__ PopRegisters(all_registers);
__ mov(CSP, SP);
__ Ret();
@@ -1806,7 +1810,7 @@
// ensure that the object is in new-space or has remembered bit set.
EnsureIsNewOrRemembered(assembler, /*preserve_registers=*/false);
}
- __ LeaveStubFrame(); // Restores correct SP.
+ __ LeaveStubFrame(); // Restores correct SP.
__ ret();
}
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index 806c130..1cae9f2 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -140,16 +140,26 @@
void StubCodeCompiler::GenerateEnterSafepointStub(Assembler* assembler) {
__ pushal();
+
+ __ EnterFrame(0);
+ __ ReserveAlignedFrameSpace(0);
__ movl(EAX, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
__ call(EAX);
+ __ LeaveFrame();
+
__ popal();
__ ret();
}
void StubCodeCompiler::GenerateExitSafepointStub(Assembler* assembler) {
__ pushal();
+
+ __ EnterFrame(0);
+ __ ReserveAlignedFrameSpace(0);
__ movl(EAX, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
__ call(EAX);
+ __ LeaveFrame();
+
__ popal();
__ ret();
}
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 91728ca..b2d7da1 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -204,8 +204,13 @@
all_registers.AddAllGeneralRegisters();
__ PushRegisters(all_registers.cpu_registers(),
all_registers.fpu_registers());
+
+ __ EnterFrame(0);
+ __ ReserveAlignedFrameSpace(0);
__ movq(RAX, Address(THR, kEnterSafepointRuntimeEntry.OffsetFromThread()));
__ CallCFunction(RAX);
+ __ LeaveFrame();
+
__ PopRegisters(all_registers.cpu_registers(), all_registers.fpu_registers());
__ ret();
}
@@ -215,8 +220,13 @@
all_registers.AddAllGeneralRegisters();
__ PushRegisters(all_registers.cpu_registers(),
all_registers.fpu_registers());
+
+ __ EnterFrame(0);
+ __ ReserveAlignedFrameSpace(0);
__ movq(RAX, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
__ CallCFunction(RAX);
+ __ LeaveFrame();
+
__ PopRegisters(all_registers.cpu_registers(), all_registers.fpu_registers());
__ ret();
}
@@ -1762,7 +1772,7 @@
// Create a stub frame.
__ EnterStubFrame(); // Uses PP to access class object.
- __ pushq(R9); // Setup space on stack for return value.
+ __ pushq(R9); // Setup space on stack for return value.
__ PushObject(
CastHandle<Object>(cls)); // Push class of object to be allocated.
if (is_cls_parameterized) {