]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
arm: Support pac_key_* register operand for MRS/MSR in Armv8.1-M Mainline
authorAndre Vieira <andre.simoesdiasvieira@arm.com>
Wed, 20 Nov 2024 17:15:28 +0000 (17:15 +0000)
committerAndre Vieira <andre.simoesdiasvieira@arm.com>
Wed, 20 Nov 2024 17:15:28 +0000 (17:15 +0000)
Add support for pac_key_[pu]_[0-3](_ns)? register operands for the MRS and MSR
instructions when assembling for Armv8.1-M Mainline, as well as adding the
corresponding support for disassembling instructions that use it.

gas/config/tc-arm.c
gas/testsuite/gas/arm/archv8_1m-pac-msr.d [new file with mode: 0644]
gas/testsuite/gas/arm/archv8_1m-pac-msr.s [new file with mode: 0644]
opcodes/arm-dis.c

index a1bf33a90a9636dee8cdd571a5d560b4358e03b8..67b431c1591c81ffe0f5369dc57c5d7d28e27e17 100644 (file)
@@ -23855,6 +23855,14 @@ static const struct asm_psr v7m_psrs[] =
   {"basepri_max",  0x12}, {"BASEPRI_MAX",  0x12},
   {"faultmask",           0x13}, {"FAULTMASK",    0x13},
   {"control",     0x14}, {"CONTROL",      0x14},
+  {"pac_key_p_0",  0x20}, {"PAC_KEY_P_0",  0x20},
+  {"pac_key_p_1",  0x21}, {"PAC_KEY_P_1",  0x21},
+  {"pac_key_p_2",  0x22}, {"PAC_KEY_P_2",  0x22},
+  {"pac_key_p_3",  0x23}, {"PAC_KEY_P_3",  0x23},
+  {"pac_key_u_0",  0x24}, {"PAC_KEY_U_0",  0x24},
+  {"pac_key_u_1",  0x25}, {"PAC_KEY_U_1",  0x25},
+  {"pac_key_u_2",  0x26}, {"PAC_KEY_U_2",  0x26},
+  {"pac_key_u_3",  0x27}, {"PAC_KEY_U_3",  0x27},
   {"msp_ns",      0x88}, {"MSP_NS",       0x88},
   {"psp_ns",      0x89}, {"PSP_NS",       0x89},
   {"msplim_ns",           0x8a}, {"MSPLIM_NS",    0x8a},
@@ -23863,7 +23871,15 @@ static const struct asm_psr v7m_psrs[] =
   {"basepri_ns",   0x91}, {"BASEPRI_NS",   0x91},
   {"faultmask_ns", 0x93}, {"FAULTMASK_NS", 0x93},
   {"control_ns",   0x94}, {"CONTROL_NS",   0x94},
-  {"sp_ns",       0x98}, {"SP_NS",        0x98 }
+  {"sp_ns",       0x98}, {"SP_NS",        0x98},
+  {"pac_key_p_0_ns",  0xa0}, {"PAC_KEY_P_0_NS",  0xa0},
+  {"pac_key_p_1_ns",  0xa1}, {"PAC_KEY_P_1_NS",  0xa1},
+  {"pac_key_p_2_ns",  0xa2}, {"PAC_KEY_P_2_NS",  0xa2},
+  {"pac_key_p_3_ns",  0xa3}, {"PAC_KEY_P_3_NS",  0xa3},
+  {"pac_key_u_0_ns",  0xa4}, {"PAC_KEY_U_0_NS",  0xa4},
+  {"pac_key_u_1_ns",  0xa5}, {"PAC_KEY_U_1_NS",  0xa5},
+  {"pac_key_u_2_ns",  0xa6}, {"PAC_KEY_U_2_NS",  0xa6},
+  {"pac_key_u_3_ns",  0xa7}, {"PAC_KEY_U_3_NS",  0xa7},
 };
 
 /* Table of all shift-in-operand names.         */
