[AArch64] Armv8.4-A: Virtualization system registers
authorSjoerd Meijer <sjoerd.meijer@arm.com>
Fri, 29 Jun 2018 11:03:15 +0000 (11:03 +0000)
committerSjoerd Meijer <sjoerd.meijer@arm.com>
Fri, 29 Jun 2018 11:03:15 +0000 (11:03 +0000)
This adds the Secure EL2 extension.

Differential Revision: https://reviews.llvm.org/D48711

llvm-svn: 335962

llvm/lib/Target/AArch64/AArch64SystemOperands.td
llvm/test/MC/AArch64/armv8.4a-virt.s [new file with mode: 0644]
llvm/test/MC/Disassembler/AArch64/armv8.4a-virt.txt [new file with mode: 0644]

index 9de12ef..7390554 100644 (file)
@@ -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 (file)
index 0000000..43c320e
--- /dev/null
@@ -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 (file)
index 0000000..7d14c9e
--- /dev/null
@@ -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