aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2019-06-13 15:16:39 +0100
committerPeter Maydell <peter.maydell@linaro.org>2019-06-13 15:16:39 +0100
commit650a379d505bf558bcb41124bc6c951a76cbc113 (patch)
tree3454955dea2cf8f5cd379d906b6f82a0126e04b0 /tests
parent785a602eae7ad97076b9794ebaba072ad4a9f74f (diff)
parent18cf951af9a27ae573a6fa17f9d0c103f7b7679b (diff)
Merge remote-tracking branch 'remotes/pmaydell/tags/pull-target-arm-20190613-1' into staging
target-arm queue: * convert aarch32 VFP decoder to decodetree (includes tightening up decode in a few places) * fix minor bugs in VFP short-vector handling * hw/core/bus.c: Only the main system bus can have no parent * smmuv3: Fix decoding of ID register range * Implement NSACR gating of floating point * Use tcg_gen_gvec_bitsel # gpg: Signature made Thu 13 Jun 2019 15:15:39 BST # gpg: using RSA key E1A5C593CD419DE28E8315CF3C2525ED14360CDE # gpg: issuer "peter.maydell@linaro.org" # gpg: Good signature from "Peter Maydell <peter.maydell@linaro.org>" [ultimate] # gpg: aka "Peter Maydell <pmaydell@gmail.com>" [ultimate] # gpg: aka "Peter Maydell <pmaydell@chiark.greenend.org.uk>" [ultimate] # Primary key fingerprint: E1A5 C593 CD41 9DE2 8E83 15CF 3C25 25ED 1436 0CDE * remotes/pmaydell/tags/pull-target-arm-20190613-1: (47 commits) target/arm: Fix short-vector increment behaviour target/arm: Convert float-to-integer VCVT insns to decodetree target/arm: Convert VCVT fp/fixed-point conversion insns to decodetree target/arm: Convert VJCVT to decodetree target/arm: Convert integer-to-float insns to decodetree target/arm: Convert double-single precision conversion insns to decodetree target/arm: Convert VFP round insns to decodetree target/arm: Convert the VCVT-to-f16 insns to decodetree target/arm: Convert the VCVT-from-f16 insns to decodetree target/arm: Convert VFP comparison insns to decodetree target/arm: Convert VMOV (register) to decodetree target/arm: Convert VSQRT to decodetree target/arm: Convert VNEG to decodetree target/arm: Convert VABS to decodetree target/arm: Convert VMOV (imm) to decodetree target/arm: Convert VFP fused multiply-add insns to decodetree target/arm: Convert VDIV to decodetree target/arm: Convert VSUB to decodetree target/arm: Convert VADD to decodetree target/arm: Convert VNMUL to decodetree ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'tests')
-rw-r--r--tests/tcg/aarch64/Makefile.target2
-rw-r--r--tests/tcg/aarch64/pauth-2.c61
2 files changed, 62 insertions, 1 deletions
diff --git a/tests/tcg/aarch64/Makefile.target b/tests/tcg/aarch64/Makefile.target
index 2bb914975b..31ba9cfcaa 100644
--- a/tests/tcg/aarch64/Makefile.target
+++ b/tests/tcg/aarch64/Makefile.target
@@ -15,7 +15,7 @@ run-fcvt: fcvt
$(call run-test,$<,$(QEMU) $<, "$< on $(TARGET_NAME)")
$(call diff-out,$<,$(AARCH64_SRC)/fcvt.ref)
-AARCH64_TESTS += pauth-1
+AARCH64_TESTS += pauth-1 pauth-2
run-pauth-%: QEMU += -cpu max
TESTS:=$(AARCH64_TESTS)
diff --git a/tests/tcg/aarch64/pauth-2.c b/tests/tcg/aarch64/pauth-2.c
new file mode 100644
index 0000000000..2fe030ba3d
--- /dev/null
+++ b/tests/tcg/aarch64/pauth-2.c
@@ -0,0 +1,61 @@
+#include <stdint.h>
+#include <assert.h>
+
+asm(".arch armv8.4-a");
+
+void do_test(uint64_t value)
+{
+ uint64_t salt1, salt2;
+ uint64_t encode, decode;
+
+ /*
+ * With TBI enabled and a 48-bit VA, there are 7 bits of auth,
+ * and so a 1/128 chance of encode = pac(value,key,salt) producing
+ * an auth for which leaves value unchanged.
+ * Iterate until we find a salt for which encode != value.
+ */
+ for (salt1 = 1; ; salt1++) {
+ asm volatile("pacda %0, %2" : "=r"(encode) : "0"(value), "r"(salt1));
+ if (encode != value) {
+ break;
+ }
+ }
+
+ /* A valid salt must produce a valid authorization. */
+ asm volatile("autda %0, %2" : "=r"(decode) : "0"(encode), "r"(salt1));
+ assert(decode == value);
+
+ /*
+ * An invalid salt usually fails authorization, but again there
+ * is a chance of choosing another salt that works.
+ * Iterate until we find another salt which does fail.
+ */
+ for (salt2 = salt1 + 1; ; salt2++) {
+ asm volatile("autda %0, %2" : "=r"(decode) : "0"(encode), "r"(salt2));
+ if (decode != value) {
+ break;
+ }
+ }
+
+ /* The VA bits, bit 55, and the TBI bits, should be unchanged. */
+ assert(((decode ^ value) & 0xff80ffffffffffffull) == 0);
+
+ /*
+ * Bits [54:53] are an error indicator based on the key used;
+ * the DA key above is keynumber 0, so error == 0b01. Otherwise
+ * bit 55 of the original is sign-extended into the rest of the auth.
+ */
+ if ((value >> 55) & 1) {
+ assert(((decode >> 48) & 0xff) == 0b10111111);
+ } else {
+ assert(((decode >> 48) & 0xff) == 0b00100000);
+ }
+}
+
+int main()
+{
+ do_test(0);
+ do_test(-1);
+ do_test(0xda004acedeadbeefull);
+ return 0;
+}