This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 2/2][ARM][gas] Add support for ARMv8.1 PAN extension.


The ARMv8.1 architecture introduces the Aarch32 Privileged Access Never
extension. This adds a new instruction SETPAN, with ARM and Thumb encodings to
write to a new CPSR.PAN bit.

This patch adds support to GAS for the new instructions under a new ARM
extension "pan".

Tested for arm-none-linux-gnueabihf with check-binutils and check-gas.

Ok for trunk?
Matthew

gas/
2015-05-21  Matthew Wahab  <matthew.wahab@arm.com>

	* config/tc-arm.c (arm_ext_pan): New.
	(do_setpan): New, encode an ARM SETPAN instruction.
	(do_t_setpan): New, encode a Thumb SETPAN instruction.
	(insns): Add "setpan".
	(arm_extensions): Add "pan".
	* doc/c-arm.texi (ARM Options): Add "pan" to list of -mcpu
	processor extensions.

gas/testsuite/
2015-05-21  Matthew Wahab  <matthew.wahab@arm.com>

	* gas/arm/armv8-a+pan.d: New.
	gas/arm/armv8-a+pan.s: New.

diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 683774f..ece5ebc 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -207,6 +207,7 @@ static const arm_feature_set arm_ext_sec = ARM_FEATURE_CORE_LOW (ARM_EXT_SEC);
 static const arm_feature_set arm_ext_os = ARM_FEATURE_CORE_LOW (ARM_EXT_OS);
 static const arm_feature_set arm_ext_adiv = ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV);
 static const arm_feature_set arm_ext_virt = ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT);
+static const arm_feature_set arm_ext_pan = ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN);
 
 static const arm_feature_set arm_arch_any = ARM_ANY;
 static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1, -1);
@@ -9181,6 +9182,24 @@ do_swi (void)
   inst.reloc.pc_rel = 0;
 }
 
+static void
+do_setpan (void)
+{
+  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_pan),
+	      _("selected processor does not support SETPAN instruction"));
+
+  inst.instruction |= ((inst.operands[0].imm & 1) << 9);
+}
+
+static void
+do_t_setpan (void)
+{
+  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_pan),
+	      _("selected processor does not support SETPAN instruction"));
+
+  inst.instruction |= (inst.operands[0].imm << 3);
+}
+
 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
    SMLAxy{cond} Rd,Rm,Rs,Rn
    SMLAWy{cond} Rd,Rm,Rs,Rn
@@ -18884,6 +18903,13 @@ static const struct asm_opcode insns[] =
  TCE("hvc",	1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
  TCE("eret",	160006e, f3de8f00, 0, (), noargs, noargs),
 
+#undef	ARM_VARIANT
+#define	ARM_VARIANT    & arm_ext_pan
+#undef	THUMB_VARIANT
+#define	THUMB_VARIANT  & arm_ext_pan
+
+ TUF("setpan",	1100000, b610, 1, (I7), setpan, t_setpan),
+
 #undef  ARM_VARIANT
 #define ARM_VARIANT    & arm_ext_v6t2
 #undef  THUMB_VARIANT
@@ -24662,6 +24688,9 @@ static const struct arm_option_extension_value_table arm_extensions[] =
   ARM_EXT_OPT ("os",	ARM_FEATURE_CORE_LOW (ARM_EXT_OS),
 			ARM_FEATURE_CORE_LOW (ARM_EXT_OS),
 				   ARM_FEATURE_CORE_LOW (ARM_EXT_V6M)),
+  ARM_EXT_OPT ("pan",	ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),
+			ARM_FEATURE (ARM_EXT_V8, ARM_EXT2_PAN, 0),
+			ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
   ARM_EXT_OPT ("sec",	ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
 			ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
 				   ARM_FEATURE_CORE_LOW (ARM_EXT_V6K | ARM_EXT_V7A)),
diff --git a/gas/doc/c-arm.texi b/gas/doc/c-arm.texi
index d31ba02..85ff20d 100644
--- a/gas/doc/c-arm.texi
+++ b/gas/doc/c-arm.texi
@@ -179,6 +179,7 @@ architectures),
 @code{simd} (Advanced SIMD Extensions for v8-A architecture, implies @code{fp}),
 @code{virt} (Virtualization Extensions for v7-A architecture, implies
 @code{idiv}),
+@code{pan} (Priviliged Access Never Extensions for v8-A architecture)
 and
 @code{xscale}.
 
diff --git a/gas/testsuite/gas/arm/armv8-a+pan.d b/gas/testsuite/gas/arm/armv8-a+pan.d
new file mode 100644
index 0000000..2005260
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8-a+pan.d
@@ -0,0 +1,11 @@
+#name: Valid v8-a+pan
+#objdump: -dr --prefix-addresses --show-raw-insn
+
+.*: +file format .*arm.*
+
+
+Disassembly of section .text:
+0[0-9a-f]+ <.*> f1100000 	setpan	#0
+0[0-9a-f]+ <.*> f1100200 	setpan	#1
+0[0-9a-f]+ <.*> b610      	setpan	#0
+0[0-9a-f]+ <.*> b618      	setpan	#1
\ No newline at end of file
diff --git a/gas/testsuite/gas/arm/armv8-a+pan.s b/gas/testsuite/gas/arm/armv8-a+pan.s
new file mode 100644
index 0000000..f2ed60b
--- /dev/null
+++ b/gas/testsuite/gas/arm/armv8-a+pan.s
@@ -0,0 +1,14 @@
+	.syntax unified
+	.arch armv8-a
+	.arch_extension pan
+
+A1:     
+	.arm
+        setpan #0
+        setpan #1
+
+T1:     
+        .thumb
+        setpan #0
+        setpan #1
+


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]