From 6abc5409e823f1de5cd2c60d228aafed2fb32465 Mon Sep 17 00:00:00 2001 From: David Spickett Date: Thu, 19 Jun 2025 13:12:49 +0000 Subject: [PATCH 1/2] [lldb][AArch64][Linux] Show MTE store only setting in mte_ctrl This controls whether tag checking is performed for loads and stores, or stores only. It requires a specific architecture feature which we detect with a HWCAP3 and cpuinfo feature. Live process tests look for this and adjust expectations accordingly, core file tests are using an updated file with this feature enabled. The size of the core file has increased and there's nothing I can do about that. Could be the presence of new architecure features or kernel changes since I last generated them. I can generate a smaller file that has the tag segment, but that segment does not actually contain tag data. So that's no use. (and I will fix handling of such files later) --- .../Python/lldbsuite/test/lldbtest.py | 3 ++ .../Utility/RegisterFlagsDetector_arm64.cpp | 18 +++++++--- .../TestMTECtrlRegister.py | 32 ++++++++++++------ .../TestAArch64LinuxMTEMemoryTagCoreFile.py | 11 +++--- .../API/linux/aarch64/mte_core_file/core.mte | Bin 20608 -> 417920 bytes .../linux/aarch64/mte_core_file/core.nomte | Bin 20480 -> 32768 bytes .../API/linux/aarch64/mte_core_file/main.c | 2 +- 7 files changed, 47 insertions(+), 19 deletions(-) diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py index 63fadb59a82a1..a74961ec6fcc4 100644 --- a/lldb/packages/Python/lldbsuite/test/lldbtest.py +++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -1380,6 +1380,9 @@ def isAArch64SMEFA64(self): def isAArch64MTE(self): return self.isAArch64() and "mte" in self.getCPUInfo() + def isAArch64MTEStoreOnly(self): + return self.isAArch64() and "mtestoreonly" in self.getCPUInfo() + def isAArch64GCS(self): return self.isAArch64() and "gcs" in self.getCPUInfo() diff --git a/lldb/source/Plugins/Process/Utility/RegisterFlagsDetector_arm64.cpp b/lldb/source/Plugins/Process/Utility/RegisterFlagsDetector_arm64.cpp index d339a59689f7f..cae416a4eccb0 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterFlagsDetector_arm64.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterFlagsDetector_arm64.cpp @@ -26,6 +26,8 @@ #define HWCAP2_EBF16 (1ULL << 32) #define HWCAP2_FPMR (1ULL << 48) +#define HWCAP3_MTE_STORE_ONLY (1ULL << 1) + using namespace lldb_private; Arm64RegisterFlagsDetector::Fields @@ -92,7 +94,6 @@ Arm64RegisterFlagsDetector::Fields Arm64RegisterFlagsDetector::DetectMTECtrlFields(uint64_t hwcap, uint64_t hwcap2, uint64_t hwcap3) { (void)hwcap; - (void)hwcap3; if (!(hwcap2 & HWCAP2_MTE)) return {}; @@ -104,9 +105,18 @@ Arm64RegisterFlagsDetector::DetectMTECtrlFields(uint64_t hwcap, uint64_t hwcap2, static const FieldEnum tcf_enum( "tcf_enum", {{0, "TCF_NONE"}, {1, "TCF_SYNC"}, {2, "TCF_ASYNC"}, {3, "TCF_ASYMM"}}); - return {{"TAGS", 3, 18}, // 16 bit bitfield shifted up by PR_MTE_TAG_SHIFT. - {"TCF", 1, 2, &tcf_enum}, - {"TAGGED_ADDR_ENABLE", 0}}; + + std::vector fields; + fields.reserve(5); + if (hwcap3 & HWCAP3_MTE_STORE_ONLY) + fields.push_back({"STORE_ONLY", 19}); + fields.insert( + std::end(fields), + {{"TAGS", 3, 18}, // 16 bit bitfield shifted up by PR_MTE_TAG_SHIFT. + {"TCF", 1, 2, &tcf_enum}, + {"TAGGED_ADDR_ENABLE", 0}}); + + return fields; } Arm64RegisterFlagsDetector::Fields diff --git a/lldb/test/API/commands/register/register/aarch64_mte_ctrl_register/TestMTECtrlRegister.py b/lldb/test/API/commands/register/register/aarch64_mte_ctrl_register/TestMTECtrlRegister.py index 2570f267bf46e..c003d87f8ca37 100644 --- a/lldb/test/API/commands/register/register/aarch64_mte_ctrl_register/TestMTECtrlRegister.py +++ b/lldb/test/API/commands/register/register/aarch64_mte_ctrl_register/TestMTECtrlRegister.py @@ -34,29 +34,41 @@ def test_mte_ctrl_register(self): substrs=["stop reason = breakpoint 1."], ) - def check_mte_ctrl(async_err, sync_err): + has_store_only = self.isAArch64MTEStoreOnly() + + def check_mte_ctrl(async_err, sync_err, store_only): # Bit 0 = tagged addressing enabled # Bit 1 = synchronous faults # Bit 2 = asynchronous faults - value = "0x{:016x}".format((async_err << 2) | (sync_err << 1) | 1) + # Bit 19 = store only checking mode + value = "0x{:016x}".format( + (store_only << 19) | (async_err << 2) | (sync_err << 1) | 1 + ) expected = [value] if self.hasXMLSupport(): + fields = "(" + if has_store_only: + fields += f"STORE_ONLY = {store_only}, " + tfc_modes = ["NONE", "SYNC", "ASYNC", "ASYMM"] - expected.append( - f"(TAGS = 0, TCF = TCF_{tfc_modes[async_err << 1 | sync_err]}, TAGGED_ADDR_ENABLE = 1)".format( - async_err, sync_err - ) - ) + fields += f"TAGS = 0, TCF = TCF_{tfc_modes[async_err << 1 | sync_err]}, TAGGED_ADDR_ENABLE = 1)" + + expected.append(fields) self.expect("register read mte_ctrl", substrs=expected) # We start enabled with synchronous faults. - check_mte_ctrl(0, 1) + check_mte_ctrl(0, 1, 0) # Change to asynchronous faults. self.runCmd("register write mte_ctrl 5") - check_mte_ctrl(1, 0) + check_mte_ctrl(1, 0, 0) # This would return to synchronous faults if we did not restore the # previous value. self.expect("expression setup_mte()", substrs=["= 0"]) - check_mte_ctrl(1, 0) + check_mte_ctrl(1, 0, 0) + + # Store only checking requires FEAT_MTE_STORE_ONLY. + if has_store_only: + self.runCmd(f"register write mte_ctrl {1 | (1 << 19)}") + check_mte_ctrl(0, 0, 1) diff --git a/lldb/test/API/linux/aarch64/mte_core_file/TestAArch64LinuxMTEMemoryTagCoreFile.py b/lldb/test/API/linux/aarch64/mte_core_file/TestAArch64LinuxMTEMemoryTagCoreFile.py index bfdc8229094f0..825e1a4b79fd2 100644 --- a/lldb/test/API/linux/aarch64/mte_core_file/TestAArch64LinuxMTEMemoryTagCoreFile.py +++ b/lldb/test/API/linux/aarch64/mte_core_file/TestAArch64LinuxMTEMemoryTagCoreFile.py @@ -10,8 +10,8 @@ class AArch64LinuxMTEMemoryTagCoreFileTestCase(TestBase): NO_DEBUG_INFO_TESTCASE = True - MTE_BUF_ADDR = hex(0xFFFF82C74000) - BUF_ADDR = hex(0xFFFF82C73000) + MTE_BUF_ADDR = hex(0xFFFFA733B000) + BUF_ADDR = hex(0xFFFFA733A000) @skipIfLLVMTargetMissing("AArch64") def test_mte_tag_core_file_memory_region(self): @@ -215,7 +215,7 @@ def test_mte_tag_fault_reason(self): self.expect( "bt", substrs=[ - "* thread #1, name = 'a.out.mte', stop reason = SIGSEGV: sync tag check fault (fault address=0xffff82c74010)" + "* thread #1, name = 'a.out.mte', stop reason = SIGSEGV: sync tag check fault (fault address=0xffffa733b010)" ], ) @@ -231,12 +231,15 @@ def test_mte_ctrl_register(self): self.runCmd("target create --core core.mte") # The expected value is: # * Allowed tags value of 0xFFFF, shifted up by 3 resulting in 0x7fff8. + # * Bit 19 set to 0, which means that store only checking is disabled. # * Bit 1 set to enable synchronous tag faults. # * Bit 0 set to enable the tagged address ABI. expected = ["mte_ctrl = 0x000000000007fffb"] if self.hasXMLSupport(): - expected.append("(TAGS = 65535, TCF = TCF_SYNC, TAGGED_ADDR_ENABLE = 1)") + expected.append( + "(STORE_ONLY = 0, TAGS = 65535, TCF = TCF_SYNC, TAGGED_ADDR_ENABLE = 1)" + ) self.expect("register read mte_ctrl", substrs=expected) diff --git a/lldb/test/API/linux/aarch64/mte_core_file/core.mte b/lldb/test/API/linux/aarch64/mte_core_file/core.mte index 84a3266667e7718d9a72ee757343346fda8cf786..188d06d11c71efd08b2ffce1bbf7b50ad92be8da 100644 GIT binary patch literal 417920 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 z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kiZ9!Kxd)T=_Oa^s#1A5Fvf@#JJ#-{tfro^T7Ua-$boV(8_y%^`b4KBiM*jMvZGN#&nPF{ru_Fr}d3O7DrOK;pJ(B-9zs(<1 zM>+L{FIeEHlrQ?JZHL(Vs?kr_diqYb@uhw#A8pO8M`n+-Plb^lvfAgd?O*WAfNh^E zT?K8v5c*et`y3}K|Vl280@-HpF1!vxqt%v*`qd$DcL9E^j>CS&aikz-06-+J^5sX+|Tl}lHgou8K{ z!=*gx`%c`{COaNMvSC2f=V60aWVRnSHMw(xM1SK2eH&(7QK8*M%J{C02yscYc|la=wvajLon| z_<)}9W<3f1+*Z_y_*aB%{3)nEK6C!t=DaWUiC@}t=91j@1kjMa!)yR)pTc>M?$E9nmfsVE1J*8L88`&Vc`3H$NN?I=i#UdK1%@3F*iB<2Q!c;+BV*j@fk%qW?~w ztRJQgCX%d&iLm7)>!FONr2Elm_j)Mj{XthdrM=S5UY%~*-g$!MFZ0GUNjRAO-V5!x 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 literal 20480 zcmeHPZ%iD=6`#AkJI)R`Yvd?t63J_zHdy8ku^0BN5jnL`~Wc3wIoFKDbNn z4%e2D49I_Q&Xs8VC5a<7B~1)cK3IyYgsK&^Ol@`{uoQZ|1$yvfJr!Fe)zgCR^qh)2YEmbymw%!Mg;V zR%{BkYVSH5W2@pAZsaw5VA1*WmIn*Gcy5cNi-M1EM51bgEhO=NEGM z&*Lu4-_3o#Ea>YVJ;&tA1M0$`|LFY8`@YCAbQ+3jEB0-KrpB9GdCfJMW&-WU>&vV; z6>C}#eLID6)vF`PmO;0kt$&e9)rVGmqq;R7@zWHi%G$AC5f$e=&jnU>ao)IuyjD>30m~YTumVAu*x$Uw z3rc#FTZAFbDV9Qu@Hxh6Q65jnBkA8O+KGHkRLVcLa_@e@4>>H)HVXa?(`vt4@U=o; zuvvofdBL~Fmge1r@mgvnFzGB-b!ri`!J_$RC-Iuq4pS(KShx9SAMxUBdx{L`tP^L~ zlO(6JOq@;MBRQQpTK-ue_FS>|ZX$PRFWzUhmk7DPFP`=vh$hoUGLgWw_1`Wu_J7f1 ze<}$(M~L=~O1_I!cE|fs8m_GIZLjvF63qWUsMmR0-u7H1B=lNvLb5to?_#!TdUHZJz9b^c4r@bHXER6dN`!i48{$ zVZiqgmkk?yB}Tah8;IK`M_w=C8wNiG^R_3y+@IwBgs*WPTh0Ir<*-G7^0f%uTAL2N zH&WXgTbnSHL?R#&kO)WwBmxoviGV~vA|Mfv2uK7Z0ulj#!7ah5*7Vc5%aF?-=UuU8_lR`Czyd^G75~VAK*ggCgbN0NrV3|*O$Ji6U z(!F~w;mqeV*Fk+EpJko1~dlTW9(H%*r zqkWNOu@EG>Iy(+6OS8(!NNQOMHyu;a?qnq0pNuo>+TVfBR03}M`Kqm3O-7Axr*C^5 z2I0*9A?FZ(Kc4z)(FWijgx`0u0Sfx=gy)G%Mgg{ALA6IkrKmFI8qYKEj^4>Sk>vY_K(~ z4z&if>HBwmvZMx?vS0VGwvl(VOc6Uf}6voof7ui<(iIRt4vwzOsEJj8YhWNbh`<$<`|UiQPI zsyj0behxdV_|8BaTNqnB;{xhpix>ySZ?J;cFCh-}VGjDR#`44vCmicutT z*iEr@9KR#bPk>9Qt?-#y+N4J{PRf`Fu`*tlr^?ZG!nY209BckApq!|7wJ} zd>inZ0~yYn!Q8iu9p-cC=5wj&rQAmx`v)*K;`gSYR}e?wjWT6+{=Fr&5atPU6*iu8 zI1f#>JREkfl80r%iVWo8v2rU9N5IZxUXh1)W%CfQnc0PTSdMx4JIF&9&qIjoIR)nV zRi20LjODvaKkS#x$puAAf+j%I~rA z^`B68{eDSRAhusUW~xUaC#IMZI|BJKJf}~VFg7_n57fmbKLy=aT1*vl=r^wA92&d1 zN)BnkirBb5(N$)}-V1g=a=3Zy0fw<-{;cKsb9{roXyuOk^bu8G43u4f94g4X4Rh#$ zcqoSu55nTSZA~82H)nnU{^9&xMk@9cxF_GH{B}vjHHLf3tGi9L8}lCam(Jp$R+D*R zVf85Dy}tq0J+9GqpiXUQW~|`l>xg9oW9RB^Ydv&TpS+?tw=Tjsd-B#j=1b3d3tRdw z0PU@GZt_hJ9<)zh6#_cX#$hADLTBB5f~PzF-?y5x-w45T2+IxeEsZL1-rN*C9Y5Cu z4|#A$3cU}kHds?I_)V=moJ^!r=|rNpa&MDX?W@`0tMXOX)ft_gHC2(wH!8I1DqoGS z3XbPgPb!^EcZ8U)2XATnIuFHDhx#mRr&|H*+zp@OekWWU<`A?Xut#0Q~*G12;&79A12oM(`~E}Mld`iF(`m?-ZY zyKI6wA6 e^KYl*yIt=iF+kKVggV*fi6tu$kO Date: Fri, 4 Jul 2025 15:39:17 +0000 Subject: [PATCH 2/2] Fix reserve count, move enum closer to use. --- .../Process/Utility/RegisterFlagsDetector_arm64.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lldb/source/Plugins/Process/Utility/RegisterFlagsDetector_arm64.cpp b/lldb/source/Plugins/Process/Utility/RegisterFlagsDetector_arm64.cpp index cae416a4eccb0..330a24af67c4e 100644 --- a/lldb/source/Plugins/Process/Utility/RegisterFlagsDetector_arm64.cpp +++ b/lldb/source/Plugins/Process/Utility/RegisterFlagsDetector_arm64.cpp @@ -102,14 +102,15 @@ Arm64RegisterFlagsDetector::DetectMTECtrlFields(uint64_t hwcap, uint64_t hwcap2, // to prctl(PR_TAGGED_ADDR_CTRL...). Fields are derived from the defines // used to build the value. + std::vector fields; + fields.reserve(4); + if (hwcap3 & HWCAP3_MTE_STORE_ONLY) + fields.push_back({"STORE_ONLY", 19}); + static const FieldEnum tcf_enum( "tcf_enum", {{0, "TCF_NONE"}, {1, "TCF_SYNC"}, {2, "TCF_ASYNC"}, {3, "TCF_ASYMM"}}); - std::vector fields; - fields.reserve(5); - if (hwcap3 & HWCAP3_MTE_STORE_ONLY) - fields.push_back({"STORE_ONLY", 19}); fields.insert( std::end(fields), {{"TAGS", 3, 18}, // 16 bit bitfield shifted up by PR_MTE_TAG_SHIFT.