[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v3 4/5] aarch64-linux-user: Add support for EXTR
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH v3 4/5] aarch64-linux-user: Add support for EXTRA signal frame records |
Date: |
Thu, 22 Feb 2018 16:23:10 +0000 |
On 16 February 2018 at 21:56, Richard Henderson
<address@hidden> wrote:
> The EXTRA record allows for additional space to be allocated
> beyon what is currently reserved. Add code to emit and read
> this record type.
>
> Nothing uses extra space yet.
>
> Signed-off-by: Richard Henderson <address@hidden>
> ---
> @@ -1554,14 +1572,16 @@ static void target_restore_fpsimd_record(CPUARMState
> *env,
> static int target_restore_sigframe(CPUARMState *env,
> struct target_rt_sigframe *sf)
> {
> - struct target_aarch64_ctx *ctx;
> + struct target_aarch64_ctx *ctx, *extra = NULL;
> struct target_fpsimd_context *fpsimd = NULL;
> + uint64_t extra_datap = 0;
> + bool used_extra = false;
>
> target_restore_general_frame(env, sf);
>
> ctx = (struct target_aarch64_ctx *)sf->uc.tuc_mcontext.__reserved;
> while (ctx) {
> - uint32_t magic, size;
> + uint32_t magic, size, extra_size;
>
> __get_user(magic, &ctx->magic);
> __get_user(size, &ctx->size);
> @@ -1570,7 +1590,12 @@ static int target_restore_sigframe(CPUARMState *env,
> if (size != 0) {
> return 1;
> }
> - ctx = NULL;
> + if (used_extra) {
> + ctx = NULL;
> + } else {
> + ctx = extra;
> + used_extra = true;
> + }
> continue;
>
> case TARGET_FPSIMD_MAGIC:
> @@ -1580,6 +1605,17 @@ static int target_restore_sigframe(CPUARMState *env,
> fpsimd = (struct target_fpsimd_context *)ctx;
> break;
>
> + case TARGET_EXTRA_MAGIC:
> + if (extra || size != sizeof(struct target_extra_context)) {
> + return 1;
> + }
> + __get_user(extra_datap,
> + &((struct target_extra_context *)ctx)->datap);
> + __get_user(extra_size,
> + &((struct target_extra_context *)ctx)->size);
> + extra = lock_user(VERIFY_READ, extra_datap, extra_size, 0);
> + break;
> +
> default:
> /* Unknown record -- we certainly didn't generate it.
> * Did we in fact get out of sync?
> @@ -1595,6 +1631,9 @@ static int target_restore_sigframe(CPUARMState *env,
> }
> target_restore_fpsimd_record(env, fpsimd);
>
> + if (extra) {
> + unlock_user(extra, extra_datap, 0);
> + }
This will fail to call unlock_user if the function returns early
(eg because of failed magic-number checks or the FPSIMD record
not being present).
You don't need the "if (extra)" check -- unlock_user() is
specified to do nothing if passed a NULL host_ptr.
Otherwise looks good.
thanks
-- PMM
- [Qemu-devel] [PATCH v3 0/5] target/arm: linux-user changes for sve, Richard Henderson, 2018/02/16
- [Qemu-devel] [PATCH v3 1/5] linux-user: Implement aarch64 PR_SVE_SET/GET_VL, Richard Henderson, 2018/02/16
- [Qemu-devel] [PATCH v3 2/5] aarch64-linux-user: Split out helpers for guest signal handling, Richard Henderson, 2018/02/16
- [Qemu-devel] [PATCH v3 3/5] aarch64-linux-user: Remove struct target_aux_context, Richard Henderson, 2018/02/16
- [Qemu-devel] [PATCH v3 4/5] aarch64-linux-user: Add support for EXTRA signal frame records, Richard Henderson, 2018/02/16
- Re: [Qemu-devel] [PATCH v3 4/5] aarch64-linux-user: Add support for EXTRA signal frame records,
Peter Maydell <=
- [Qemu-devel] [PATCH v3 5/5] aarch64-linux-user: Add support for SVE signal frame records, Richard Henderson, 2018/02/16