From: Andre Vieira Date: Wed, 20 Nov 2024 17:15:28 +0000 (+0000) Subject: arm: Support pac_key_* register operand for MRS/MSR in Armv8.1-M Mainline X-Git-Tag: gdb-16-branchpoint~381 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1fb5ccd6bfc140c0f542cdd678e5888e18599e59;p=thirdparty%2Fbinutils-gdb.git arm: Support pac_key_* register operand for MRS/MSR in Armv8.1-M Mainline 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. --- diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index a1bf33a90a9..67b431c1591 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -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 index 00000000000..187799bbb03 --- /dev/null +++ b/gas/testsuite/gas/arm/archv8_1m-pac-msr.d @@ -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 index 00000000000..11221f473b1 --- /dev/null +++ b/gas/testsuite/gas/arm/archv8_1m-pac-msr.s @@ -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 + diff --git a/opcodes/arm-dis.c b/opcodes/arm-dis.c index a83cbbdf8c2..a3aa68031a7 100644 --- a/opcodes/arm-dis.c +++ b/opcodes/arm-dis.c @@ -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 ""; } } @@ -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;