[Lldb-commits] [lldb] [lldb][debugserver] Save and restore the SVE/SME register state (PR #134184)
Jason Molenda via lldb-commits
lldb-commits at lists.llvm.org
Wed Apr 2 18:33:07 PDT 2025
https://github.com/jasonmolenda updated https://github.com/llvm/llvm-project/pull/134184
>From 7cc45f1a300b1b0f2cbb529f11a0f9e56c41ffea Mon Sep 17 00:00:00 2001
From: Jason Molenda <jmolenda at apple.com>
Date: Wed, 2 Apr 2025 18:05:29 -0700
Subject: [PATCH 1/3] [lldb][debugserver] Save and restore the SVE/SME register
state
debugserver isn't saving and restoring the SVE/SME register state
around inferior function calls.
Making arbitrary function calls while in Streaming SVE mode is
generally a poor idea because a NEON instruction can be hit and
crash the expression execution, which is how I missed this, but
they should be handled correctly if the user knows it is safe
to do.
rdar://146886210
---
.../source/MacOSX/arm64/DNBArchImplARM64.cpp | 30 ++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp b/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp
index 34a4ee21f8502..fb23744393d43 100644
--- a/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp
+++ b/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp
@@ -2953,7 +2953,14 @@ kern_return_t DNBArchMachARM64::SetRegisterState(int set) {
switch (set) {
case e_regSetALL:
- return SetGPRState() | SetVFPState() | SetEXCState() | SetDBGState(false);
+ {
+ kern_return_t ret = SetGPRState() | SetVFPState() | SetEXCState() | SetDBGState(false);
+ if (CPUHasSME()) {
+ ret |= SetSVEState();
+ ret |= SetSMEState();
+ }
+ return ret;
+ }
case e_regSetGPR:
return SetGPRState();
case e_regSetVFP:
@@ -3122,6 +3129,15 @@ uint32_t DNBArchMachARM64::SaveRegisterState() {
DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::SaveRegisterState () "
"error: %s regs failed to read: %u",
"VFP", kret);
+ } else if (CPUHasSME() && (kret = SetSVEState() != KERN_SUCCESS)) {
+ DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::SaveRegisterState () "
+ "error: %s regs failed to read: %u",
+ "SVE", kret);
+ }
+ else if (CPUHasSME() && (kret = SetSMEState() != KERN_SUCCESS)) {
+ DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::SaveRegisterState () "
+ "error: %s regs failed to read: %u",
+ "SME", kret);
} else {
const uint32_t save_id = GetNextRegisterStateSaveID();
m_saved_register_states[save_id] = m_state.context;
@@ -3149,6 +3165,18 @@ bool DNBArchMachARM64::RestoreRegisterState(uint32_t save_id) {
"write: %u",
save_id, "VFP", kret);
success = false;
+ } else if ((kret = SetSVEState()) != KERN_SUCCESS) {
+ DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::RestoreRegisterState "
+ "(save_id = %u) error: %s regs failed to "
+ "write: %u",
+ save_id, "SVE", kret);
+ success = false;
+ } else if ((kret = SetSMEState()) != KERN_SUCCESS) {
+ DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::RestoreRegisterState "
+ "(save_id = %u) error: %s regs failed to "
+ "write: %u",
+ save_id, "SME", kret);
+ success = false;
}
m_saved_register_states.erase(pos);
return success;
>From 432a68d8a85b46b7cacd6b64802a394562bc1566 Mon Sep 17 00:00:00 2001
From: Jason Molenda <jmolenda at apple.com>
Date: Wed, 2 Apr 2025 18:28:07 -0700
Subject: [PATCH 2/3] reformat
---
.../source/MacOSX/arm64/DNBArchImplARM64.cpp | 42 +++++++++++--------
1 file changed, 24 insertions(+), 18 deletions(-)
diff --git a/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp b/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp
index fb23744393d43..bafcb47503dec 100644
--- a/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp
+++ b/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp
@@ -2954,7 +2954,8 @@ kern_return_t DNBArchMachARM64::SetRegisterState(int set) {
switch (set) {
case e_regSetALL:
{
- kern_return_t ret = SetGPRState() | SetVFPState() | SetEXCState() | SetDBGState(false);
+ kern_return_t ret =
+ SetGPRState() | SetVFPState() | SetEXCState() | SetDBGState(false);
if (CPUHasSME()) {
ret |= SetSVEState();
ret |= SetSMEState();
@@ -3126,17 +3127,19 @@ uint32_t DNBArchMachARM64::SaveRegisterState() {
"error: GPR regs failed to read: %u ",
kret);
} else if ((kret = GetVFPState(force)) != KERN_SUCCESS) {
- DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::SaveRegisterState () "
- "error: %s regs failed to read: %u",
+ DNBLogThreadedIf(LOG_THREAD,
+ "DNBArchMachARM64::SaveRegisterState () "
+ "error: %s regs failed to read: %u",
"VFP", kret);
} else if (CPUHasSME() && (kret = SetSVEState() != KERN_SUCCESS)) {
- DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::SaveRegisterState () "
- "error: %s regs failed to read: %u",
+ DNBLogThreadedIf(LOG_THREAD,
+ "DNBArchMachARM64::SaveRegisterState () "
+ "error: %s regs failed to read: %u",
"SVE", kret);
- }
- else if (CPUHasSME() && (kret = SetSMEState() != KERN_SUCCESS)) {
- DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::SaveRegisterState () "
- "error: %s regs failed to read: %u",
+ } else if (CPUHasSME() && (kret = SetSMEState() != KERN_SUCCESS)) {
+ DNBLogThreadedIf(LOG_THREAD,
+ "DNBArchMachARM64::SaveRegisterState () "
+ "error: %s regs failed to read: %u",
"SME", kret);
} else {
const uint32_t save_id = GetNextRegisterStateSaveID();
@@ -3160,21 +3163,24 @@ bool DNBArchMachARM64::RestoreRegisterState(uint32_t save_id) {
save_id, kret);
success = false;
} else if ((kret = SetVFPState()) != KERN_SUCCESS) {
- DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::RestoreRegisterState "
- "(save_id = %u) error: %s regs failed to "
- "write: %u",
+ DNBLogThreadedIf(LOG_THREAD,
+ "DNBArchMachARM64::RestoreRegisterState "
+ "(save_id = %u) error: %s regs failed to "
+ "write: %u",
save_id, "VFP", kret);
success = false;
} else if ((kret = SetSVEState()) != KERN_SUCCESS) {
- DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::RestoreRegisterState "
- "(save_id = %u) error: %s regs failed to "
- "write: %u",
+ DNBLogThreadedIf(LOG_THREAD,
+ "DNBArchMachARM64::RestoreRegisterState "
+ "(save_id = %u) error: %s regs failed to "
+ "write: %u",
save_id, "SVE", kret);
success = false;
} else if ((kret = SetSMEState()) != KERN_SUCCESS) {
- DNBLogThreadedIf(LOG_THREAD, "DNBArchMachARM64::RestoreRegisterState "
- "(save_id = %u) error: %s regs failed to "
- "write: %u",
+ DNBLogThreadedIf(LOG_THREAD,
+ "DNBArchMachARM64::RestoreRegisterState "
+ "(save_id = %u) error: %s regs failed to "
+ "write: %u",
save_id, "SME", kret);
success = false;
}
>From 63e08b6fe4cdc86c5f0905d86d56cfa22de26793 Mon Sep 17 00:00:00 2001
From: Jason Molenda <jmolenda at apple.com>
Date: Wed, 2 Apr 2025 18:32:51 -0700
Subject: [PATCH 3/3] reformater
---
.../tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp b/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp
index bafcb47503dec..d32a63daa5672 100644
--- a/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp
+++ b/lldb/tools/debugserver/source/MacOSX/arm64/DNBArchImplARM64.cpp
@@ -2952,8 +2952,7 @@ kern_return_t DNBArchMachARM64::SetRegisterState(int set) {
return err;
switch (set) {
- case e_regSetALL:
- {
+ case e_regSetALL: {
kern_return_t ret =
SetGPRState() | SetVFPState() | SetEXCState() | SetDBGState(false);
if (CPUHasSME()) {
More information about the lldb-commits
mailing list