Commit 87877543 authored by Richard Henderson's avatar Richard Henderson Committed by Peter Maydell
Browse files

linux-user: Initialize aarch64 pac keys



Initialize the keys to a non-zero value on process start.

Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
Reviewed-by: default avatarPeter Maydell <peter.maydell@linaro.org>
Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parent 29d26ab2
Loading
Loading
Loading
Loading
+29 −2
Original line number Diff line number Diff line
@@ -147,10 +147,29 @@ void cpu_loop(CPUARMState *env)
    }
}

static uint64_t arm_rand64(void)
{
    int shift = 64 - clz64(RAND_MAX);
    int i, n = 64 / shift + (64 % shift != 0);
    uint64_t ret = 0;

    for (i = 0; i < n; i++) {
        ret = (ret << shift) | rand();
    }
    return ret;
}

void arm_init_pauth_key(ARMPACKey *key)
{
    key->lo = arm_rand64();
    key->hi = arm_rand64();
}

void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs)
{
    CPUState *cpu = ENV_GET_CPU(env);
    TaskState *ts = cpu->opaque;
    ARMCPU *cpu = arm_env_get_cpu(env);
    CPUState *cs = CPU(cpu);
    TaskState *ts = cs->opaque;
    struct image_info *info = ts->info;
    int i;

@@ -172,6 +191,14 @@ void target_cpu_copy_regs(CPUArchState *env, struct target_pt_regs *regs)
    }
#endif

    if (cpu_isar_feature(aa64_pauth, cpu)) {
        arm_init_pauth_key(&env->apia_key);
        arm_init_pauth_key(&env->apib_key);
        arm_init_pauth_key(&env->apda_key);
        arm_init_pauth_key(&env->apdb_key);
        arm_init_pauth_key(&env->apga_key);
    }

    ts->stack_base = info->start_stack;
    ts->heap_base = info->brk;
    /* This will be filled in on the first SYS_HEAPINFO call.  */
+2 −0
Original line number Diff line number Diff line
@@ -22,4 +22,6 @@ struct target_pt_regs {
#define TARGET_PR_SVE_SET_VL  50
#define TARGET_PR_SVE_GET_VL  51

void arm_init_pauth_key(ARMPACKey *key);

#endif /* AARCH64_TARGET_SYSCALL_H */