[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 4/6] linux-user: Initialize aarch64 pac keys
From: |
Richard Henderson |
Subject: |
[Qemu-devel] [PATCH 4/6] linux-user: Initialize aarch64 pac keys |
Date: |
Fri, 25 Jan 2019 14:57:12 -0800 |
Initialize the keys to a non-zero value on process start.
Signed-off-by: Richard Henderson <address@hidden>
---
linux-user/aarch64/target_syscall.h | 2 ++
linux-user/aarch64/cpu_loop.c | 31 +++++++++++++++++++++++++++--
2 files changed, 31 insertions(+), 2 deletions(-)
diff --git a/linux-user/aarch64/target_syscall.h
b/linux-user/aarch64/target_syscall.h
index 205265e619..937fd7989e 100644
--- a/linux-user/aarch64/target_syscall.h
+++ b/linux-user/aarch64/target_syscall.h
@@ -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 */
diff --git a/linux-user/aarch64/cpu_loop.c b/linux-user/aarch64/cpu_loop.c
index 65d815f030..d75fd9d3e2 100644
--- a/linux-user/aarch64/cpu_loop.c
+++ b/linux-user/aarch64/cpu_loop.c
@@ -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.17.2
- [Qemu-devel] [PATCH 0/6] target/arm: Complete ARMv8.3-PAuth linux-user, Richard Henderson, 2019/01/25
- [Qemu-devel] [PATCH 6/6] tests/tcg/aarch64: Add pauth smoke tests, Richard Henderson, 2019/01/25
- [Qemu-devel] [PATCH 2/6] aarch64-linux-user: Update HWCAP bits from linux 5.0-rc1, Richard Henderson, 2019/01/25
- [Qemu-devel] [PATCH 3/6] aarch64-linux-user: Enable HWCAP bits for PAuth, Richard Henderson, 2019/01/25
- [Qemu-devel] [PATCH 4/6] linux-user: Initialize aarch64 pac keys,
Richard Henderson <=
- [Qemu-devel] [PATCH 5/6] linux-user: Implement PR_PAC_RESET_KEYS, Richard Henderson, 2019/01/25
- [Qemu-devel] [PATCH] target/arm: Fix validation of 32-bit address spaces for aa32, Richard Henderson, 2019/01/25
- [Qemu-devel] [PATCH 1/6] target/arm: Always enable pac keys for user-only, Richard Henderson, 2019/01/25