aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormmc28a <78873583+mmc28a@users.noreply.github.com>2023-01-18 13:07:00 +0000
committerGitHub <noreply@github.com>2023-01-18 13:07:00 +0000
commitd7b7a306fb10d03fbd191b212af47fe4e0720ad4 (patch)
tree6dff7d04a2123bc461a76254b038010e6be32f3d
parent84e54a2d6ff0fcd054aa9d617147a8d23ba386b6 (diff)
downloadvixl-d7b7a306fb10d03fbd191b212af47fe4e0720ad4.tar.gz
Fix pointer authentication modifier source register (#61)
Pointer authentication instructions allow the stack pointer as source for the modifier, but simulation was using the zero register instead. Fix this and add a regression test.
-rw-r--r--src/aarch64/simulator-aarch64.cc24
-rw-r--r--test/aarch64/test-assembler-aarch64.cc28
2 files changed, 40 insertions, 12 deletions
diff --git a/src/aarch64/simulator-aarch64.cc b/src/aarch64/simulator-aarch64.cc
index 1830eb4a..838c579d 100644
--- a/src/aarch64/simulator-aarch64.cc
+++ b/src/aarch64/simulator-aarch64.cc
@@ -5239,18 +5239,18 @@ void Simulator::VisitDataProcessing1Source(const Instruction* instr) {
unsigned src = instr->GetRn();
switch (instr->Mask(DataProcessing1SourceMask)) {
-#define DEFINE_PAUTH_FUNCS(SUFFIX, KEY, D) \
- case PAC##SUFFIX: { \
- uint64_t mod = ReadXRegister(src); \
- uint64_t ptr = ReadXRegister(dst); \
- WriteXRegister(dst, AddPAC(ptr, mod, KEY, D)); \
- break; \
- } \
- case AUT##SUFFIX: { \
- uint64_t mod = ReadXRegister(src); \
- uint64_t ptr = ReadXRegister(dst); \
- WriteXRegister(dst, AuthPAC(ptr, mod, KEY, D)); \
- break; \
+#define DEFINE_PAUTH_FUNCS(SUFFIX, KEY, D) \
+ case PAC##SUFFIX: { \
+ uint64_t mod = ReadXRegister(src, Reg31IsStackPointer); \
+ uint64_t ptr = ReadXRegister(dst); \
+ WriteXRegister(dst, AddPAC(ptr, mod, KEY, D)); \
+ break; \
+ } \
+ case AUT##SUFFIX: { \
+ uint64_t mod = ReadXRegister(src, Reg31IsStackPointer); \
+ uint64_t ptr = ReadXRegister(dst); \
+ WriteXRegister(dst, AuthPAC(ptr, mod, KEY, D)); \
+ break; \
}
PAUTH_MODES_REGISTER_CONTEXT(DEFINE_PAUTH_FUNCS)
diff --git a/test/aarch64/test-assembler-aarch64.cc b/test/aarch64/test-assembler-aarch64.cc
index a1543a75..ac701c3e 100644
--- a/test/aarch64/test-assembler-aarch64.cc
+++ b/test/aarch64/test-assembler-aarch64.cc
@@ -1916,6 +1916,34 @@ TEST(pacga_xpaci_xpacd) {
}
}
+TEST(pac_sp_modifier) {
+ SETUP_WITH_FEATURES(CPUFeatures::kPAuth);
+
+ START();
+
+ __ Mov(x0, 0x0000000012345678);
+ __ Mov(x1, x0);
+ __ Mov(x10, sp);
+
+ // Generate PACs using sp and register containing a copy of sp.
+ __ Pacia(x0, x10);
+ __ Pacia(x1, sp);
+
+ // Authenticate the pointers, exchanging (equal) modifiers.
+ __ Mov(x2, x0);
+ __ Mov(x3, x1);
+ __ Autia(x2, sp);
+ __ Autia(x3, x10);
+
+ END();
+
+ if (CAN_RUN()) {
+ RUN();
+
+ ASSERT_EQUAL_64(x0, x1);
+ ASSERT_EQUAL_64(x2, x3);
+ }
+}
TEST(label) {
SETUP();