diff --git a/gas/testsuite/gas/arm/archv8_1m-pac-msr.d b/gas/testsuite/gas/arm/archv8_1m-pac-msr.d
new file mode 100644 (file)
index 0000000..187799b
--- /dev/null
@@ -0,0 +1,137 @@
+#name: ARMv8.1-M Mainline PACBTI Extension MSR/MRS instructions
+#as: -march=armv8.1-m.main+pacbti
+#objdump: -dr --prefix-addresses --show-raw-insn
+#skip: *-*-pe *-wince-*
+
+
+.*: +file format .*arm.*
+
+Disassembly of section .text:
+[^>]*> f380 8820       msr     PAC_KEY_P_0, r0
+[^>]*> f3ef 8020       mrs     r0, PAC_KEY_P_0
+[^>]*> f380 8821       msr     PAC_KEY_P_1, r0
+[^>]*> f3ef 8021       mrs     r0, PAC_KEY_P_1
+[^>]*> f380 8822       msr     PAC_KEY_P_2, r0
+[^>]*> f3ef 8022       mrs     r0, PAC_KEY_P_2
+[^>]*> f380 8823       msr     PAC_KEY_P_3, r0
+[^>]*> f3ef 8023       mrs     r0, PAC_KEY_P_3
+[^>]*> f389 8820       msr     PAC_KEY_P_0, r9
+[^>]*> f3ef 8920       mrs     r9, PAC_KEY_P_0
+[^>]*> f389 8821       msr     PAC_KEY_P_1, r9
+[^>]*> f3ef 8921       mrs     r9, PAC_KEY_P_1
+[^>]*> f389 8822       msr     PAC_KEY_P_2, r9
+[^>]*> f3ef 8922       mrs     r9, PAC_KEY_P_2
+[^>]*> f389 8823       msr     PAC_KEY_P_3, r9
+[^>]*> f3ef 8923       mrs     r9, PAC_KEY_P_3
+[^>]*> f380 8820       msr     PAC_KEY_P_0, r0
+[^>]*> f3ef 8020       mrs     r0, PAC_KEY_P_0
+[^>]*> f380 8821       msr     PAC_KEY_P_1, r0
+[^>]*> f3ef 8021       mrs     r0, PAC_KEY_P_1
+[^>]*> f380 8822       msr     PAC_KEY_P_2, r0
+[^>]*> f3ef 8022       mrs     r0, PAC_KEY_P_2
+[^>]*> f380 8823       msr     PAC_KEY_P_3, r0
+[^>]*> f3ef 8023       mrs     r0, PAC_KEY_P_3
+[^>]*> f389 8820       msr     PAC_KEY_P_0, r9
+[^>]*> f3ef 8920       mrs     r9, PAC_KEY_P_0
+[^>]*> f389 8821       msr     PAC_KEY_P_1, r9
+[^>]*> f3ef 8921       mrs     r9, PAC_KEY_P_1
+[^>]*> f389 8822       msr     PAC_KEY_P_2, r9
+[^>]*> f3ef 8922       mrs     r9, PAC_KEY_P_2
+[^>]*> f389 8823       msr     PAC_KEY_P_3, r9
+[^>]*> f3ef 8923       mrs     r9, PAC_KEY_P_3
+[^>]*> f380 8824       msr     PAC_KEY_U_0, r0
+[^>]*> f3ef 8024       mrs     r0, PAC_KEY_U_0
+[^>]*> f380 8825       msr     PAC_KEY_U_1, r0
+[^>]*> f3ef 8025       mrs     r0, PAC_KEY_U_1
+[^>]*> f380 8826       msr     PAC_KEY_U_2, r0
+[^>]*> f3ef 8026       mrs     r0, PAC_KEY_U_2
+[^>]*> f380 8827       msr     PAC_KEY_U_3, r0
+[^>]*> f3ef 8027       mrs     r0, PAC_KEY_U_3
+[^>]*> f389 8824       msr     PAC_KEY_U_0, r9
+[^>]*> f3ef 8924       mrs     r9, PAC_KEY_U_0
+[^>]*> f389 8825       msr     PAC_KEY_U_1, r9
+[^>]*> f3ef 8925       mrs     r9, PAC_KEY_U_1
+[^>]*> f389 8826       msr     PAC_KEY_U_2, r9
+[^>]*> f3ef 8926       mrs     r9, PAC_KEY_U_2
+[^>]*> f389 8827       msr     PAC_KEY_U_3, r9
+[^>]*> f3ef 8927       mrs     r9, PAC_KEY_U_3
+[^>]*> f380 8824       msr     PAC_KEY_U_0, r0
+[^>]*> f3ef 8024       mrs     r0, PAC_KEY_U_0
+[^>]*> f380 8825       msr     PAC_KEY_U_1, r0
+[^>]*> f3ef 8025       mrs     r0, PAC_KEY_U_1
+[^>]*> f380 8826       msr     PAC_KEY_U_2, r0
+[^>]*> f3ef 8026       mrs     r0, PAC_KEY_U_2
+[^>]*> f380 8827       msr     PAC_KEY_U_3, r0
+[^>]*> f3ef 8027       mrs     r0, PAC_KEY_U_3
+[^>]*> f389 8824       msr     PAC_KEY_U_0, r9
+[^>]*> f3ef 8924       mrs     r9, PAC_KEY_U_0
+[^>]*> f389 8825       msr     PAC_KEY_U_1, r9
+[^>]*> f3ef 8925       mrs     r9, PAC_KEY_U_1
+[^>]*> f389 8826       msr     PAC_KEY_U_2, r9
+[^>]*> f3ef 8926       mrs     r9, PAC_KEY_U_2
+[^>]*> f389 8827       msr     PAC_KEY_U_3, r9
+[^>]*> f3ef 8927       mrs     r9, PAC_KEY_U_3
+[^>]*> f380 88a0       msr     PAC_KEY_P_0_NS, r0
+[^>]*> f3ef 80a0       mrs     r0, PAC_KEY_P_0_NS
+[^>]*> f380 88a1       msr     PAC_KEY_P_1_NS, r0
+[^>]*> f3ef 80a1       mrs     r0, PAC_KEY_P_1_NS
+[^>]*> f380 88a2       msr     PAC_KEY_P_2_NS, r0
+[^>]*> f3ef 80a2       mrs     r0, PAC_KEY_P_2_NS
+[^>]*> f380 88a3       msr     PAC_KEY_P_3_NS, r0
+[^>]*> f3ef 80a3       mrs     r0, PAC_KEY_P_3_NS
+[^>]*> f389 88a0       msr     PAC_KEY_P_0_NS, r9
+[^>]*> f3ef 89a0       mrs     r9, PAC_KEY_P_0_NS
+[^>]*> f389 88a1       msr     PAC_KEY_P_1_NS, r9
+[^>]*> f3ef 89a1       mrs     r9, PAC_KEY_P_1_NS
+[^>]*> f389 88a2       msr     PAC_KEY_P_2_NS, r9
+[^>]*> f3ef 89a2       mrs     r9, PAC_KEY_P_2_NS
+[^>]*> f389 88a3       msr     PAC_KEY_P_3_NS, r9
+[^>]*> f3ef 89a3       mrs     r9, PAC_KEY_P_3_NS
+[^>]*> f380 88a0       msr     PAC_KEY_P_0_NS, r0
+[^>]*> f3ef 80a0       mrs     r0, PAC_KEY_P_0_NS
+[^>]*> f380 88a1       msr     PAC_KEY_P_1_NS, r0
+[^>]*> f3ef 80a1       mrs     r0, PAC_KEY_P_1_NS
+[^>]*> f380 88a2       msr     PAC_KEY_P_2_NS, r0
+[^>]*> f3ef 80a2       mrs     r0, PAC_KEY_P_2_NS
+[^>]*> f380 88a3       msr     PAC_KEY_P_3_NS, r0
+[^>]*> f3ef 80a3       mrs     r0, PAC_KEY_P_3_NS
+[^>]*> f389 88a0       msr     PAC_KEY_P_0_NS, r9
+[^>]*> f3ef 89a0       mrs     r9, PAC_KEY_P_0_NS
+[^>]*> f389 88a1       msr     PAC_KEY_P_1_NS, r9
+[^>]*> f3ef 89a1       mrs     r9, PAC_KEY_P_1_NS
+[^>]*> f389 88a2       msr     PAC_KEY_P_2_NS, r9
+[^>]*> f3ef 89a2       mrs     r9, PAC_KEY_P_2_NS
+[^>]*> f389 88a3       msr     PAC_KEY_P_3_NS, r9
+[^>]*> f3ef 89a3       mrs     r9, PAC_KEY_P_3_NS
+[^>]*> f380 88a4       msr     PAC_KEY_U_0_NS, r0
+[^>]*> f3ef 80a4       mrs     r0, PAC_KEY_U_0_NS
+[^>]*> f380 88a5       msr     PAC_KEY_U_1_NS, r0
+[^>]*> f3ef 80a5       mrs     r0, PAC_KEY_U_1_NS
+[^>]*> f380 88a6       msr     PAC_KEY_U_2_NS, r0
+[^>]*> f3ef 80a6       mrs     r0, PAC_KEY_U_2_NS
+[^>]*> f380 88a7       msr     PAC_KEY_U_3_NS, r0
+[^>]*> f3ef 80a7       mrs     r0, PAC_KEY_U_3_NS
+[^>]*> f389 88a4       msr     PAC_KEY_U_0_NS, r9
+[^>]*> f3ef 89a4       mrs     r9, PAC_KEY_U_0_NS
+[^>]*> f389 88a5       msr     PAC_KEY_U_1_NS, r9
+[^>]*> f3ef 89a5       mrs     r9, PAC_KEY_U_1_NS
+[^>]*> f389 88a6       msr     PAC_KEY_U_2_NS, r9
+[^>]*> f3ef 89a6       mrs     r9, PAC_KEY_U_2_NS
+[^>]*> f389 88a7       msr     PAC_KEY_U_3_NS, r9
+[^>]*> f3ef 89a7       mrs     r9, PAC_KEY_U_3_NS
+[^>]*> f380 88a4       msr     PAC_KEY_U_0_NS, r0
+[^>]*> f3ef 80a4       mrs     r0, PAC_KEY_U_0_NS
+[^>]*> f380 88a5       msr     PAC_KEY_U_1_NS, r0
+[^>]*> f3ef 80a5       mrs     r0, PAC_KEY_U_1_NS
+[^>]*> f380 88a6       msr     PAC_KEY_U_2_NS, r0
+[^>]*> f3ef 80a6       mrs     r0, PAC_KEY_U_2_NS
+[^>]*> f380 88a7       msr     PAC_KEY_U_3_NS, r0
+[^>]*> f3ef 80a7       mrs     r0, PAC_KEY_U_3_NS
+[^>]*> f389 88a4       msr     PAC_KEY_U_0_NS, r9
+[^>]*> f3ef 89a4       mrs     r9, PAC_KEY_U_0_NS
+[^>]*> f389 88a5       msr     PAC_KEY_U_1_NS, r9
+[^>]*> f3ef 89a5       mrs     r9, PAC_KEY_U_1_NS
+[^>]*> f389 88a6       msr     PAC_KEY_U_2_NS, r9
+[^>]*> f3ef 89a6       mrs     r9, PAC_KEY_U_2_NS
+[^>]*> f389 88a7       msr     PAC_KEY_U_3_NS, r9
+[^>]*> f3ef 89a7       mrs     r9, PAC_KEY_U_3_NS
diff --git a/gas/testsuite/gas/arm/archv8_1m-pac-msr.s b/gas/testsuite/gas/arm/archv8_1m-pac-msr.s
new file mode 100644 (file)
index 0000000..11221f4
--- /dev/null
@@ -0,0 +1,77 @@
+.macro rw_sys_reg sys_reg reg
+msr \sys_reg, \reg
+mrs \reg, \sys_reg
+.endm
+
+rw_sys_reg sys_reg=pac_key_p_0 reg=r0
+rw_sys_reg sys_reg=pac_key_p_1 reg=r0
+rw_sys_reg sys_reg=pac_key_p_2 reg=r0
+rw_sys_reg sys_reg=pac_key_p_3 reg=r0
+rw_sys_reg sys_reg=pac_key_p_0 reg=r9
+rw_sys_reg sys_reg=pac_key_p_1 reg=r9
+rw_sys_reg sys_reg=pac_key_p_2 reg=r9
+rw_sys_reg sys_reg=pac_key_p_3 reg=r9
+
+rw_sys_reg sys_reg=PAC_KEY_P_0 reg=r0
+rw_sys_reg sys_reg=PAC_KEY_P_1 reg=r0
+rw_sys_reg sys_reg=PAC_KEY_P_2 reg=r0
+rw_sys_reg sys_reg=PAC_KEY_P_3 reg=r0
+rw_sys_reg sys_reg=PAC_KEY_P_0 reg=r9
+rw_sys_reg sys_reg=PAC_KEY_P_1 reg=r9
+rw_sys_reg sys_reg=PAC_KEY_P_2 reg=r9
+rw_sys_reg sys_reg=PAC_KEY_P_3 reg=r9
+
+rw_sys_reg sys_reg=pac_key_u_0 reg=r0
+rw_sys_reg sys_reg=pac_key_u_1 reg=r0
+rw_sys_reg sys_reg=pac_key_u_2 reg=r0
+rw_sys_reg sys_reg=pac_key_u_3 reg=r0
+rw_sys_reg sys_reg=pac_key_u_0 reg=r9
+rw_sys_reg sys_reg=pac_key_u_1 reg=r9
+rw_sys_reg sys_reg=pac_key_u_2 reg=r9
+rw_sys_reg sys_reg=pac_key_u_3 reg=r9
+
+rw_sys_reg sys_reg=PAC_KEY_U_0 reg=r0
+rw_sys_reg sys_reg=PAC_KEY_U_1 reg=r0
+rw_sys_reg sys_reg=PAC_KEY_U_2 reg=r0
+rw_sys_reg sys_reg=PAC_KEY_U_3 reg=r0
+rw_sys_reg sys_reg=PAC_KEY_U_0 reg=r9
+rw_sys_reg sys_reg=PAC_KEY_U_1 reg=r9
+rw_sys_reg sys_reg=PAC_KEY_U_2 reg=r9
+rw_sys_reg sys_reg=PAC_KEY_U_3 reg=r9
+
+rw_sys_reg sys_reg=pac_key_p_0_ns reg=r0
+rw_sys_reg sys_reg=pac_key_p_1_ns reg=r0
+rw_sys_reg sys_reg=pac_key_p_2_ns reg=r0
+rw_sys_reg sys_reg=pac_key_p_3_ns reg=r0
+rw_sys_reg sys_reg=pac_key_p_0_ns reg=r9
+rw_sys_reg sys_reg=pac_key_p_1_ns reg=r9
+rw_sys_reg sys_reg=pac_key_p_2_ns reg=r9
+rw_sys_reg sys_reg=pac_key_p_3_ns reg=r9
+
+rw_sys_reg sys_reg=PAC_KEY_P_0_NS reg=r0
+rw_sys_reg sys_reg=PAC_KEY_P_1_NS reg=r0
+rw_sys_reg sys_reg=PAC_KEY_P_2_NS reg=r0
+rw_sys_reg sys_reg=PAC_KEY_P_3_NS reg=r0
+rw_sys_reg sys_reg=PAC_KEY_P_0_NS reg=r9
+rw_sys_reg sys_reg=PAC_KEY_P_1_NS reg=r9
+rw_sys_reg sys_reg=PAC_KEY_P_2_NS reg=r9
+rw_sys_reg sys_reg=PAC_KEY_P_3_NS reg=r9
+
+rw_sys_reg sys_reg=pac_key_u_0_ns reg=r0
+rw_sys_reg sys_reg=pac_key_u_1_ns reg=r0
+rw_sys_reg sys_reg=pac_key_u_2_ns reg=r0
+rw_sys_reg sys_reg=pac_key_u_3_ns reg=r0
+rw_sys_reg sys_reg=pac_key_u_0_ns reg=r9
+rw_sys_reg sys_reg=pac_key_u_1_ns reg=r9
+rw_sys_reg sys_reg=pac_key_u_2_ns reg=r9
+rw_sys_reg sys_reg=pac_key_u_3_ns reg=r9
+
+rw_sys_reg sys_reg=PAC_KEY_U_0_NS reg=r0
+rw_sys_reg sys_reg=PAC_KEY_U_1_NS reg=r0
+rw_sys_reg sys_reg=PAC_KEY_U_2_NS reg=r0
+rw_sys_reg sys_reg=PAC_KEY_U_3_NS reg=r0
+rw_sys_reg sys_reg=PAC_KEY_U_0_NS reg=r9
+rw_sys_reg sys_reg=PAC_KEY_U_1_NS reg=r9
+rw_sys_reg sys_reg=PAC_KEY_U_2_NS reg=r9
+rw_sys_reg sys_reg=PAC_KEY_U_3_NS reg=r9
+
index a83cbbdf8c21565124723ce6f81179ad4742ded3..a3aa68031a7eb7f3709a7a0f000ca85bd6737a8e 100644 (file)
@@ -5280,7 +5280,7 @@ is_mve_okay_in_it (enum mve_instructions matched_insn)
 }
 
 static bool
