OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // NOLINT | 5 #include "vm/globals.h" // NOLINT |
6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
10 #include "vm/longjump.h" | 10 #include "vm/longjump.h" |
(...skipping 1108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1119 ldr(TMP, FieldAddress(CODE_REG, Code::saved_instructions_offset())); | 1119 ldr(TMP, FieldAddress(CODE_REG, Code::saved_instructions_offset())); |
1120 cmp(R0, Operand(TMP)); | 1120 cmp(R0, Operand(TMP)); |
1121 b(&instructions_ok, EQ); | 1121 b(&instructions_ok, EQ); |
1122 brk(1); | 1122 brk(1); |
1123 Bind(&instructions_ok); | 1123 Bind(&instructions_ok); |
1124 Pop(R0); | 1124 Pop(R0); |
1125 #endif | 1125 #endif |
1126 } | 1126 } |
1127 | 1127 |
1128 | 1128 |
| 1129 void Assembler::SetupDartSP() { |
| 1130 mov(SP, CSP); |
| 1131 } |
| 1132 |
| 1133 |
| 1134 void Assembler::RestoreCSP() { |
| 1135 mov(CSP, SP); |
| 1136 } |
| 1137 |
| 1138 |
1129 void Assembler::EnterFrame(intptr_t frame_size) { | 1139 void Assembler::EnterFrame(intptr_t frame_size) { |
| 1140 // The ARM64 ABI requires at all times |
| 1141 // - stack limit < CSP <= stack base |
| 1142 // - CSP mod 16 = 0 |
| 1143 // - we do not access stack memory below CSP |
| 1144 // Pratically, this means we need to keep the C stack pointer ahead of the |
| 1145 // Dart stack pointer and 16-byte aligned for signal handlers. If we knew the |
| 1146 // real stack limit, we could just set CSP to a value near it during |
| 1147 // SetupDartSP, but we do not know the real stack limit for the initial |
| 1148 // thread or threads created by the embedder. |
| 1149 // TODO(26472): It would be safer to use CSP as the Dart stack pointer, but |
| 1150 // this requires adjustments to stack handling to maintain the 16-byte |
| 1151 // alignment. |
| 1152 const intptr_t kMaxDartFrameSize = 4096; |
| 1153 sub(TMP, SP, Operand(kMaxDartFrameSize)); |
| 1154 andi(CSP, TMP, Immediate(~15)); |
| 1155 |
1130 PushPair(LR, FP); | 1156 PushPair(LR, FP); |
1131 mov(FP, SP); | 1157 mov(FP, SP); |
1132 | 1158 |
1133 if (frame_size > 0) { | 1159 if (frame_size > 0) { |
1134 sub(SP, SP, Operand(frame_size)); | 1160 sub(SP, SP, Operand(frame_size)); |
1135 } | 1161 } |
1136 } | 1162 } |
1137 | 1163 |
1138 | 1164 |
1139 void Assembler::LeaveFrame() { | 1165 void Assembler::LeaveFrame() { |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1445 add(base, array, Operand(index, LSL, shift)); | 1471 add(base, array, Operand(index, LSL, shift)); |
1446 } | 1472 } |
1447 const OperandSize size = Address::OperandSizeFor(cid); | 1473 const OperandSize size = Address::OperandSizeFor(cid); |
1448 ASSERT(Address::CanHoldOffset(offset, Address::Offset, size)); | 1474 ASSERT(Address::CanHoldOffset(offset, Address::Offset, size)); |
1449 return Address(base, offset, Address::Offset, size); | 1475 return Address(base, offset, Address::Offset, size); |
1450 } | 1476 } |
1451 | 1477 |
1452 } // namespace dart | 1478 } // namespace dart |
1453 | 1479 |
1454 #endif // defined TARGET_ARCH_ARM64 | 1480 #endif // defined TARGET_ARCH_ARM64 |
OLD | NEW |