|
@@ -397,7 +397,8 @@ static uint64_t pauth_original_ptr(uint64_t ptr, ARMVAParameters param)
|
|
}
|
|
}
|
|
|
|
|
|
static uint64_t pauth_auth(CPUARMState *env, uint64_t ptr, uint64_t modifier,
|
|
static uint64_t pauth_auth(CPUARMState *env, uint64_t ptr, uint64_t modifier,
|
|
- ARMPACKey *key, bool data, int keynumber)
|
|
|
|
|
|
+ ARMPACKey *key, bool data, int keynumber,
|
|
|
|
+ uintptr_t ra, bool is_combined)
|
|
{
|
|
{
|
|
ARMCPU *cpu = env_archcpu(env);
|
|
ARMCPU *cpu = env_archcpu(env);
|
|
ARMMMUIdx mmu_idx = arm_stage1_mmu_idx(env);
|
|
ARMMMUIdx mmu_idx = arm_stage1_mmu_idx(env);
|
|
@@ -519,44 +520,88 @@ uint64_t HELPER(pacga)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
return pac & 0xffffffff00000000ull;
|
|
return pac & 0xffffffff00000000ull;
|
|
}
|
|
}
|
|
|
|
|
|
-uint64_t HELPER(autia)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
|
|
+static uint64_t pauth_autia(CPUARMState *env, uint64_t x, uint64_t y,
|
|
|
|
+ uintptr_t ra, bool is_combined)
|
|
{
|
|
{
|
|
int el = arm_current_el(env);
|
|
int el = arm_current_el(env);
|
|
if (!pauth_key_enabled(env, el, SCTLR_EnIA)) {
|
|
if (!pauth_key_enabled(env, el, SCTLR_EnIA)) {
|
|
return x;
|
|
return x;
|
|
}
|
|
}
|
|
- pauth_check_trap(env, el, GETPC());
|
|
|
|
- return pauth_auth(env, x, y, &env->keys.apia, false, 0);
|
|
|
|
|
|
+ pauth_check_trap(env, el, ra);
|
|
|
|
+ return pauth_auth(env, x, y, &env->keys.apia, false, 0, ra, is_combined);
|
|
}
|
|
}
|
|
|
|
|
|
-uint64_t HELPER(autib)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
|
|
+uint64_t HELPER(autia)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
+{
|
|
|
|
+ return pauth_autia(env, x, y, GETPC(), false);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+uint64_t HELPER(autia_combined)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
+{
|
|
|
|
+ return pauth_autia(env, x, y, GETPC(), true);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static uint64_t pauth_autib(CPUARMState *env, uint64_t x, uint64_t y,
|
|
|
|
+ uintptr_t ra, bool is_combined)
|
|
{
|
|
{
|
|
int el = arm_current_el(env);
|
|
int el = arm_current_el(env);
|
|
if (!pauth_key_enabled(env, el, SCTLR_EnIB)) {
|
|
if (!pauth_key_enabled(env, el, SCTLR_EnIB)) {
|
|
return x;
|
|
return x;
|
|
}
|
|
}
|
|
- pauth_check_trap(env, el, GETPC());
|
|
|
|
- return pauth_auth(env, x, y, &env->keys.apib, false, 1);
|
|
|
|
|
|
+ pauth_check_trap(env, el, ra);
|
|
|
|
+ return pauth_auth(env, x, y, &env->keys.apib, false, 1, ra, is_combined);
|
|
}
|
|
}
|
|
|
|
|
|
-uint64_t HELPER(autda)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
|
|
+uint64_t HELPER(autib)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
+{
|
|
|
|
+ return pauth_autib(env, x, y, GETPC(), false);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+uint64_t HELPER(autib_combined)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
+{
|
|
|
|
+ return pauth_autib(env, x, y, GETPC(), true);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static uint64_t pauth_autda(CPUARMState *env, uint64_t x, uint64_t y,
|
|
|
|
+ uintptr_t ra, bool is_combined)
|
|
{
|
|
{
|
|
int el = arm_current_el(env);
|
|
int el = arm_current_el(env);
|
|
if (!pauth_key_enabled(env, el, SCTLR_EnDA)) {
|
|
if (!pauth_key_enabled(env, el, SCTLR_EnDA)) {
|
|
return x;
|
|
return x;
|
|
}
|
|
}
|
|
- pauth_check_trap(env, el, GETPC());
|
|
|
|
- return pauth_auth(env, x, y, &env->keys.apda, true, 0);
|
|
|
|
|
|
+ pauth_check_trap(env, el, ra);
|
|
|
|
+ return pauth_auth(env, x, y, &env->keys.apda, true, 0, ra, is_combined);
|
|
}
|
|
}
|
|
|
|
|
|
-uint64_t HELPER(autdb)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
|
|
+uint64_t HELPER(autda)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
+{
|
|
|
|
+ return pauth_autda(env, x, y, GETPC(), false);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+uint64_t HELPER(autda_combined)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
+{
|
|
|
|
+ return pauth_autda(env, x, y, GETPC(), true);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static uint64_t pauth_autdb(CPUARMState *env, uint64_t x, uint64_t y,
|
|
|
|
+ uintptr_t ra, bool is_combined)
|
|
{
|
|
{
|
|
int el = arm_current_el(env);
|
|
int el = arm_current_el(env);
|
|
if (!pauth_key_enabled(env, el, SCTLR_EnDB)) {
|
|
if (!pauth_key_enabled(env, el, SCTLR_EnDB)) {
|
|
return x;
|
|
return x;
|
|
}
|
|
}
|
|
- pauth_check_trap(env, el, GETPC());
|
|
|
|
- return pauth_auth(env, x, y, &env->keys.apdb, true, 1);
|
|
|
|
|
|
+ pauth_check_trap(env, el, ra);
|
|
|
|
+ return pauth_auth(env, x, y, &env->keys.apdb, true, 1, ra, is_combined);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+uint64_t HELPER(autdb)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
+{
|
|
|
|
+ return pauth_autdb(env, x, y, GETPC(), false);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+uint64_t HELPER(autdb_combined)(CPUARMState *env, uint64_t x, uint64_t y)
|
|
|
|
+{
|
|
|
|
+ return pauth_autdb(env, x, y, GETPC(), true);
|
|
}
|
|
}
|
|
|
|
|
|
uint64_t HELPER(xpaci)(CPUARMState *env, uint64_t a)
|
|
uint64_t HELPER(xpaci)(CPUARMState *env, uint64_t a)
|