qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 10/10] accel/tcg: Encode breakpoint info into tb->cflags


From: Peter Maydell
Subject: Re: [PATCH v2 10/10] accel/tcg: Encode breakpoint info into tb->cflags
Date: Sat, 17 Jul 2021 18:58:40 +0100

On Mon, 12 Jul 2021 at 16:49, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Having this data in cflags means that hashing takes care
> of selecting a TB with or without exceptions built in.
> Which means that we no longer need to flush all TBs.
>
> This does require that we single-step while we're within a page
> that contains a breakpoint, so it's not yet ideal, but should be
> an improvement over some corner-case slowdowns.
>
> Resolves: https://gitlab.com/qemu-project/qemu/-/issues/404
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  include/exec/exec-all.h   |  7 ++++
>  accel/tcg/cpu-exec.c      | 68 ++++++++++++++++++++++++++++++-
>  accel/tcg/translate-all.c |  4 --
>  accel/tcg/translator.c    | 85 +++++++++++++++++++++------------------
>  cpu.c                     | 24 -----------
>  5 files changed, 119 insertions(+), 69 deletions(-)
>
> diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
> index 6873cce8df..7ab2578f71 100644
> --- a/include/exec/exec-all.h
> +++ b/include/exec/exec-all.h
> @@ -502,9 +502,16 @@ struct TranslationBlock {
>  #define CF_USE_ICOUNT    0x00020000
>  #define CF_INVALID       0x00040000 /* TB is stale. Set with @jmp_lock held 
> */
>  #define CF_PARALLEL      0x00080000 /* Generate code for a parallel context 
> */
> +#define CF_BP_MASK       0x00300000 /* See below */
> +#define CF_BP_SHIFT      20
>  #define CF_CLUSTER_MASK  0xff000000 /* Top 8 bits are cluster ID */
>  #define CF_CLUSTER_SHIFT 24
>
> +#define CF_BP_NONE       (0 << CF_BP_SHIFT) /* TB does not interact with BPs 
> */
> +#define CF_BP_SSTEP      (1 << CF_BP_SHIFT) /* gdbstub single-step in effect 
> */
> +#define CF_BP_GDB        (2 << CF_BP_SHIFT) /* gdbstub breakpoint at tb->pc 
> */
> +#define CF_BP_CPU        (3 << CF_BP_SHIFT) /* arch breakpoint at tb->pc */
> +
>      /* Per-vCPU dynamic tracing state used to generate this TB */
>      uint32_t trace_vcpu_dstate;
>
> diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
> index 4d043a11aa..179a425ece 100644
> --- a/accel/tcg/cpu-exec.c
> +++ b/accel/tcg/cpu-exec.c
> @@ -222,6 +222,65 @@ static inline void log_cpu_exec(target_ulong pc, 
> CPUState *cpu,
>      }
>  }
>
> +static uint32_t cflags_for_breakpoints(CPUState *cpu, target_ulong pc,
> +                                       uint32_t cflags)
> +{
> +    uint32_t bflags = 0;
> +
> +    if (unlikely(cpu->singlestep_enabled)) {
> +        bflags = CF_BP_SSTEP;
> +    } else {

Won't this ignore breakpoints when singlestepping ?

-- PMM



reply via email to

[Prev in Thread] Current Thread [Next in Thread]