-is_mve_architecture (struct disassemble_info *info)
+is_v81m_architecture (struct disassemble_info *info)
 {
   struct arm_private_data *private_data = info->private_data;
   arm_feature_set allowed_arches = private_data->features;
@@ -10999,6 +10999,14 @@ psr_name (int regno)
     case 0x12: return "BASEPRI_MAX";
     case 0x13: return "FAULTMASK";
     case 0x14: return "CONTROL";
+    case 0x20: return "PAC_KEY_P_0";
+    case 0x21: return "PAC_KEY_P_1";
+    case 0x22: return "PAC_KEY_P_2";
+    case 0x23: return "PAC_KEY_P_3";
+    case 0x24: return "PAC_KEY_U_0";
+    case 0x25: return "PAC_KEY_U_1";
+    case 0x26: return "PAC_KEY_U_2";
+    case 0x27: return "PAC_KEY_U_3";
     case 0x88: return "MSP_NS";
     case 0x89: return "PSP_NS";
     case 0x8a: return "MSPLIM_NS";
@@ -11008,6 +11016,14 @@ psr_name (int regno)
     case 0x93: return "FAULTMASK_NS";
     case 0x94: return "CONTROL_NS";
     case 0x98: return "SP_NS";
+    case 0xa0: return "PAC_KEY_P_0_NS";
+    case 0xa1: return "PAC_KEY_P_1_NS";
+    case 0xa2: return "PAC_KEY_P_2_NS";
+    case 0xa3: return "PAC_KEY_P_3_NS";
+    case 0xa4: return "PAC_KEY_U_0_NS";
+    case 0xa5: return "PAC_KEY_U_1_NS";
+    case 0xa6: return "PAC_KEY_U_2_NS";
+    case 0xa7: return "PAC_KEY_U_3_NS";
     default: return "<unknown>";
     }
 }
