summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSjoerd Meijer <sjoerd.meijer@arm.com>2018-06-29 11:03:15 +0000
committerSjoerd Meijer <sjoerd.meijer@arm.com>2018-06-29 11:03:15 +0000
commit3b599d75d508409b1ae92ba26d7fcee3c284abe7 (patch)
treedddd17b25fa12d962abd7c1d99fcb9deebf26c78
parent48c9f451aa4deaa6477ccddbecefcc34b20621cd (diff)
downloadbcm5719-llvm-3b599d75d508409b1ae92ba26d7fcee3c284abe7.tar.gz
bcm5719-llvm-3b599d75d508409b1ae92ba26d7fcee3c284abe7.zip
[AArch64] Armv8.4-A: Virtualization system registers
This adds the Secure EL2 extension. Differential Revision: https://reviews.llvm.org/D48711 llvm-svn: 335962
-rw-r--r--llvm/lib/Target/AArch64/AArch64SystemOperands.td22
-rw-r--r--llvm/test/MC/AArch64/armv8.4a-virt.s36
-rw-r--r--llvm/test/MC/Disassembler/AArch64/armv8.4a-virt.txt39
3 files changed, 97 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64SystemOperands.td b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
index 9de12efc2c4..7390554ad0f 100644
--- a/llvm/lib/Target/AArch64/AArch64SystemOperands.td
+++ b/llvm/lib/Target/AArch64/AArch64SystemOperands.td
@@ -1118,6 +1118,28 @@ def : RWSysReg<"APGAKeyLo_EL1", 0b11, 0b000, 0b0010, 0b0011, 0b000>;
def : RWSysReg<"APGAKeyHi_EL1", 0b11, 0b000, 0b0010, 0b0011, 0b001>;
}
+let Requires = [{ {AArch64::HasV8_4aOps} }] in {
+
+// v8.4a "Virtualization secure second stage translation" registers
+// Op0 Op1 CRn CRm Op2
+def : RWSysReg<"VSTCR_EL2" , 0b11, 0b100, 0b0010, 0b0110, 0b010>;
+def : RWSysReg<"VSTTBR_EL2", 0b11, 0b100, 0b0010, 0b0110, 0b000>;
+
+// v8.4a "Virtualization timer" registers
+// Op0 Op1 CRn CRm Op2
+def : RWSysReg<"CNTHVS_TVAL_EL2", 0b11, 0b100, 0b1110, 0b0100, 0b000>;
+def : RWSysReg<"CNTHVS_CVAL_EL2", 0b11, 0b100, 0b1110, 0b0100, 0b010>;
+def : RWSysReg<"CNTHVS_CTL_EL2", 0b11, 0b100, 0b1110, 0b0100, 0b001>;
+def : RWSysReg<"CNTHPS_TVAL_EL2", 0b11, 0b100, 0b1110, 0b0101, 0b000>;
+def : RWSysReg<"CNTHPS_CVAL_EL2", 0b11, 0b100, 0b1110, 0b0101, 0b010>;
+def : RWSysReg<"CNTHPS_CTL_EL2", 0b11, 0b100, 0b1110, 0b0101, 0b001>;
+
+// v8.4a "Virtualization debug state" registers
+// Op0 Op1 CRn CRm Op2
+def : RWSysReg<"SDER32_EL2", 0b11, 0b100, 0b0001, 0b0011, 0b001>;
+
+} // HasV8_4aOps
+
// Cyclone specific system registers
// Op0 Op1 CRn CRm Op2
let Requires = [{ {AArch64::ProcCyclone} }] in
diff --git a/llvm/test/MC/AArch64/armv8.4a-virt.s b/llvm/test/MC/AArch64/armv8.4a-virt.s
new file mode 100644
index 00000000000..43c320e274f
--- /dev/null
+++ b/llvm/test/MC/AArch64/armv8.4a-virt.s
@@ -0,0 +1,36 @@
+// RUN: llvm-mc -triple aarch64-none-linux-gnu -show-encoding -mattr=+v8.4a < %s | FileCheck %s
+// RUN: not llvm-mc -triple aarch64-none-linux-gnu -show-encoding -mattr=-v8.4a < %s 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR
+
+//------------------------------------------------------------------------------
+// Virtualization Enhancements
+//------------------------------------------------------------------------------
+
+ msr VSTCR_EL2, x0
+ msr VSTTBR_EL2, x0
+ msr SDER32_EL2, x12
+ msr CNTHVS_TVAL_EL2, x0
+ msr CNTHVS_CVAL_EL2, x0
+ msr CNTHVS_CTL_EL2, x0
+ msr CNTHPS_TVAL_EL2, x0
+ msr CNTHPS_CVAL_EL2, x0
+ msr CNTHPS_CTL_EL2, x0
+
+//CHECK: msr VSTCR_EL2, x0 // encoding: [0x40,0x26,0x1c,0xd5]
+//CHECK: msr VSTTBR_EL2, x0 // encoding: [0x00,0x26,0x1c,0xd5]
+//CHECK: msr SDER32_EL2, x12 // encoding: [0x2c,0x13,0x1c,0xd5]
+//CHECK: msr CNTHVS_TVAL_EL2, x0 // encoding: [0x00,0xe4,0x1c,0xd5]
+//CHECK: msr CNTHVS_CVAL_EL2, x0 // encoding: [0x40,0xe4,0x1c,0xd5]
+//CHECK: msr CNTHVS_CTL_EL2, x0 // encoding: [0x20,0xe4,0x1c,0xd5]
+//CHECK: msr CNTHPS_TVAL_EL2, x0 // encoding: [0x00,0xe5,0x1c,0xd5]
+//CHECK: msr CNTHPS_CVAL_EL2, x0 // encoding: [0x40,0xe5,0x1c,0xd5]
+//CHECK: msr CNTHPS_CTL_EL2, x0 // encoding: [0x20,0xe5,0x1c,0xd5]
+
+//CHECK-ERROR: error: expected writable system register or pstate
+//CHECK-ERROR: error: expected writable system register or pstate
+//CHECK-ERROR: error: expected writable system register or pstate
+//CHECK-ERROR: error: expected writable system register or pstate
+//CHECK-ERROR: error: expected writable system register or pstate
+//CHECK-ERROR: error: expected writable system register or pstate
+//CHECK-ERROR: error: expected writable system register or pstate
+//CHECK-ERROR: error: expected writable system register or pstate
+//CHECK-ERROR: error: expected writable system register or pstate
diff --git a/llvm/test/MC/Disassembler/AArch64/armv8.4a-virt.txt b/llvm/test/MC/Disassembler/AArch64/armv8.4a-virt.txt
new file mode 100644
index 00000000000..7d14c9e8d9e
--- /dev/null
+++ b/llvm/test/MC/Disassembler/AArch64/armv8.4a-virt.txt
@@ -0,0 +1,39 @@
+# RUN: llvm-mc -triple aarch64-none-linux-gnu -mattr=+v8.4a --disassemble < %s | FileCheck %s
+
+0x40,0x26,0x1c,0xd5
+0x40,0x26,0x3c,0xd5
+0x00,0x26,0x1c,0xd5
+0x00,0x26,0x3c,0xd5
+0x2c,0x13,0x1c,0xd5
+0x2c,0x13,0x3c,0xd5
+0x00,0xe4,0x1c,0xd5
+0x00,0xe4,0x3c,0xd5
+0x40,0xe4,0x1c,0xd5
+0x40,0xe4,0x3c,0xd5
+0x20,0xe4,0x1c,0xd5
+0x20,0xe4,0x3c,0xd5
+0x00,0xe5,0x1c,0xd5
+0x00,0xe5,0x3c,0xd5
+0x40,0xe5,0x1c,0xd5
+0x40,0xe5,0x3c,0xd5
+0x20,0xe5,0x1c,0xd5
+0x20,0xe5,0x3c,0xd5
+
+#CHECK: msr VSTCR_EL2, x0
+#CHECK: mrs x0, VSTCR_EL2
+#CHECK: msr VSTTBR_EL2, x0
+#CHECK: mrs x0, VSTTBR_EL2
+#CHECK: msr SDER32_EL2, x12
+#CHECK: mrs x12, SDER32_EL2
+#CHECK: msr CNTHVS_TVAL_EL2, x0
+#CHECK: mrs x0, CNTHVS_TVAL_EL2
+#CHECK: msr CNTHVS_CVAL_EL2, x0
+#CHECK: mrs x0, CNTHVS_CVAL_EL2
+#CHECK: msr CNTHVS_CTL_EL2, x0
+#CHECK: mrs x0, CNTHVS_CTL_EL2
+#CHECK: msr CNTHPS_TVAL_EL2, x0
+#CHECK: mrs x0, CNTHPS_TVAL_EL2
+#CHECK: msr CNTHPS_CVAL_EL2, x0
+#CHECK: mrs x0, CNTHPS_CVAL_EL2
+#CHECK: msr CNTHPS_CTL_EL2, x0
+#CHECK: mrs x0, CNTHPS_CTL_EL2
OpenPOWER on IntegriCloud