diff mbox series

[qemu] target/ppc: Add Directed Privileged Door-bell Exception State (DPDES) SPR

Message ID 20190816061733.53572-1-aik@ozlabs.ru
State New
Headers show
Series [qemu] target/ppc: Add Directed Privileged Door-bell Exception State (DPDES) SPR | expand

Commit Message

Alexey Kardashevskiy Aug. 16, 2019, 6:17 a.m. UTC
DPDES stores a status of a doorbell message and if it is lost in
migration, the destination CPU won't receive it. This does not hit us
much as IPIs complete too quick to catch a pending one and even if
we missed one, broadcasts happen often enough to wake that CPU.

This defines DPDES and registers with KVM for migration.

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 target/ppc/cpu.h                |  1 +
 target/ppc/translate_init.inc.c | 14 ++++++++++++++
 2 files changed, 15 insertions(+)

Comments

David Gibson Aug. 17, 2019, 3:29 a.m. UTC | #1
On Fri, Aug 16, 2019 at 04:17:33PM +1000, Alexey Kardashevskiy wrote:
> DPDES stores a status of a doorbell message and if it is lost in
> migration, the destination CPU won't receive it. This does not hit us
> much as IPIs complete too quick to catch a pending one and even if
> we missed one, broadcasts happen often enough to wake that CPU.
> 
> This defines DPDES and registers with KVM for migration.
> 
> Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>

Ouch, I'm kind of surprised this hasn't bitten us before.

Really we ought to also wire this up to the emulated doorbell
instructions as well, but this certainly improves the behaviour so
I've merged it to ppc-for-4.2.

> ---
>  target/ppc/cpu.h                |  1 +
>  target/ppc/translate_init.inc.c | 14 ++++++++++++++
>  2 files changed, 15 insertions(+)
> 
> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> index 64799386f9ab..f0521a435d2d 100644
> --- a/target/ppc/cpu.h
> +++ b/target/ppc/cpu.h
> @@ -1466,6 +1466,7 @@ typedef PowerPCCPU ArchCPU;
>  #define SPR_MPC_ICTRL         (0x09E)
>  #define SPR_MPC_BAR           (0x09F)
>  #define SPR_PSPB              (0x09F)
> +#define SPR_DPDES             (0x0B0)
>  #define SPR_DAWR              (0x0B4)
>  #define SPR_RPR               (0x0BA)
>  #define SPR_CIABR             (0x0BB)
> diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
> index c9fcd87095f5..7e41ae145600 100644
> --- a/target/ppc/translate_init.inc.c
> +++ b/target/ppc/translate_init.inc.c
> @@ -8198,6 +8198,18 @@ static void gen_spr_power8_pspb(CPUPPCState *env)
>                       KVM_REG_PPC_PSPB, 0);
>  }
>  
> +static void gen_spr_power8_dpdes(CPUPPCState *env)
> +{
> +#if !defined(CONFIG_USER_ONLY)
> +    /* Directed Privileged Door-bell Exception State, used for IPI */
> +    spr_register_kvm_hv(env, SPR_DPDES, "DPDES",
> +                        SPR_NOACCESS, SPR_NOACCESS,
> +                        &spr_read_generic, SPR_NOACCESS,
> +                        &spr_read_generic, &spr_write_generic,
> +                        KVM_REG_PPC_DPDES, 0x00000000);
> +#endif
> +}
> +
>  static void gen_spr_power8_ic(CPUPPCState *env)
>  {
>  #if !defined(CONFIG_USER_ONLY)
> @@ -8629,6 +8641,7 @@ static void init_proc_POWER8(CPUPPCState *env)
>      gen_spr_power8_pmu_user(env);
>      gen_spr_power8_tm(env);
>      gen_spr_power8_pspb(env);
> +    gen_spr_power8_dpdes(env);
>      gen_spr_vtb(env);
>      gen_spr_power8_ic(env);
>      gen_spr_power8_book4(env);
> @@ -8817,6 +8830,7 @@ static void init_proc_POWER9(CPUPPCState *env)
>      gen_spr_power8_pmu_user(env);
>      gen_spr_power8_tm(env);
>      gen_spr_power8_pspb(env);
> +    gen_spr_power8_dpdes(env);
>      gen_spr_vtb(env);
>      gen_spr_power8_ic(env);
>      gen_spr_power8_book4(env);
diff mbox series

Patch

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 64799386f9ab..f0521a435d2d 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -1466,6 +1466,7 @@  typedef PowerPCCPU ArchCPU;
 #define SPR_MPC_ICTRL         (0x09E)
 #define SPR_MPC_BAR           (0x09F)
 #define SPR_PSPB              (0x09F)
+#define SPR_DPDES             (0x0B0)
 #define SPR_DAWR              (0x0B4)
 #define SPR_RPR               (0x0BA)
 #define SPR_CIABR             (0x0BB)
diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index c9fcd87095f5..7e41ae145600 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -8198,6 +8198,18 @@  static void gen_spr_power8_pspb(CPUPPCState *env)
                      KVM_REG_PPC_PSPB, 0);
 }
 
+static void gen_spr_power8_dpdes(CPUPPCState *env)
+{
+#if !defined(CONFIG_USER_ONLY)
+    /* Directed Privileged Door-bell Exception State, used for IPI */
+    spr_register_kvm_hv(env, SPR_DPDES, "DPDES",
+                        SPR_NOACCESS, SPR_NOACCESS,
+                        &spr_read_generic, SPR_NOACCESS,
+                        &spr_read_generic, &spr_write_generic,
+                        KVM_REG_PPC_DPDES, 0x00000000);
+#endif
+}
+
 static void gen_spr_power8_ic(CPUPPCState *env)
 {
 #if !defined(CONFIG_USER_ONLY)
@@ -8629,6 +8641,7 @@  static void init_proc_POWER8(CPUPPCState *env)
     gen_spr_power8_pmu_user(env);
     gen_spr_power8_tm(env);
     gen_spr_power8_pspb(env);
+    gen_spr_power8_dpdes(env);
     gen_spr_vtb(env);
     gen_spr_power8_ic(env);
     gen_spr_power8_book4(env);
@@ -8817,6 +8830,7 @@  static void init_proc_POWER9(CPUPPCState *env)
     gen_spr_power8_pmu_user(env);
     gen_spr_power8_tm(env);
     gen_spr_power8_pspb(env);
+    gen_spr_power8_dpdes(env);
     gen_spr_vtb(env);
     gen_spr_power8_ic(env);
     gen_spr_power8_book4(env);