qemu/tests/tcg/aarch64/pauth-2.c
Richard Henderson 16c8497848 target/arm: Use the proper TBI settings for linux-user
We were fudging TBI1 enabled to speed up the generated code.
Now that we've improved the code generation, remove this.
Also, tidy the comment to reflect the current code.

The pauth test was testing a kernel address (-1) and making
incorrect assumptions about TBI1; stick to userland addresses.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20210212184902.1251044-23-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
2021-02-16 13:07:56 +00:00

59 lines
1.7 KiB
C

#include <stdint.h>
#include <assert.h>
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(0xda004acedeadbeefull);
return 0;
}