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 <jmole...@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 <jmole...@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 <jmole...@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()) {

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to