@@ -11020,7 +11036,7 @@ print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
   const struct opcode32 *insn;
   void *stream = info->stream;
   fprintf_styled_ftype func = info->fprintf_styled_func;
-  bool is_mve = is_mve_architecture (info);
+  bool is_mve = is_v81m_architecture (info);
   enum disassembler_style base_style = dis_style_mnemonic;
   enum disassembler_style old_base_style = base_style;
 
@@ -11671,6 +11687,10 @@ print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
                    if (given & 0x100)
                      func (stream, dis_style_register, "c");
                  }
+               else if (is_v81m_architecture (info))
+                 func (stream, dis_style_register, "%s",
+                       psr_name (given & 0xff));
+
                else if ((given & 0x20) == 0x20)
                  {
                    char const* name;
@@ -11694,8 +11714,11 @@ print_insn_thumb32 (bfd_vma pc, struct disassemble_info *info, long given)
                break;
 
              case 'D':
-               if (((given & 0xff) == 0)
-                   || ((given & 0x20) == 0x20))
+               if (is_v81m_architecture (info))
+                 func (stream, dis_style_register, "%s",
+                       psr_name (given & 0xff));
+               else if (((given & 0xff) == 0)
+                        || ((given & 0x20) == 0x20))
                  {
                    char const* name;
                    unsigned sm = (given & 0xf0000) >> 16;