All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling
@ 2020-02-24 23:37 David Gibson
  2020-02-24 23:37 ` [PATCH v6 01/18] pseries: Update SLOF firmware image David Gibson
                   ` (17 more replies)
  0 siblings, 18 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

POWER "book S" (server class) cpus have a concept of "real mode" where
MMU translation is disabled... sort of.  In fact this can mean a bunch
of slightly different things when hypervisor mode and other
considerations are present.

We had some errors in edge cases here, so clean some things up and
correct them.

Some of those limitations caused problems with calculating the size of
the Real Mode Area of pseries guests, so continue on to clean up and
correct those calculations as well.

Changes since v5:
 * Fixed an error in the sense of a test (pointed out by Fabiano Rosas)
Changes since v4:
 * Some tiny cosmetic fixes to the original patches
 * Added a bunch of extra patches correcting RMA calculation
Changes since v3:
 * Fix style errors reported by checkpatch
Changes since v2:
 * Removed 32-bit hypervisor stubs more completely
 * Minor polish based on review comments
Changes since RFCv1:
 * Add a number of extra patches taking advantage of the initial
   cleanups

Alexey Kardashevskiy (1):
  pseries: Update SLOF firmware image

David Gibson (17):
  ppc: Remove stub support for 32-bit hypervisor mode
  ppc: Remove stub of PPC970 HID4 implementation
  target/ppc: Correct handling of real mode accesses with vhyp on hash
    MMU
  target/ppc: Introduce ppc_hash64_use_vrma() helper
  spapr, ppc: Remove VPM0/RMLS hacks for POWER9
  target/ppc: Remove RMOR register from POWER9 & POWER10
  target/ppc: Use class fields to simplify LPCR masking
  target/ppc: Streamline calculation of RMA limit from LPCR[RMLS]
  target/ppc: Correct RMLS table
  target/ppc: Only calculate RMLS derived RMA limit on demand
  target/ppc: Don't store VRMA SLBE persistently
  spapr: Don't use weird units for MIN_RMA_SLOF
  spapr,ppc: Simplify signature of kvmppc_rma_size()
  spapr: Don't attempt to clamp RMA to VRMA constraint
  spapr: Don't clamp RMA to 16GiB on new machine types
  spapr: Clean up RMA size calculation
  spapr: Fold spapr_node0_size() into its only caller

 hw/ppc/spapr.c                  | 124 ++++++------
 hw/ppc/spapr_cpu_core.c         |   6 +-
 hw/ppc/spapr_hcall.c            |   4 +-
 include/hw/ppc/spapr.h          |   4 +-
 pc-bios/README                  |   2 +-
 pc-bios/slof.bin                | Bin 931032 -> 968616 bytes
 roms/SLOF                       |   2 +-
 target/ppc/cpu-qom.h            |   1 +
 target/ppc/cpu.h                |  25 +--
 target/ppc/kvm.c                |   5 +-
 target/ppc/kvm_ppc.h            |   7 +-
 target/ppc/mmu-hash64.c         | 327 ++++++++++++--------------------
 target/ppc/translate_init.inc.c |  63 ++++--
 13 files changed, 254 insertions(+), 316 deletions(-)

-- 
2.24.1



^ permalink raw reply	[flat|nested] 45+ messages in thread

* [PATCH v6 01/18] pseries: Update SLOF firmware image
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-24 23:37 ` [PATCH v6 02/18] ppc: Remove stub support for 32-bit hypervisor mode David Gibson
                   ` (16 subsequent siblings)
  17 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

From: Alexey Kardashevskiy <aik@ozlabs.ru>

This adds vTPM support, full-FDT-rebuild-on-CAS fixes and
basic ext4 support.

The full changelog is:

Alexey Kardashevskiy (10):
      disk-label: Prepare for extenting
      disk-label: Support Linux GPT partition type
      ext2: Prepare for extending
      ext2: Rename group-desc-size
      ext2: Read size of group descriptors
      ext2: Read all 64bit of inode number
      ext2/4: Add basic extent tree support
      elf64: Add LE64 ABIv1/2 support for loading images to given address
      fdt: Fix creating new nodes at H_CAS
      version: update to 20200221

Greg Kurz (2):
      fdt: Fix update of "interrupt-controller" node at CAS
      fdt: Delete nodes of devices removed between boot and CAS

Stefan Berger (8):
      slof: Implement SLOF_get_keystroke() and SLOF_reset()
      slof: Make linker script variables accessible
      qemu: Make print_version variable accessible
      tpm: Add TPM CRQ driver implementation
      tpm: Add sha256 implementation
      tcgbios: Add TPM 2.0 support and firmware API
      tcgbios: Implement menu to clear TPM 2 and activate its PCR banks
      tcgbios: Measure the GPT table

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 pc-bios/README   |   2 +-
 pc-bios/slof.bin | Bin 931032 -> 968616 bytes
 roms/SLOF        |   2 +-
 3 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pc-bios/README b/pc-bios/README
index d6d33d237f..a71fb318b3 100644
--- a/pc-bios/README
+++ b/pc-bios/README
@@ -14,7 +14,7 @@
 - SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware
   implementation for certain IBM POWER hardware.  The sources are at
   https://github.com/aik/SLOF, and the image currently in qemu is
-  built from git tag qemu-slof-20191217.
+  built from git tag qemu-slof-20200221.
 
 - sgabios (the Serial Graphics Adapter option ROM) provides a means for
   legacy x86 software to communicate with an attached serial console as
diff --git a/pc-bios/slof.bin b/pc-bios/slof.bin
index 78d8b26cbb88a1913c3b262fd5be29ff89afd554..1c5948561639cfe244ad5d60506050ddb0c9b5b2 100644
GIT binary patch
delta 263704
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
KY<cFP)BhjdSpAs*

delta 242048
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%0Aqcm$Z;*H?$dC)sQl{
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
J?c49Y^)CQ54<-Nr

diff --git a/roms/SLOF b/roms/SLOF
index 9546892a80..7c98b3b613 160000
--- a/roms/SLOF
+++ b/roms/SLOF
@@ -1 +1 @@
-Subproject commit 9546892a80d5a4c73deea6719de46372f007f4a6
+Subproject commit 7c98b3b613338a385722a953517349664aa4f532
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 02/18] ppc: Remove stub support for 32-bit hypervisor mode
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
  2020-02-24 23:37 ` [PATCH v6 01/18] pseries: Update SLOF firmware image David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25  6:31   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 03/18] ppc: Remove stub of PPC970 HID4 implementation David Gibson
                   ` (15 subsequent siblings)
  17 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

a4f30719a8cd, way back in 2007 noted that "PowerPC hypervisor mode is not
fundamentally available only for PowerPC 64" and added a 32-bit version
of the MSR[HV] bit.

But nothing was ever really done with that; there is no meaningful support
for 32-bit hypervisor mode 13 years later.  Let's stop pretending and just
remove the stubs.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com>
---
 target/ppc/cpu.h                | 21 +++++++--------------
 target/ppc/translate_init.inc.c |  6 +++---
 2 files changed, 10 insertions(+), 17 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index b283042515..8077fdb068 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -24,8 +24,6 @@
 #include "exec/cpu-defs.h"
 #include "cpu-qom.h"
 
-/* #define PPC_EMULATE_32BITS_HYPV */
-
 #define TCG_GUEST_DEFAULT_MO 0
 
 #define TARGET_PAGE_BITS_64K 16
@@ -300,13 +298,12 @@ typedef struct ppc_v3_pate_t {
 #define MSR_SF   63 /* Sixty-four-bit mode                            hflags */
 #define MSR_TAG  62 /* Tag-active mode (POWERx ?)                            */
 #define MSR_ISF  61 /* Sixty-four-bit interrupt mode on 630                  */
-#define MSR_SHV  60 /* hypervisor state                               hflags */
+#define MSR_HV   60 /* hypervisor state                               hflags */
 #define MSR_TS0  34 /* Transactional state, 2 bits (Book3s)                  */
 #define MSR_TS1  33
 #define MSR_TM   32 /* Transactional Memory Available (Book3s)               */
 #define MSR_CM   31 /* Computation mode for BookE                     hflags */
 #define MSR_ICM  30 /* Interrupt computation mode for BookE                  */
-#define MSR_THV  29 /* hypervisor state for 32 bits PowerPC           hflags */
 #define MSR_GS   28 /* guest state for BookE                                 */
 #define MSR_UCLE 26 /* User-mode cache lock enable for BookE                 */
 #define MSR_VR   25 /* altivec available                            x hflags */
@@ -401,10 +398,13 @@ typedef struct ppc_v3_pate_t {
 
 #define msr_sf   ((env->msr >> MSR_SF)   & 1)
 #define msr_isf  ((env->msr >> MSR_ISF)  & 1)
-#define msr_shv  ((env->msr >> MSR_SHV)  & 1)
+#if defined(TARGET_PPC64)
+#define msr_hv   ((env->msr >> MSR_HV)   & 1)
+#else
+#define msr_hv   (0)
+#endif
 #define msr_cm   ((env->msr >> MSR_CM)   & 1)
 #define msr_icm  ((env->msr >> MSR_ICM)  & 1)
-#define msr_thv  ((env->msr >> MSR_THV)  & 1)
 #define msr_gs   ((env->msr >> MSR_GS)   & 1)
 #define msr_ucle ((env->msr >> MSR_UCLE) & 1)
 #define msr_vr   ((env->msr >> MSR_VR)   & 1)
@@ -449,16 +449,9 @@ typedef struct ppc_v3_pate_t {
 
 /* Hypervisor bit is more specific */
 #if defined(TARGET_PPC64)
-#define MSR_HVB (1ULL << MSR_SHV)
-#define msr_hv  msr_shv
-#else
-#if defined(PPC_EMULATE_32BITS_HYPV)
-#define MSR_HVB (1ULL << MSR_THV)
-#define msr_hv  msr_thv
+#define MSR_HVB (1ULL << MSR_HV)
 #else
 #define MSR_HVB (0ULL)
-#define msr_hv  (0)
-#endif
 #endif
 
 /* DSISR */
diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index 53995f62ea..a0d0eaabf2 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -8804,7 +8804,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
                         PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
                         PPC2_TM | PPC2_PM_ISA206;
     pcc->msr_mask = (1ull << MSR_SF) |
-                    (1ull << MSR_SHV) |
+                    (1ull << MSR_HV) |
                     (1ull << MSR_TM) |
                     (1ull << MSR_VR) |
                     (1ull << MSR_VSX) |
@@ -9017,7 +9017,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
                         PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
                         PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
     pcc->msr_mask = (1ull << MSR_SF) |
-                    (1ull << MSR_SHV) |
+                    (1ull << MSR_HV) |
                     (1ull << MSR_TM) |
                     (1ull << MSR_VR) |
                     (1ull << MSR_VSX) |
@@ -9228,7 +9228,7 @@ POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data)
                         PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
                         PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
     pcc->msr_mask = (1ull << MSR_SF) |
-                    (1ull << MSR_SHV) |
+                    (1ull << MSR_HV) |
                     (1ull << MSR_TM) |
                     (1ull << MSR_VR) |
                     (1ull << MSR_VSX) |
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 03/18] ppc: Remove stub of PPC970 HID4 implementation
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
  2020-02-24 23:37 ` [PATCH v6 01/18] pseries: Update SLOF firmware image David Gibson
  2020-02-24 23:37 ` [PATCH v6 02/18] ppc: Remove stub support for 32-bit hypervisor mode David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-24 23:37 ` [PATCH v6 04/18] target/ppc: Correct handling of real mode accesses with vhyp on hash MMU David Gibson
                   ` (14 subsequent siblings)
  17 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

The PowerPC 970 CPU was a cut-down POWER4, which had hypervisor capability.
However, it can be (and often was) strapped into "Apple mode", where the
hypervisor capabilities were disabled (essentially putting it always in
hypervisor mode).

That's actually the only mode of the 970 we support in qemu, and we're
unlikely to change that any time soon.  However, we do have a partial
implementation of the 970's HID4 register which affects things only
relevant for hypervisor mode.

That stub is also really ugly, since it attempts to duplicate the effects
of HID4 by re-encoding it into the LPCR register used in newer CPUs, but
in a really confusing way.

Just get rid of it.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Greg Kurz <groug@kaod.org>
---
 target/ppc/mmu-hash64.c         | 29 +----------------------------
 target/ppc/translate_init.inc.c | 20 ++++++++------------
 2 files changed, 9 insertions(+), 40 deletions(-)

diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index da8966ccf5..3e0be4d55f 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -1091,33 +1091,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
 
     /* Filter out bits */
     switch (env->mmu_model) {
-    case POWERPC_MMU_64B: /* 970 */
-        if (val & 0x40) {
-            lpcr |= LPCR_LPES0;
-        }
-        if (val & 0x8000000000000000ull) {
-            lpcr |= LPCR_LPES1;
-        }
-        if (val & 0x20) {
-            lpcr |= (0x4ull << LPCR_RMLS_SHIFT);
-        }
-        if (val & 0x4000000000000000ull) {
-            lpcr |= (0x2ull << LPCR_RMLS_SHIFT);
-        }
-        if (val & 0x2000000000000000ull) {
-            lpcr |= (0x1ull << LPCR_RMLS_SHIFT);
-        }
-        env->spr[SPR_RMOR] = ((lpcr >> 41) & 0xffffull) << 26;
-
-        /*
-         * XXX We could also write LPID from HID4 here
-         * but since we don't tag any translation on it
-         * it doesn't actually matter
-         *
-         * XXX For proper emulation of 970 we also need
-         * to dig HRMOR out of HID5
-         */
-        break;
     case POWERPC_MMU_2_03: /* P5p */
         lpcr = val & (LPCR_RMLS | LPCR_ILE |
                       LPCR_LPES0 | LPCR_LPES1 |
@@ -1154,7 +1127,7 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
         }
         break;
     default:
-        ;
+        g_assert_not_reached();
     }
     env->spr[SPR_LPCR] = lpcr;
     ppc_hash64_update_rmls(cpu);
diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index a0d0eaabf2..ab79975fec 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -7895,25 +7895,21 @@ static void spr_write_lpcr(DisasContext *ctx, int sprn, int gprn)
 {
     gen_helper_store_lpcr(cpu_env, cpu_gpr[gprn]);
 }
-
-static void spr_write_970_hid4(DisasContext *ctx, int sprn, int gprn)
-{
-#if defined(TARGET_PPC64)
-    spr_write_generic(ctx, sprn, gprn);
-    gen_helper_store_lpcr(cpu_env, cpu_gpr[gprn]);
-#endif
-}
-
 #endif /* !defined(CONFIG_USER_ONLY) */
 
 static void gen_spr_970_lpar(CPUPPCState *env)
 {
 #if !defined(CONFIG_USER_ONLY)
-    /* Logical partitionning */
-    /* PPC970: HID4 is effectively the LPCR */
+    /*
+     * PPC970: HID4 covers things later controlled by the LPCR and
+     * RMOR in later CPUs, but with a different encoding.  We only
+     * support the 970 in "Apple mode" which has all hypervisor
+     * facilities disabled by strapping, so we can basically just
+     * ignore it
+     */
     spr_register(env, SPR_970_HID4, "HID4",
                  SPR_NOACCESS, SPR_NOACCESS,
-                 &spr_read_generic, &spr_write_970_hid4,
+                 &spr_read_generic, &spr_write_generic,
                  0x00000000);
 #endif
 }
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 04/18] target/ppc: Correct handling of real mode accesses with vhyp on hash MMU
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (2 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 03/18] ppc: Remove stub of PPC970 HID4 implementation David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25 10:29   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 05/18] target/ppc: Introduce ppc_hash64_use_vrma() helper David Gibson
                   ` (13 subsequent siblings)
  17 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

On ppc we have the concept of virtual hypervisor ("vhyp") mode, where we
only model the non-hypervisor-privileged parts of the cpu.  Essentially we
model the hypervisor's behaviour from the point of view of a guest OS, but
we don't model the hypervisor's execution.

In particular, in this mode, qemu's notion of target physical address is
a guest physical address from the vcpu's point of view.  So accesses in
guest real mode don't require translation.  If we were modelling the
hypervisor mode, we'd need to translate the guest physical address into
a host physical address.

Currently, we handle this sloppily: we rely on setting up the virtual LPCR
and RMOR registers so that GPAs are simply HPAs plus an offset, which we
set to zero.  This is already conceptually dubious, since the LPCR and RMOR
registers don't exist in the non-hypervisor portion of the CPU.  It gets
worse with POWER9, where RMOR and LPCR[VPM0] no longer exist at all.

Clean this up by explicitly handling the vhyp case.  While we're there,
remove some unnecessary nesting of if statements that made the logic to
select the correct real mode behaviour a bit less clear than it could be.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
---
 target/ppc/mmu-hash64.c | 60 ++++++++++++++++++++++++-----------------
 1 file changed, 35 insertions(+), 25 deletions(-)

diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index 3e0be4d55f..392f90e0ae 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -789,27 +789,30 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
          */
         raddr = eaddr & 0x0FFFFFFFFFFFFFFFULL;
 
-        /* In HV mode, add HRMOR if top EA bit is clear */
-        if (msr_hv || !env->has_hv_mode) {
+        if (cpu->vhyp) {
+            /*
+             * In virtual hypervisor mode, there's nothing to do:
+             *   EA == GPA == qemu guest address
+             */
+        } else if (msr_hv || !env->has_hv_mode) {
+            /* In HV mode, add HRMOR if top EA bit is clear */
             if (!(eaddr >> 63)) {
                 raddr |= env->spr[SPR_HRMOR];
             }
-        } else {
-            /* Otherwise, check VPM for RMA vs VRMA */
-            if (env->spr[SPR_LPCR] & LPCR_VPM0) {
-                slb = &env->vrma_slb;
-                if (slb->sps) {
-                    goto skip_slb_search;
-                }
-                /* Not much else to do here */
+        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
+            /* Emulated VRMA mode */
+            slb = &env->vrma_slb;
+            if (!slb->sps) {
+                /* Invalid VRMA setup, machine check */
                 cs->exception_index = POWERPC_EXCP_MCHECK;
                 env->error_code = 0;
                 return 1;
-            } else if (raddr < env->rmls) {
-                /* RMA. Check bounds in RMLS */
-                raddr |= env->spr[SPR_RMOR];
-            } else {
-                /* The access failed, generate the approriate interrupt */
+            }
+
+            goto skip_slb_search;
+        } else {
+            /* Emulated old-style RMO mode, bounds check against RMLS */
+            if (raddr >= env->rmls) {
                 if (rwx == 2) {
                     ppc_hash64_set_isi(cs, SRR1_PROTFAULT);
                 } else {
@@ -821,6 +824,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
                 }
                 return 1;
             }
+
+            raddr |= env->spr[SPR_RMOR];
         }
         tlb_set_page(cs, eaddr & TARGET_PAGE_MASK, raddr & TARGET_PAGE_MASK,
                      PAGE_READ | PAGE_WRITE | PAGE_EXEC, mmu_idx,
@@ -953,22 +958,27 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
         /* In real mode the top 4 effective address bits are ignored */
         raddr = addr & 0x0FFFFFFFFFFFFFFFULL;
 
-        /* In HV mode, add HRMOR if top EA bit is clear */
-        if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) {
+        if (cpu->vhyp) {
+            /*
+             * In virtual hypervisor mode, there's nothing to do:
+             *   EA == GPA == qemu guest address
+             */
+            return raddr;
+        } else if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) {
+            /* In HV mode, add HRMOR if top EA bit is clear */
             return raddr | env->spr[SPR_HRMOR];
-        }
-
-        /* Otherwise, check VPM for RMA vs VRMA */
-        if (env->spr[SPR_LPCR] & LPCR_VPM0) {
+        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
+            /* Emulated VRMA mode */
             slb = &env->vrma_slb;
             if (!slb->sps) {
                 return -1;
             }
-        } else if (raddr < env->rmls) {
-            /* RMA. Check bounds in RMLS */
-            return raddr | env->spr[SPR_RMOR];
         } else {
-            return -1;
+            /* Emulated old-style RMO mode, bounds check against RMLS */
+            if (raddr >= env->rmls) {
+                return -1;
+            }
+            return raddr | env->spr[SPR_RMOR];
         }
     } else {
         slb = slb_lookup(cpu, addr);
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 05/18] target/ppc: Introduce ppc_hash64_use_vrma() helper
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (3 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 04/18] target/ppc: Correct handling of real mode accesses with vhyp on hash MMU David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25  0:12   ` Fabiano Rosas
  2020-02-25 10:30   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 06/18] spapr, ppc: Remove VPM0/RMLS hacks for POWER9 David Gibson
                   ` (12 subsequent siblings)
  17 siblings, 2 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

When running guests under a hypervisor, the hypervisor obviously needs to
be protected from guest accesses even if those are in what the guest
considers real mode (translation off).  The POWER hardware provides two
ways of doing that: The old way has guest real mode accesses simply offset
and bounds checked into host addresses.  It works, but requires that a
significant chunk of the guest's memory - the RMA - be physically
contiguous in the host, which is pretty inconvenient.  The new way, known
as VRMA, has guest real mode accesses translated in roughly the normal way
but with some special parameters.

In POWER7 and POWER8 the LPCR[VPM0] bit selected between the two modes, but
in POWER9 only VRMA mode is supported and LPCR[VPM0] no longer exists.  We
handle that difference in behaviour in ppc_hash64_set_isi().. but not in
other places that we blindly check LPCR[VPM0].

Correct those instances with a new helper to tell if we should be in VRMA
mode.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
---
 target/ppc/mmu-hash64.c | 43 ++++++++++++++++++++---------------------
 1 file changed, 21 insertions(+), 22 deletions(-)

diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index 392f90e0ae..e372c42add 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -668,6 +668,21 @@ unsigned ppc_hash64_hpte_page_shift_noslb(PowerPCCPU *cpu,
     return 0;
 }
 
+static bool ppc_hash64_use_vrma(CPUPPCState *env)
+{
+    switch (env->mmu_model) {
+    case POWERPC_MMU_3_00:
+        /*
+         * ISAv3.0 (POWER9) always uses VRMA, the VPM0 field and RMOR
+         * register no longer exist
+         */
+        return true;
+
+    default:
+        return !!(env->spr[SPR_LPCR] & LPCR_VPM0);
+    }
+}
+
 static void ppc_hash64_set_isi(CPUState *cs, uint64_t error_code)
 {
     CPUPPCState *env = &POWERPC_CPU(cs)->env;
@@ -676,15 +691,7 @@ static void ppc_hash64_set_isi(CPUState *cs, uint64_t error_code)
     if (msr_ir) {
         vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM1);
     } else {
-        switch (env->mmu_model) {
-        case POWERPC_MMU_3_00:
-            /* Field deprecated in ISAv3.00 - interrupts always go to hyperv */
-            vpm = true;
-            break;
-        default:
-            vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM0);
-            break;
-        }
+        vpm = ppc_hash64_use_vrma(env);
     }
     if (vpm && !msr_hv) {
         cs->exception_index = POWERPC_EXCP_HISI;
@@ -702,15 +709,7 @@ static void ppc_hash64_set_dsi(CPUState *cs, uint64_t dar, uint64_t dsisr)
     if (msr_dr) {
         vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM1);
     } else {
-        switch (env->mmu_model) {
-        case POWERPC_MMU_3_00:
-            /* Field deprecated in ISAv3.00 - interrupts always go to hyperv */
-            vpm = true;
-            break;
-        default:
-            vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM0);
-            break;
-        }
+        vpm = ppc_hash64_use_vrma(env);
     }
     if (vpm && !msr_hv) {
         cs->exception_index = POWERPC_EXCP_HDSI;
@@ -799,7 +798,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
             if (!(eaddr >> 63)) {
                 raddr |= env->spr[SPR_HRMOR];
             }
-        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
+        } else if (ppc_hash64_use_vrma(env)) {
             /* Emulated VRMA mode */
             slb = &env->vrma_slb;
             if (!slb->sps) {
@@ -967,7 +966,7 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
         } else if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) {
             /* In HV mode, add HRMOR if top EA bit is clear */
             return raddr | env->spr[SPR_HRMOR];
-        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
+        } else if (ppc_hash64_use_vrma(env)) {
             /* Emulated VRMA mode */
             slb = &env->vrma_slb;
             if (!slb->sps) {
@@ -1056,8 +1055,7 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
     slb->sps = NULL;
 
     /* Is VRMA enabled ? */
-    lpcr = env->spr[SPR_LPCR];
-    if (!(lpcr & LPCR_VPM0)) {
+    if (!ppc_hash64_use_vrma(env)) {
         return;
     }
 
@@ -1065,6 +1063,7 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
      * Make one up. Mostly ignore the ESID which will not be needed
      * for translation
      */
+    lpcr = env->spr[SPR_LPCR];
     vsid = SLB_VSID_VRMA;
     vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT;
     vsid |= (vrmasd << 4) & (SLB_VSID_L | SLB_VSID_LP);
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 06/18] spapr, ppc: Remove VPM0/RMLS hacks for POWER9
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (4 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 05/18] target/ppc: Introduce ppc_hash64_use_vrma() helper David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25 11:29   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 07/18] target/ppc: Remove RMOR register from POWER9 & POWER10 David Gibson
                   ` (11 subsequent siblings)
  17 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

For the "pseries" machine, we use "virtual hypervisor" mode where we
only model the CPU in non-hypervisor privileged mode.  This means that
we need guest physical addresses within the modelled cpu to be treated
as absolute physical addresses.

We used to do that by clearing LPCR[VPM0] and setting LPCR[RMLS] to a high
limit so that the old offset based translation for guest mode applied,
which does what we need.  However, POWER9 has removed support for that
translation mode, which meant we had some ugly hacks to keep it working.

We now explicitly handle this sort of translation for virtual hypervisor
mode, so the hacks aren't necessary.  We don't need to set VPM0 and RMLS
from the machine type code - they're now ignored in vhyp mode.  On the cpu
side we don't need to allow LPCR[RMLS] to be set on POWER9 in vhyp mode -
that was only there to allow the hack on the machine side.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
---
 hw/ppc/spapr_cpu_core.c | 6 +-----
 target/ppc/mmu-hash64.c | 8 --------
 2 files changed, 1 insertion(+), 13 deletions(-)

diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
index d09125d9af..ea5e11f1d9 100644
--- a/hw/ppc/spapr_cpu_core.c
+++ b/hw/ppc/spapr_cpu_core.c
@@ -58,14 +58,10 @@ static void spapr_reset_vcpu(PowerPCCPU *cpu)
      * we don't get spurious wakups before an RTAS start-cpu call.
      * For the same reason, set PSSCR_EC.
      */
-    lpcr &= ~(LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm);
+    lpcr &= ~(LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm);
     lpcr |= LPCR_LPES0 | LPCR_LPES1;
     env->spr[SPR_PSSCR] |= PSSCR_EC;
 
-    /* Set RMLS to the max (ie, 16G) */
-    lpcr &= ~LPCR_RMLS;
-    lpcr |= 1ull << LPCR_RMLS_SHIFT;
-
     ppc_store_lpcr(cpu, lpcr);
 
     /* Set a full AMOR so guest can use the AMR as it sees fit */
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index e372c42add..caf47ad6fc 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -1126,14 +1126,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
                       (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
                       LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC |
                       LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE);
-        /*
-         * If we have a virtual hypervisor, we need to bring back RMLS. It
-         * doesn't exist on an actual P9 but that's all we know how to
-         * configure with softmmu at the moment
-         */
-        if (cpu->vhyp) {
-            lpcr |= (val & LPCR_RMLS);
-        }
         break;
     default:
         g_assert_not_reached();
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 07/18] target/ppc: Remove RMOR register from POWER9 & POWER10
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (5 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 06/18] spapr, ppc: Remove VPM0/RMLS hacks for POWER9 David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25 11:30   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 08/18] target/ppc: Use class fields to simplify LPCR masking David Gibson
                   ` (10 subsequent siblings)
  17 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

Currently we create the Real Mode Offset Register (RMOR) on all Book3S cpus
from POWER7 onwards.  However the translation mode which the RMOR controls
is no longer supported in POWER9, and so the register has been removed from
the architecture.

Remove it from our model on POWER9 and POWER10.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
---
 target/ppc/translate_init.inc.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index ab79975fec..925bc31ca5 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -8015,12 +8015,16 @@ static void gen_spr_book3s_ids(CPUPPCState *env)
                  SPR_NOACCESS, SPR_NOACCESS,
                  &spr_read_generic, &spr_write_generic,
                  0x00000000);
-    spr_register_hv(env, SPR_RMOR, "RMOR",
+    spr_register_hv(env, SPR_HRMOR, "HRMOR",
                  SPR_NOACCESS, SPR_NOACCESS,
                  SPR_NOACCESS, SPR_NOACCESS,
                  &spr_read_generic, &spr_write_generic,
                  0x00000000);
-    spr_register_hv(env, SPR_HRMOR, "HRMOR",
+}
+
+static void gen_spr_rmor(CPUPPCState *env)
+{
+    spr_register_hv(env, SPR_RMOR, "RMOR",
                  SPR_NOACCESS, SPR_NOACCESS,
                  SPR_NOACCESS, SPR_NOACCESS,
                  &spr_read_generic, &spr_write_generic,
@@ -8535,6 +8539,7 @@ static void init_proc_POWER7(CPUPPCState *env)
 
     /* POWER7 Specific Registers */
     gen_spr_book3s_ids(env);
+    gen_spr_rmor(env);
     gen_spr_amr(env);
     gen_spr_book3s_purr(env);
     gen_spr_power5p_common(env);
@@ -8676,6 +8681,7 @@ static void init_proc_POWER8(CPUPPCState *env)
 
     /* POWER8 Specific Registers */
     gen_spr_book3s_ids(env);
+    gen_spr_rmor(env);
     gen_spr_amr(env);
     gen_spr_iamr(env);
     gen_spr_book3s_purr(env);
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 08/18] target/ppc: Use class fields to simplify LPCR masking
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (6 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 07/18] target/ppc: Remove RMOR register from POWER9 & POWER10 David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25 15:48   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS] David Gibson
                   ` (9 subsequent siblings)
  17 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

When we store the Logical Partitioning Control Register (LPCR) we have a
big switch statement to work out which are valid bits for the cpu model
we're emulating.

As well as being ugly, this isn't really conceptually correct, since it is
based on the mmu_model variable, whereas the LPCR isn't (only) about the
MMU, so mmu_model is basically just acting as a proxy for the cpu model.

Handle this in a simpler way, by adding a suitable lpcr_mask to the QOM
class.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
---
 target/ppc/cpu-qom.h            |  1 +
 target/ppc/mmu-hash64.c         | 36 ++-------------------------------
 target/ppc/translate_init.inc.c | 27 +++++++++++++++++++++----
 3 files changed, 26 insertions(+), 38 deletions(-)

diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
index e499575dc8..15d6b54a7d 100644
--- a/target/ppc/cpu-qom.h
+++ b/target/ppc/cpu-qom.h
@@ -177,6 +177,7 @@ typedef struct PowerPCCPUClass {
     uint64_t insns_flags;
     uint64_t insns_flags2;
     uint64_t msr_mask;
+    uint64_t lpcr_mask;         /* Available bits in the LPCR */
     uint64_t lpcr_pm;           /* Power-saving mode Exit Cause Enable bits */
     powerpc_mmu_t   mmu_model;
     powerpc_excp_t  excp_model;
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index caf47ad6fc..0ef330a614 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -1095,42 +1095,10 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
 
 void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
 {
+    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     CPUPPCState *env = &cpu->env;
-    uint64_t lpcr = 0;
 
-    /* Filter out bits */
-    switch (env->mmu_model) {
-    case POWERPC_MMU_2_03: /* P5p */
-        lpcr = val & (LPCR_RMLS | LPCR_ILE |
-                      LPCR_LPES0 | LPCR_LPES1 |
-                      LPCR_RMI | LPCR_HDICE);
-        break;
-    case POWERPC_MMU_2_06: /* P7 */
-        lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
-                      LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
-                      LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
-                      LPCR_MER | LPCR_TC |
-                      LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE);
-        break;
-    case POWERPC_MMU_2_07: /* P8 */
-        lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
-                      LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
-                      LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
-                      LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 |
-                      LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE);
-        break;
-    case POWERPC_MMU_3_00: /* P9 */
-        lpcr = val & (LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
-                      (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
-                      LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
-                      (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
-                      LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC |
-                      LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE);
-        break;
-    default:
-        g_assert_not_reached();
-    }
-    env->spr[SPR_LPCR] = lpcr;
+    env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
     ppc_hash64_update_rmls(cpu);
     ppc_hash64_update_vrma(cpu);
 }
diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
index 925bc31ca5..5b7a5226e1 100644
--- a/target/ppc/translate_init.inc.c
+++ b/target/ppc/translate_init.inc.c
@@ -8476,6 +8476,8 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
                     (1ull << MSR_DR) |
                     (1ull << MSR_PMM) |
                     (1ull << MSR_RI);
+    pcc->lpcr_mask = LPCR_RMLS | LPCR_ILE | LPCR_LPES0 | LPCR_LPES1 |
+        LPCR_RMI | LPCR_HDICE;
     pcc->mmu_model = POWERPC_MMU_2_03;
 #if defined(CONFIG_SOFTMMU)
     pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
@@ -8653,6 +8655,12 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
                     (1ull << MSR_PMM) |
                     (1ull << MSR_RI) |
                     (1ull << MSR_LE);
+    pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
+        LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
+        LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
+        LPCR_MER | LPCR_TC |
+        LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE;
+    pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
     pcc->mmu_model = POWERPC_MMU_2_06;
 #if defined(CONFIG_SOFTMMU)
     pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
@@ -8669,7 +8677,6 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
     pcc->l1_dcache_size = 0x8000;
     pcc->l1_icache_size = 0x8000;
     pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
-    pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
 }
 
 static void init_proc_POWER8(CPUPPCState *env)
@@ -8825,6 +8832,13 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
                     (1ull << MSR_TS0) |
                     (1ull << MSR_TS1) |
                     (1ull << MSR_LE);
+    pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
+        LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
+        LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
+        LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 |
+        LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE;
+    pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
+                   LPCR_P8_PECE3 | LPCR_P8_PECE4;
     pcc->mmu_model = POWERPC_MMU_2_07;
 #if defined(CONFIG_SOFTMMU)
     pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
@@ -8842,8 +8856,6 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
     pcc->l1_dcache_size = 0x8000;
     pcc->l1_icache_size = 0x8000;
     pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
-    pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
-                   LPCR_P8_PECE3 | LPCR_P8_PECE4;
 }
 
 #ifdef CONFIG_SOFTMMU
@@ -9036,6 +9048,14 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
                     (1ull << MSR_PMM) |
                     (1ull << MSR_RI) |
                     (1ull << MSR_LE);
+    pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
+        (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
+        LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
+        (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
+                             LPCR_DEE | LPCR_OEE))
+        | LPCR_MER | LPCR_GTSE | LPCR_TC |
+        LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE;
+    pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
     pcc->mmu_model = POWERPC_MMU_3_00;
 #if defined(CONFIG_SOFTMMU)
     pcc->handle_mmu_fault = ppc64_v3_handle_mmu_fault;
@@ -9055,7 +9075,6 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
     pcc->l1_dcache_size = 0x8000;
     pcc->l1_icache_size = 0x8000;
     pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
-    pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
 }
 
 #ifdef CONFIG_SOFTMMU
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS]
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (7 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 08/18] target/ppc: Use class fields to simplify LPCR masking David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25 17:05   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 10/18] target/ppc: Correct RMLS table David Gibson
                   ` (8 subsequent siblings)
  17 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

Currently we use a big switch statement in ppc_hash64_update_rmls() to work
out what the right RMA limit is based on the LPCR[RMLS] field.  There's no
formula for this - it's just an arbitrary mapping defined by the existing
CPU implementations - but we can make it a bit more readable by using a
lookup table rather than a switch.  In addition we can use the MiB/GiB
symbols to make it a bit clearer.

While there we add a bit of clarity and rationale to the comment about
what happens if the LPCR[RMLS] doesn't contain a valid value.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
---
 target/ppc/mmu-hash64.c | 71 ++++++++++++++++++++---------------------
 1 file changed, 35 insertions(+), 36 deletions(-)

diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index 0ef330a614..4f082d775d 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -18,6 +18,7 @@
  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  */
 #include "qemu/osdep.h"
+#include "qemu/units.h"
 #include "cpu.h"
 #include "exec/exec-all.h"
 #include "exec/helper-proto.h"
@@ -757,6 +758,39 @@ static void ppc_hash64_set_c(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte1)
     stb_phys(CPU(cpu)->as, base + offset, (pte1 & 0xff) | 0x80);
 }
 
+static target_ulong rmls_limit(PowerPCCPU *cpu)
+{
+    CPUPPCState *env = &cpu->env;
+    /*
+     * This is the full 4 bits encoding of POWER8. Previous
+     * CPUs only support a subset of these but the filtering
+     * is done when writing LPCR
+     */
+    const target_ulong rma_sizes[] = {
+        [0] = 0,
+        [1] = 16 * GiB,
+        [2] = 1 * GiB,
+        [3] = 64 * MiB,
+        [4] = 256 * MiB,
+        [5] = 0,
+        [6] = 0,
+        [7] = 128 * MiB,
+        [8] = 32 * MiB,
+    };
+    target_ulong rmls = (env->spr[SPR_LPCR] & LPCR_RMLS) >> LPCR_RMLS_SHIFT;
+
+    if (rmls < ARRAY_SIZE(rma_sizes)) {
+        return rma_sizes[rmls];
+    } else {
+        /*
+         * Bad value, so the OS has shot itself in the foot.  Return a
+         * 0-sized RMA which we expect to trigger an immediate DSI or
+         * ISI
+         */
+        return 0;
+    }
+}
+
 int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
                                 int rwx, int mmu_idx)
 {
@@ -1006,41 +1040,6 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex,
     cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH;
 }
 
-static void ppc_hash64_update_rmls(PowerPCCPU *cpu)
-{
-    CPUPPCState *env = &cpu->env;
-    uint64_t lpcr = env->spr[SPR_LPCR];
-
-    /*
-     * This is the full 4 bits encoding of POWER8. Previous
-     * CPUs only support a subset of these but the filtering
-     * is done when writing LPCR
-     */
-    switch ((lpcr & LPCR_RMLS) >> LPCR_RMLS_SHIFT) {
-    case 0x8: /* 32MB */
-        env->rmls = 0x2000000ull;
-        break;
-    case 0x3: /* 64MB */
-        env->rmls = 0x4000000ull;
-        break;
-    case 0x7: /* 128MB */
-        env->rmls = 0x8000000ull;
-        break;
-    case 0x4: /* 256MB */
-        env->rmls = 0x10000000ull;
-        break;
-    case 0x2: /* 1GB */
-        env->rmls = 0x40000000ull;
-        break;
-    case 0x1: /* 16GB */
-        env->rmls = 0x400000000ull;
-        break;
-    default:
-        /* What to do here ??? */
-        env->rmls = 0;
-    }
-}
-
 static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
 {
     CPUPPCState *env = &cpu->env;
@@ -1099,7 +1098,7 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
     CPUPPCState *env = &cpu->env;
 
     env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
-    ppc_hash64_update_rmls(cpu);
+    env->rmls = rmls_limit(cpu);
     ppc_hash64_update_vrma(cpu);
 }
 
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 10/18] target/ppc: Correct RMLS table
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (8 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS] David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-26  8:23   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 11/18] target/ppc: Only calculate RMLS derived RMA limit on demand David Gibson
                   ` (7 subsequent siblings)
  17 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

The table of RMA limits based on the LPCR[RMLS] field is slightly wrong.
We're missing the RMLS == 0 => 256 GiB RMA option, which is available on
POWER8, so add that.

The comment that goes with the table is much more wrong.  We *don't* filter
invalid RMLS values when writing the LPCR, and there's not really a
sensible way to do so.  Furthermore, while in theory the set of RMLS values
is implementation dependent, it seems in practice the same set has been
available since around POWER4+ up until POWER8, the last model which
supports RMLS at all.  So, correct that as well.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
---
 target/ppc/mmu-hash64.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index 4f082d775d..dd0df6fd01 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -762,12 +762,12 @@ static target_ulong rmls_limit(PowerPCCPU *cpu)
 {
     CPUPPCState *env = &cpu->env;
     /*
-     * This is the full 4 bits encoding of POWER8. Previous
-     * CPUs only support a subset of these but the filtering
-     * is done when writing LPCR
+     * In theory the meanings of RMLS values are implementation
+     * dependent.  In practice, this seems to have been the set from
+     * POWER4+..POWER8, and RMLS is no longer supported in POWER9.
      */
     const target_ulong rma_sizes[] = {
-        [0] = 0,
+        [0] = 256 * GiB,
         [1] = 16 * GiB,
         [2] = 1 * GiB,
         [3] = 64 * MiB,
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 11/18] target/ppc: Only calculate RMLS derived RMA limit on demand
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (9 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 10/18] target/ppc: Correct RMLS table David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-26 13:24   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 12/18] target/ppc: Don't store VRMA SLBE persistently David Gibson
                   ` (6 subsequent siblings)
  17 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

When the LPCR is written, we update the env->rmls field with the RMA limit
it implies.  Simplify things by just calculating the value directly from
the LPCR value when we need it.

It's possible this is a little slower, but it's unlikely to be significant,
since this is only for real mode accesses in a translation configuration
that's not used very often, and the whole thing is behind the qemu TLB
anyway.  Therefore, keeping the number of state variables down and not
having to worry about making sure it's always in sync seems the better
option.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
---
 target/ppc/cpu.h        |  1 -
 target/ppc/mmu-hash64.c | 84 ++++++++++++++++++++---------------------
 2 files changed, 40 insertions(+), 45 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 8077fdb068..f9871b1233 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -1046,7 +1046,6 @@ struct CPUPPCState {
     uint64_t insns_flags2;
 #if defined(TARGET_PPC64)
     ppc_slb_t vrma_slb;
-    target_ulong rmls;
 #endif
 
     int error_code;
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index dd0df6fd01..ac21c14f68 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -791,6 +791,35 @@ static target_ulong rmls_limit(PowerPCCPU *cpu)
     }
 }
 
+static int build_vrma_slbe(PowerPCCPU *cpu, ppc_slb_t *slb)
+{
+    CPUPPCState *env = &cpu->env;
+    target_ulong lpcr = env->spr[SPR_LPCR];
+    uint32_t vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT;
+    target_ulong vsid = SLB_VSID_VRMA | ((vrmasd << 4) & SLB_VSID_LLP_MASK);
+    int i;
+
+    for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
+        const PPCHash64SegmentPageSizes *sps = &cpu->hash64_opts->sps[i];
+
+        if (!sps->page_shift) {
+            break;
+        }
+
+        if ((vsid & SLB_VSID_LLP_MASK) == sps->slb_enc) {
+            slb->esid = SLB_ESID_V;
+            slb->vsid = vsid;
+            slb->sps = sps;
+            return 0;
+        }
+    }
+
+    error_report("Bad page size encoding in LPCR[VRMASD]; LPCR=0x"
+                 TARGET_FMT_lx"\n", lpcr);
+
+    return -1;
+}
+
 int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
                                 int rwx, int mmu_idx)
 {
@@ -844,8 +873,10 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
 
             goto skip_slb_search;
         } else {
+            target_ulong limit = rmls_limit(cpu);
+
             /* Emulated old-style RMO mode, bounds check against RMLS */
-            if (raddr >= env->rmls) {
+            if (raddr >= limit) {
                 if (rwx == 2) {
                     ppc_hash64_set_isi(cs, SRR1_PROTFAULT);
                 } else {
@@ -1007,8 +1038,9 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
                 return -1;
             }
         } else {
+            target_ulong limit = rmls_limit(cpu);
             /* Emulated old-style RMO mode, bounds check against RMLS */
-            if (raddr >= env->rmls) {
+            if (raddr >= limit) {
                 return -1;
             }
             return raddr | env->spr[SPR_RMOR];
@@ -1043,53 +1075,18 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex,
 static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
 {
     CPUPPCState *env = &cpu->env;
-    const PPCHash64SegmentPageSizes *sps = NULL;
-    target_ulong esid, vsid, lpcr;
     ppc_slb_t *slb = &env->vrma_slb;
-    uint32_t vrmasd;
-    int i;
-
-    /* First clear it */
-    slb->esid = slb->vsid = 0;
-    slb->sps = NULL;
 
     /* Is VRMA enabled ? */
-    if (!ppc_hash64_use_vrma(env)) {
-        return;
-    }
-
-    /*
-     * Make one up. Mostly ignore the ESID which will not be needed
-     * for translation
-     */
-    lpcr = env->spr[SPR_LPCR];
-    vsid = SLB_VSID_VRMA;
-    vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT;
-    vsid |= (vrmasd << 4) & (SLB_VSID_L | SLB_VSID_LP);
-    esid = SLB_ESID_V;
-
-    for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
-        const PPCHash64SegmentPageSizes *sps1 = &cpu->hash64_opts->sps[i];
-
-        if (!sps1->page_shift) {
-            break;
+    if (ppc_hash64_use_vrma(env)) {
+        if (build_vrma_slbe(cpu, slb) == 0) {
+            return;
         }
-
-        if ((vsid & SLB_VSID_LLP_MASK) == sps1->slb_enc) {
-            sps = sps1;
-            break;
-        }
-    }
-
-    if (!sps) {
-        error_report("Bad page size encoding esid 0x"TARGET_FMT_lx
-                     " vsid 0x"TARGET_FMT_lx, esid, vsid);
-        return;
     }
 
-    slb->vsid = vsid;
-    slb->esid = esid;
-    slb->sps = sps;
+    /* Otherwise, clear it to indicate error */
+    slb->esid = slb->vsid = 0;
+    slb->sps = NULL;
 }
 
 void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
@@ -1098,7 +1095,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
     CPUPPCState *env = &cpu->env;
 
     env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
-    env->rmls = rmls_limit(cpu);
     ppc_hash64_update_vrma(cpu);
 }
 
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 12/18] target/ppc: Don't store VRMA SLBE persistently
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (10 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 11/18] target/ppc: Only calculate RMLS derived RMA limit on demand David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25  0:25   ` Fabiano Rosas
  2020-02-26 13:29   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 13/18] spapr: Don't use weird units for MIN_RMA_SLOF David Gibson
                   ` (5 subsequent siblings)
  17 siblings, 2 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

Currently, we construct the SLBE used for VRMA translations when the LPCR
is written (which controls some bits in the SLBE), then use it later for
translations.

This is a bit complex and confusing - simplify it by simply constructing
the SLBE directly from the LPCR when we need it.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 target/ppc/cpu.h        |  3 ---
 target/ppc/mmu-hash64.c | 28 ++++++----------------------
 2 files changed, 6 insertions(+), 25 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index f9871b1233..5a55fb02bd 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -1044,9 +1044,6 @@ struct CPUPPCState {
     uint32_t flags;
     uint64_t insns_flags;
     uint64_t insns_flags2;
-#if defined(TARGET_PPC64)
-    ppc_slb_t vrma_slb;
-#endif
 
     int error_code;
     uint32_t pending_interrupts;
diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
index ac21c14f68..f8bf92aa2e 100644
--- a/target/ppc/mmu-hash64.c
+++ b/target/ppc/mmu-hash64.c
@@ -825,6 +825,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
 {
     CPUState *cs = CPU(cpu);
     CPUPPCState *env = &cpu->env;
+    ppc_slb_t vrma_slbe;
     ppc_slb_t *slb;
     unsigned apshift;
     hwaddr ptex;
@@ -863,8 +864,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
             }
         } else if (ppc_hash64_use_vrma(env)) {
             /* Emulated VRMA mode */
-            slb = &env->vrma_slb;
-            if (!slb->sps) {
+            slb = &vrma_slbe;
+            if (build_vrma_slbe(cpu, slb) != 0) {
                 /* Invalid VRMA setup, machine check */
                 cs->exception_index = POWERPC_EXCP_MCHECK;
                 env->error_code = 0;
@@ -1012,6 +1013,7 @@ skip_slb_search:
 hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
 {
     CPUPPCState *env = &cpu->env;
+    ppc_slb_t vrma_slbe;
     ppc_slb_t *slb;
     hwaddr ptex, raddr;
     ppc_hash_pte64_t pte;
@@ -1033,8 +1035,8 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
             return raddr | env->spr[SPR_HRMOR];
         } else if (ppc_hash64_use_vrma(env)) {
             /* Emulated VRMA mode */
-            slb = &env->vrma_slb;
-            if (!slb->sps) {
+            slb = &vrma_slbe;
+            if (build_vrma_slbe(cpu, slb) != 0) {
                 return -1;
             }
         } else {
@@ -1072,30 +1074,12 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex,
     cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH;
 }
 
-static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
-{
-    CPUPPCState *env = &cpu->env;
-    ppc_slb_t *slb = &env->vrma_slb;
-
-    /* Is VRMA enabled ? */
-    if (ppc_hash64_use_vrma(env)) {
-        if (build_vrma_slbe(cpu, slb) == 0) {
-            return;
-        }
-    }
-
-    /* Otherwise, clear it to indicate error */
-    slb->esid = slb->vsid = 0;
-    slb->sps = NULL;
-}
-
 void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
 {
     PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
     CPUPPCState *env = &cpu->env;
 
     env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
-    ppc_hash64_update_vrma(cpu);
 }
 
 void helper_store_lpcr(CPUPPCState *env, target_ulong val)
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 13/18] spapr: Don't use weird units for MIN_RMA_SLOF
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (11 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 12/18] target/ppc: Don't store VRMA SLBE persistently David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25  7:49   ` Cédric Le Goater
  2020-02-26 13:32   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 14/18] spapr,ppc: Simplify signature of kvmppc_rma_size() David Gibson
                   ` (4 subsequent siblings)
  17 siblings, 2 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

MIN_RMA_SLOF records the minimum about of RMA that the SLOF firmware
requires.  It lets us give a meaningful error if the RMA ends up too small,
rather than just letting SLOF crash.

It's currently stored as a number of megabytes, which is strange for global
constants.  Move that megabyte scaling into the definition of the constant
like most other things use.

Change from M to MiB in the associated message while we're at it.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 828e2cc135..272a270b7a 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -103,7 +103,7 @@
 #define FW_OVERHEAD             0x2800000
 #define KERNEL_LOAD_ADDR        FW_MAX_SIZE
 
-#define MIN_RMA_SLOF            128UL
+#define MIN_RMA_SLOF            (128 * MiB)
 
 #define PHANDLE_INTC            0x00001111
 
@@ -2959,10 +2959,10 @@ static void spapr_machine_init(MachineState *machine)
         }
     }
 
-    if (spapr->rma_size < (MIN_RMA_SLOF * MiB)) {
+    if (spapr->rma_size < MIN_RMA_SLOF) {
         error_report(
-            "pSeries SLOF firmware requires >= %ldM guest RMA (Real Mode Area memory)",
-            MIN_RMA_SLOF);
+            "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area memory)",
+            MIN_RMA_SLOF / MiB);
         exit(1);
     }
 
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 14/18] spapr,ppc: Simplify signature of kvmppc_rma_size()
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (12 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 13/18] spapr: Don't use weird units for MIN_RMA_SLOF David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-24 23:37 ` [PATCH v6 15/18] spapr: Don't attempt to clamp RMA to VRMA constraint David Gibson
                   ` (3 subsequent siblings)
  17 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, Cedric Le Goater,
	paulus, Paolo Bonzini, Edgar E. Iglesias, David Gibson

This function calculates the maximum size of the RMA as implied by the
host's page size of structure of the VRMA (there are a number of other
constraints on the RMA size which will supersede this one in many
circumstances).

The current interface takes the current RMA size estimate, and clamps it
to the VRMA derived size.  The only current caller passes in an arguably
wrong value (it will match the current RMA estimate in some but not all
cases).

We want to fix that, but for now just keep concerns separated by having the
KVM helper function just return the VRMA derived limit, and let the caller
combine it with other constraints.  We call the new function
kvmppc_vrma_limit() to more clearly indicate its limited responsibility.

The helper should only ever be called in the KVM enabled case, so replace
its !CONFIG_KVM stub with an assert() rather than a dummy value.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Cedric Le Goater <clg@fr.ibm.com>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 hw/ppc/spapr.c       | 5 +++--
 target/ppc/kvm.c     | 5 ++---
 target/ppc/kvm_ppc.h | 7 +++----
 3 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 272a270b7a..b68d80ba69 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1586,8 +1586,9 @@ void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr)
     spapr_reallocate_hpt(spapr, hpt_shift, &error_fatal);
 
     if (spapr->vrma_adjust) {
-        spapr->rma_size = kvmppc_rma_size(spapr_node0_size(MACHINE(spapr)),
-                                          spapr->htab_shift);
+        hwaddr vrma_limit = kvmppc_vrma_limit(spapr->htab_shift);
+
+        spapr->rma_size = MIN(spapr_node0_size(MACHINE(spapr)), vrma_limit);
     }
 }
 
diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
index 7f44b1aa1a..597f72be1b 100644
--- a/target/ppc/kvm.c
+++ b/target/ppc/kvm.c
@@ -2113,7 +2113,7 @@ void kvmppc_error_append_smt_possible_hint(Error *const *errp)
 
 
 #ifdef TARGET_PPC64
-uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift)
+uint64_t kvmppc_vrma_limit(unsigned int hash_shift)
 {
     struct kvm_ppc_smmu_info info;
     long rampagesize, best_page_shift;
@@ -2140,8 +2140,7 @@ uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift)
         }
     }
 
-    return MIN(current_size,
-               1ULL << (best_page_shift + hash_shift - 7));
+    return 1ULL << (best_page_shift + hash_shift - 7);
 }
 #endif
 
diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
index 9e4f2357cc..332fa0aa1c 100644
--- a/target/ppc/kvm_ppc.h
+++ b/target/ppc/kvm_ppc.h
@@ -47,7 +47,7 @@ void *kvmppc_create_spapr_tce(uint32_t liobn, uint32_t page_shift,
                               int *pfd, bool need_vfio);
 int kvmppc_remove_spapr_tce(void *table, int pfd, uint32_t window_size);
 int kvmppc_reset_htab(int shift_hint);
-uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift);
+uint64_t kvmppc_vrma_limit(unsigned int hash_shift);
 bool kvmppc_has_cap_spapr_vfio(void);
 #endif /* !CONFIG_USER_ONLY */
 bool kvmppc_has_cap_epr(void);
@@ -255,10 +255,9 @@ static inline int kvmppc_reset_htab(int shift_hint)
     return 0;
 }
 
-static inline uint64_t kvmppc_rma_size(uint64_t current_size,
-                                       unsigned int hash_shift)
+static inline uint64_t kvmppc_vrma_limit(unsigned int hash_shift)
 {
-    return ram_size;
+    g_assert_not_reached();
 }
 
 static inline bool kvmppc_hpt_needs_host_contiguous_pages(void)
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 15/18] spapr: Don't attempt to clamp RMA to VRMA constraint
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (13 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 14/18] spapr,ppc: Simplify signature of kvmppc_rma_size() David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-24 23:37 ` [PATCH v6 16/18] spapr: Don't clamp RMA to 16GiB on new machine types David Gibson
                   ` (2 subsequent siblings)
  17 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

The Real Mode Area (RMA) is the part of memory which a guest can access
when in real (MMU off) mode.  Of course, for a guest under KVM, the MMU
isn't really turned off, it's just in a special translation mode - Virtual
Real Mode Area (VRMA) - which looks like real mode in guest mode.

The mechanics of how this works when using the hash MMU (HPT) put a
constraint on the size of the RMA, which depends on the size of the
HPT.  So, the latter part of spapr_setup_hpt_and_vrma() clamps the RMA
we advertise to the guest based on this VRMA limit.

There are several things wrong with this:
 1) spapr_setup_hpt_and_vrma() doesn't actually clamp, it takes the minimum
    of Node 0 memory size and the VRMA limit.  That will *often* work the
    same as clamping, but there can be other constraints on RMA size which
    supersede Node 0 memory size.  We have real bugs caused by this
    (currently worked around in the guest kernel)
 2) Some callers of spapr_setup_hpt_and_vrma() are in a situation where
    we're past the point that we can actually advertise an RMA limit to the
    guest
 3) But most fundamentally, the VRMA limit depends on host configuration
    (page size) which shouldn't be visible to the guest, but this partially
    exposes it.  This can cause problems with migration in certain edge
    cases, although we will mostly get away with it.

In practice, this clamping is almost never applied anyway.  With 64kiB
pages and the normal rules for sizing of the HPT, the theoretical VRMA
limit will be 4x(guest memory size) and so never hit.  It will hit with
4kiB pages, where it will be (guest memory size)/4.  However all mainstream
distro kernels for POWER have used a 64kiB page size for at least 10 years.

So, simply replace this logic with a check that the RMA we've calculated
based only on guest visible configuration will fit within the host implied
VRMA limit.  This can break if running HPT guests on a host kernel with
4kiB page size.  As noted that's very rare.  There also exist several
possible workarounds:
  * Change the host kernel to use 64kiB pages
  * Use radix MMU (RPT) guests instead of HPT
  * Use 64kiB hugepages on the host to back guest memory
  * Increase the guest memory size so that the RMA hits one of the fixed
    limits before the RMA limit.  This is relatively easy on POWER8 which
    has a 16GiB limit, harder on POWER9 which has a 1TiB limit.
  * Use a guest NUMA configuration which artificially constrains the RMA
    within the VRMA limit (the RMA must always fit within Node 0).

Previously, on KVM, we also temporarily reduced the rma_size to 256M so
that the we'd load the kernel and initrd safely, regardless of the VRMA
limit.  This was a) confusing, b) could significantly limit the size of
images we could load and c) introduced a behavioural difference between
KVM and TCG.  So we remove that as well.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Reviewed-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
 hw/ppc/spapr.c         | 28 ++++++++++------------------
 hw/ppc/spapr_hcall.c   |  4 ++--
 include/hw/ppc/spapr.h |  3 +--
 3 files changed, 13 insertions(+), 22 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index b68d80ba69..4dab489931 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1569,7 +1569,7 @@ void spapr_reallocate_hpt(SpaprMachineState *spapr, int shift,
     spapr_set_all_lpcrs(0, LPCR_HR | LPCR_UPRT);
 }
 
-void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr)
+void spapr_setup_hpt(SpaprMachineState *spapr)
 {
     int hpt_shift;
 
@@ -1585,10 +1585,16 @@ void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr)
     }
     spapr_reallocate_hpt(spapr, hpt_shift, &error_fatal);
 
-    if (spapr->vrma_adjust) {
+    if (kvm_enabled()) {
         hwaddr vrma_limit = kvmppc_vrma_limit(spapr->htab_shift);
 
-        spapr->rma_size = MIN(spapr_node0_size(MACHINE(spapr)), vrma_limit);
+        /* Check our RMA fits in the possible VRMA */
+        if (vrma_limit < spapr->rma_size) {
+            error_report("Unable to create %" HWADDR_PRIu
+                         "MiB RMA (VRMA only allows %" HWADDR_PRIu "MiB",
+                         spapr->rma_size / MiB, vrma_limit / MiB);
+            exit(EXIT_FAILURE);
+        }
     }
 }
 
@@ -1628,7 +1634,7 @@ static void spapr_machine_reset(MachineState *machine)
         spapr->patb_entry = PATE1_GR;
         spapr_set_all_lpcrs(LPCR_HR | LPCR_UPRT, LPCR_HR | LPCR_UPRT);
     } else {
-        spapr_setup_hpt_and_vrma(spapr);
+        spapr_setup_hpt(spapr);
     }
 
     qemu_devices_reset();
@@ -2696,20 +2702,6 @@ static void spapr_machine_init(MachineState *machine)
 
     spapr->rma_size = node0_size;
 
-    /* With KVM, we don't actually know whether KVM supports an
-     * unbounded RMA (PR KVM) or is limited by the hash table size
-     * (HV KVM using VRMA), so we always assume the latter
-     *
-     * In that case, we also limit the initial allocations for RTAS
-     * etc... to 256M since we have no way to know what the VRMA size
-     * is going to be as it depends on the size of the hash table
-     * which isn't determined yet.
-     */
-    if (kvm_enabled()) {
-        spapr->vrma_adjust = 1;
-        spapr->rma_size = MIN(spapr->rma_size, 0x10000000);
-    }
-
     /* Actually we don't support unbounded RMA anymore since we added
      * proper emulation of HV mode. The max we can get is 16G which
      * also happens to be what we configure for PAPR mode so make sure
diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
index 6db3dbde9c..11e8a4f153 100644
--- a/hw/ppc/spapr_hcall.c
+++ b/hw/ppc/spapr_hcall.c
@@ -1458,7 +1458,7 @@ static void spapr_check_setup_free_hpt(SpaprMachineState *spapr,
         spapr_free_hpt(spapr);
     } else if (!(patbe_new & PATE1_GR)) {
         /* RADIX->HASH || NOTHING->HASH : Allocate HPT */
-        spapr_setup_hpt_and_vrma(spapr);
+        spapr_setup_hpt(spapr);
     }
     return;
 }
@@ -1846,7 +1846,7 @@ static target_ulong h_client_architecture_support(PowerPCCPU *cpu,
          * (because the guest isn't going to use radix) then set it up here. */
         if ((spapr->patb_entry & PATE1_GR) && !guest_radix) {
             /* legacy hash or new hash: */
-            spapr_setup_hpt_and_vrma(spapr);
+            spapr_setup_hpt(spapr);
         }
 
         if (fdt_bufsize < sizeof(hdr)) {
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 09110961a5..fc49c1a710 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -156,7 +156,6 @@ struct SpaprMachineState {
     SpaprPendingHpt *pending_hpt; /* in-progress resize */
 
     hwaddr rma_size;
-    int vrma_adjust;
     uint32_t fdt_size;
     uint32_t fdt_initial_size;
     void *fdt_blob;
@@ -795,7 +794,7 @@ void *spapr_build_fdt(SpaprMachineState *spapr, bool reset, size_t space);
 void spapr_events_init(SpaprMachineState *sm);
 void spapr_dt_events(SpaprMachineState *sm, void *fdt);
 void close_htab_fd(SpaprMachineState *spapr);
-void spapr_setup_hpt_and_vrma(SpaprMachineState *spapr);
+void spapr_setup_hpt(SpaprMachineState *spapr);
 void spapr_free_hpt(SpaprMachineState *spapr);
 SpaprTceTable *spapr_tce_new_table(DeviceState *owner, uint32_t liobn);
 void spapr_tce_table_enable(SpaprTceTable *tcet,
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 16/18] spapr: Don't clamp RMA to 16GiB on new machine types
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (14 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 15/18] spapr: Don't attempt to clamp RMA to VRMA constraint David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-24 23:37 ` [PATCH v6 17/18] spapr: Clean up RMA size calculation David Gibson
  2020-02-24 23:37 ` [PATCH v6 18/18] spapr: Fold spapr_node0_size() into its only caller David Gibson
  17 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

In spapr_machine_init() we clamp the size of the RMA to 16GiB and the
comment saying why doesn't make a whole lot of sense.  In fact, this was
done because the real mode handling code elsewhere limited the RMA in TCG
mode to the maximum value configurable in LPCR[RMLS], 16GiB.

But,
 * Actually LPCR[RMLS] has been able to encode a 256GiB size for a very
   long time, we just didn't implement it properly in the softmmu
 * LPCR[RMLS] shouldn't really be relevant anyway, it only was because we
   used to abuse the RMOR based translation mode in order to handle the
   fact that we're not modelling the hypervisor parts of the cpu

We've now removed those limitations in the modelling so the 16GiB clamp no
longer serves a function.  However, we can't just remove the limit
universally: that would break migration to earlier qemu versions, where
the 16GiB RMLS limit still applies, no matter how bad the reasons for it
are.

So, we replace the 16GiB clamp, with a clamp to a limit defined in the
machine type class.  We set it to 16 GiB for machine types 4.2 and earlier,
but set it to 0 meaning unlimited for the new 5.0 machine type.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c         | 13 ++++++++-----
 include/hw/ppc/spapr.h |  1 +
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 4dab489931..6e9f15f64d 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2702,12 +2702,14 @@ static void spapr_machine_init(MachineState *machine)
 
     spapr->rma_size = node0_size;
 
-    /* Actually we don't support unbounded RMA anymore since we added
-     * proper emulation of HV mode. The max we can get is 16G which
-     * also happens to be what we configure for PAPR mode so make sure
-     * we don't do anything bigger than that
+    /*
+     * Clamp the RMA size based on machine type.  This is for
+     * migration compatibility with older qemu versions, which limited
+     * the RMA size for complicated and mostly bad reasons.
      */
-    spapr->rma_size = MIN(spapr->rma_size, 0x400000000ull);
+    if (smc->rma_limit) {
+        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
+    }
 
     if (spapr->rma_size > node0_size) {
         error_report("Numa node 0 has to span the RMA (%#08"HWADDR_PRIx")",
@@ -4600,6 +4602,7 @@ static void spapr_machine_4_2_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
     smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF;
     smc->default_caps.caps[SPAPR_CAP_FWNMI_MCE] = SPAPR_CAP_OFF;
+    smc->rma_limit = 16 * GiB;
     mc->nvdimm_supported = false;
 }
 
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index fc49c1a710..8a44a1f488 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -126,6 +126,7 @@ struct SpaprMachineClass {
     bool pre_4_1_migration; /* don't migrate hpt-max-page-size */
     bool linux_pci_probe;
     bool smp_threads_vsmt; /* set VSMT to smp_threads by default */
+    hwaddr rma_limit;          /* clamp the RMA to this size */
 
     void (*phb_placement)(SpaprMachineState *spapr, uint32_t index,
                           uint64_t *buid, hwaddr *pio, 
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 17/18] spapr: Clean up RMA size calculation
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (15 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 16/18] spapr: Don't clamp RMA to 16GiB on new machine types David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-25 11:07   ` Philippe Mathieu-Daudé
  2020-02-26 13:37   ` Greg Kurz
  2020-02-24 23:37 ` [PATCH v6 18/18] spapr: Fold spapr_node0_size() into its only caller David Gibson
  17 siblings, 2 replies; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

Move the calculation of the Real Mode Area (RMA) size into a helper
function.  While we're there clean it up and correct it in a few ways:
  * Add comments making it clearer where the various constraints come from
  * Remove a pointless check that the RMA fits within Node 0 (we've just
    clamped it so that it does)

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c | 59 ++++++++++++++++++++++++++++++--------------------
 1 file changed, 35 insertions(+), 24 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 6e9f15f64d..f0354b699d 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2648,6 +2648,40 @@ static PCIHostState *spapr_create_default_phb(void)
     return PCI_HOST_BRIDGE(dev);
 }
 
+static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp)
+{
+    MachineState *machine = MACHINE(spapr);
+    hwaddr rma_size = machine->ram_size;
+    hwaddr node0_size = spapr_node0_size(machine);
+
+    /* RMA has to fit in the first NUMA node */
+    rma_size = MIN(rma_size, node0_size);
+
+    /*
+     * VRMA access is via a special 1TiB SLB mapping, so the RMA can
+     * never exceed that
+     */
+    rma_size = MIN(rma_size, TiB);
+
+    /*
+     * Clamp the RMA size based on machine type.  This is for
+     * migration compatibility with older qemu versions, which limited
+     * the RMA size for complicated and mostly bad reasons.
+     */
+    if (smc->rma_limit) {
+        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
+    }
+
+    if (rma_size < (MIN_RMA_SLOF * MiB)) {
+        error_setg(errp,
+"pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area)",
+                   MIN_RMA_SLOF);
+        return -1;
+    }
+
+    return rma_size;
+}
+
 /* pSeries LPAR / sPAPR hardware init */
 static void spapr_machine_init(MachineState *machine)
 {
@@ -2660,7 +2694,6 @@ static void spapr_machine_init(MachineState *machine)
     int i;
     MemoryRegion *sysmem = get_system_memory();
     MemoryRegion *ram = g_new(MemoryRegion, 1);
-    hwaddr node0_size = spapr_node0_size(machine);
     long load_limit, fw_size;
     char *filename;
     Error *resize_hpt_err = NULL;
@@ -2700,22 +2733,7 @@ static void spapr_machine_init(MachineState *machine)
         exit(1);
     }
 
-    spapr->rma_size = node0_size;
-
-    /*
-     * Clamp the RMA size based on machine type.  This is for
-     * migration compatibility with older qemu versions, which limited
-     * the RMA size for complicated and mostly bad reasons.
-     */
-    if (smc->rma_limit) {
-        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
-    }
-
-    if (spapr->rma_size > node0_size) {
-        error_report("Numa node 0 has to span the RMA (%#08"HWADDR_PRIx")",
-                     spapr->rma_size);
-        exit(1);
-    }
+    spapr->rma_size = spapr_rma_size(spapr, &error_fatal);
 
     /* Setup a load limit for the ramdisk leaving room for SLOF and FDT */
     load_limit = MIN(spapr->rma_size, RTAS_MAX_ADDR) - FW_OVERHEAD;
@@ -2954,13 +2972,6 @@ static void spapr_machine_init(MachineState *machine)
         }
     }
 
-    if (spapr->rma_size < MIN_RMA_SLOF) {
-        error_report(
-            "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area memory)",
-            MIN_RMA_SLOF / MiB);
-        exit(1);
-    }
-
     if (kernel_filename) {
         uint64_t lowaddr = 0;
 
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* [PATCH v6 18/18] spapr: Fold spapr_node0_size() into its only caller
  2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
                   ` (16 preceding siblings ...)
  2020-02-24 23:37 ` [PATCH v6 17/18] spapr: Clean up RMA size calculation David Gibson
@ 2020-02-24 23:37 ` David Gibson
  2020-02-26 14:47   ` Greg Kurz
  17 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-24 23:37 UTC (permalink / raw)
  To: groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias, David Gibson

The Real Mode Area (RMA) needs to fit within the NUMA node owning memory
at address 0.  That's usually node 0, but can be a later one if there are
some nodes which have no memory (only CPUs).

This is currently handled by the spapr_node0_size() helper.  It has only
one caller, so there's not a lot of point splitting it out.  It's also
extremely easy to misread the code as clamping to the size of the smallest
node rather than the first node with any memory.

So, fold it into the caller, and add some commentary to make it a bit
clearer exactly what it's doing.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 hw/ppc/spapr.c | 37 +++++++++++++++++++++----------------
 1 file changed, 21 insertions(+), 16 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index f0354b699d..9ba645c9cb 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -296,20 +296,6 @@ static void spapr_populate_pa_features(SpaprMachineState *spapr,
     _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size)));
 }
 
-static hwaddr spapr_node0_size(MachineState *machine)
-{
-    if (machine->numa_state->num_nodes) {
-        int i;
-        for (i = 0; i < machine->numa_state->num_nodes; ++i) {
-            if (machine->numa_state->nodes[i].node_mem) {
-                return MIN(pow2floor(machine->numa_state->nodes[i].node_mem),
-                           machine->ram_size);
-            }
-        }
-    }
-    return machine->ram_size;
-}
-
 static void add_str(GString *s, const gchar *s1)
 {
     g_string_append_len(s, s1, strlen(s1) + 1);
@@ -2652,10 +2638,24 @@ static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp)
 {
     MachineState *machine = MACHINE(spapr);
     hwaddr rma_size = machine->ram_size;
-    hwaddr node0_size = spapr_node0_size(machine);
 
     /* RMA has to fit in the first NUMA node */
-    rma_size = MIN(rma_size, node0_size);
+    if (machine->numa_state->num_nodes) {
+        /*
+         * It's possible for there to be some zero-memory nodes first
+         * in the list.  We need the RMA to fit inside the memory of
+         * the first node which actually has some memory.
+         */
+        int i;
+
+        for (i = 0; i < machine->numa_state->num_nodes; ++i) {
+            if (machine->numa_state->nodes[i].node_mem != 0) {
+                rma_size = MIN(rma_size,
+                               machine->numa_state->nodes[i].node_mem);
+                break;
+            }
+        }
+    }
 
     /*
      * VRMA access is via a special 1TiB SLB mapping, so the RMA can
@@ -2672,6 +2672,11 @@ static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp)
         spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
     }
 
+    /*
+     * RMA size must be a power of 2
+     */
+    rma_size = pow2floor(rma_size);
+
     if (rma_size < (MIN_RMA_SLOF * MiB)) {
         error_setg(errp,
 "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area)",
-- 
2.24.1



^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 05/18] target/ppc: Introduce ppc_hash64_use_vrma() helper
  2020-02-24 23:37 ` [PATCH v6 05/18] target/ppc: Introduce ppc_hash64_use_vrma() helper David Gibson
@ 2020-02-25  0:12   ` Fabiano Rosas
  2020-02-25 10:30   ` Greg Kurz
  1 sibling, 0 replies; 45+ messages in thread
From: Fabiano Rosas @ 2020-02-25  0:12 UTC (permalink / raw)
  To: David Gibson, groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, paulus,
	Paolo Bonzini, Igor Mammedov, David Gibson

David Gibson <david@gibson.dropbear.id.au> writes:

> When running guests under a hypervisor, the hypervisor obviously needs to
> be protected from guest accesses even if those are in what the guest
> considers real mode (translation off).  The POWER hardware provides two
> ways of doing that: The old way has guest real mode accesses simply offset
> and bounds checked into host addresses.  It works, but requires that a
> significant chunk of the guest's memory - the RMA - be physically
> contiguous in the host, which is pretty inconvenient.  The new way, known
> as VRMA, has guest real mode accesses translated in roughly the normal way
> but with some special parameters.
>
> In POWER7 and POWER8 the LPCR[VPM0] bit selected between the two modes, but
> in POWER9 only VRMA mode is supported and LPCR[VPM0] no longer exists.  We
> handle that difference in behaviour in ppc_hash64_set_isi().. but not in
> other places that we blindly check LPCR[VPM0].
>
> Correct those instances with a new helper to tell if we should be in VRMA
> mode.
>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Cédric Le Goater <clg@kaod.org>

Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com>

> ---
>  target/ppc/mmu-hash64.c | 43 ++++++++++++++++++++---------------------
>  1 file changed, 21 insertions(+), 22 deletions(-)
>
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index 392f90e0ae..e372c42add 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -668,6 +668,21 @@ unsigned ppc_hash64_hpte_page_shift_noslb(PowerPCCPU *cpu,
>      return 0;
>  }
>  
> +static bool ppc_hash64_use_vrma(CPUPPCState *env)
> +{
> +    switch (env->mmu_model) {
> +    case POWERPC_MMU_3_00:
> +        /*
> +         * ISAv3.0 (POWER9) always uses VRMA, the VPM0 field and RMOR
> +         * register no longer exist
> +         */
> +        return true;
> +
> +    default:
> +        return !!(env->spr[SPR_LPCR] & LPCR_VPM0);
> +    }
> +}
> +
>  static void ppc_hash64_set_isi(CPUState *cs, uint64_t error_code)
>  {
>      CPUPPCState *env = &POWERPC_CPU(cs)->env;
> @@ -676,15 +691,7 @@ static void ppc_hash64_set_isi(CPUState *cs, uint64_t error_code)
>      if (msr_ir) {
>          vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM1);
>      } else {
> -        switch (env->mmu_model) {
> -        case POWERPC_MMU_3_00:
> -            /* Field deprecated in ISAv3.00 - interrupts always go to hyperv */
> -            vpm = true;
> -            break;
> -        default:
> -            vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM0);
> -            break;
> -        }
> +        vpm = ppc_hash64_use_vrma(env);
>      }
>      if (vpm && !msr_hv) {
>          cs->exception_index = POWERPC_EXCP_HISI;
> @@ -702,15 +709,7 @@ static void ppc_hash64_set_dsi(CPUState *cs, uint64_t dar, uint64_t dsisr)
>      if (msr_dr) {
>          vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM1);
>      } else {
> -        switch (env->mmu_model) {
> -        case POWERPC_MMU_3_00:
> -            /* Field deprecated in ISAv3.00 - interrupts always go to hyperv */
> -            vpm = true;
> -            break;
> -        default:
> -            vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM0);
> -            break;
> -        }
> +        vpm = ppc_hash64_use_vrma(env);
>      }
>      if (vpm && !msr_hv) {
>          cs->exception_index = POWERPC_EXCP_HDSI;
> @@ -799,7 +798,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>              if (!(eaddr >> 63)) {
>                  raddr |= env->spr[SPR_HRMOR];
>              }
> -        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
> +        } else if (ppc_hash64_use_vrma(env)) {
>              /* Emulated VRMA mode */
>              slb = &env->vrma_slb;
>              if (!slb->sps) {
> @@ -967,7 +966,7 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
>          } else if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) {
>              /* In HV mode, add HRMOR if top EA bit is clear */
>              return raddr | env->spr[SPR_HRMOR];
> -        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
> +        } else if (ppc_hash64_use_vrma(env)) {
>              /* Emulated VRMA mode */
>              slb = &env->vrma_slb;
>              if (!slb->sps) {
> @@ -1056,8 +1055,7 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
>      slb->sps = NULL;
>  
>      /* Is VRMA enabled ? */
> -    lpcr = env->spr[SPR_LPCR];
> -    if (!(lpcr & LPCR_VPM0)) {
> +    if (!ppc_hash64_use_vrma(env)) {
>          return;
>      }
>  
> @@ -1065,6 +1063,7 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
>       * Make one up. Mostly ignore the ESID which will not be needed
>       * for translation
>       */
> +    lpcr = env->spr[SPR_LPCR];
>      vsid = SLB_VSID_VRMA;
>      vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT;
>      vsid |= (vrmasd << 4) & (SLB_VSID_L | SLB_VSID_LP);


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 12/18] target/ppc: Don't store VRMA SLBE persistently
  2020-02-24 23:37 ` [PATCH v6 12/18] target/ppc: Don't store VRMA SLBE persistently David Gibson
@ 2020-02-25  0:25   ` Fabiano Rosas
  2020-02-26 13:29   ` Greg Kurz
  1 sibling, 0 replies; 45+ messages in thread
From: Fabiano Rosas @ 2020-02-25  0:25 UTC (permalink / raw)
  To: David Gibson, groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, paulus,
	Paolo Bonzini, Igor Mammedov, David Gibson

David Gibson <david@gibson.dropbear.id.au> writes:

> Currently, we construct the SLBE used for VRMA translations when the LPCR
> is written (which controls some bits in the SLBE), then use it later for
> translations.
>
> This is a bit complex and confusing - simplify it by simply constructing
> the SLBE directly from the LPCR when we need it.
>
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>

Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com>

> ---
>  target/ppc/cpu.h        |  3 ---
>  target/ppc/mmu-hash64.c | 28 ++++++----------------------
>  2 files changed, 6 insertions(+), 25 deletions(-)
>
> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> index f9871b1233..5a55fb02bd 100644
> --- a/target/ppc/cpu.h
> +++ b/target/ppc/cpu.h
> @@ -1044,9 +1044,6 @@ struct CPUPPCState {
>      uint32_t flags;
>      uint64_t insns_flags;
>      uint64_t insns_flags2;
> -#if defined(TARGET_PPC64)
> -    ppc_slb_t vrma_slb;
> -#endif
>  
>      int error_code;
>      uint32_t pending_interrupts;
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index ac21c14f68..f8bf92aa2e 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -825,6 +825,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>  {
>      CPUState *cs = CPU(cpu);
>      CPUPPCState *env = &cpu->env;
> +    ppc_slb_t vrma_slbe;
>      ppc_slb_t *slb;
>      unsigned apshift;
>      hwaddr ptex;
> @@ -863,8 +864,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>              }
>          } else if (ppc_hash64_use_vrma(env)) {
>              /* Emulated VRMA mode */
> -            slb = &env->vrma_slb;
> -            if (!slb->sps) {
> +            slb = &vrma_slbe;
> +            if (build_vrma_slbe(cpu, slb) != 0) {
>                  /* Invalid VRMA setup, machine check */
>                  cs->exception_index = POWERPC_EXCP_MCHECK;
>                  env->error_code = 0;
> @@ -1012,6 +1013,7 @@ skip_slb_search:
>  hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
>  {
>      CPUPPCState *env = &cpu->env;
> +    ppc_slb_t vrma_slbe;
>      ppc_slb_t *slb;
>      hwaddr ptex, raddr;
>      ppc_hash_pte64_t pte;
> @@ -1033,8 +1035,8 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
>              return raddr | env->spr[SPR_HRMOR];
>          } else if (ppc_hash64_use_vrma(env)) {
>              /* Emulated VRMA mode */
> -            slb = &env->vrma_slb;
> -            if (!slb->sps) {
> +            slb = &vrma_slbe;
> +            if (build_vrma_slbe(cpu, slb) != 0) {
>                  return -1;
>              }
>          } else {
> @@ -1072,30 +1074,12 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex,
>      cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH;
>  }
>  
> -static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
> -{
> -    CPUPPCState *env = &cpu->env;
> -    ppc_slb_t *slb = &env->vrma_slb;
> -
> -    /* Is VRMA enabled ? */
> -    if (ppc_hash64_use_vrma(env)) {
> -        if (build_vrma_slbe(cpu, slb) == 0) {
> -            return;
> -        }
> -    }
> -
> -    /* Otherwise, clear it to indicate error */
> -    slb->esid = slb->vsid = 0;
> -    slb->sps = NULL;
> -}
> -
>  void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
>  {
>      PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
>      CPUPPCState *env = &cpu->env;
>  
>      env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
> -    ppc_hash64_update_vrma(cpu);
>  }
>  
>  void helper_store_lpcr(CPUPPCState *env, target_ulong val)


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 02/18] ppc: Remove stub support for 32-bit hypervisor mode
  2020-02-24 23:37 ` [PATCH v6 02/18] ppc: Remove stub support for 32-bit hypervisor mode David Gibson
@ 2020-02-25  6:31   ` Greg Kurz
  0 siblings, 0 replies; 45+ messages in thread
From: Greg Kurz @ 2020-02-25  6:31 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:08 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> a4f30719a8cd, way back in 2007 noted that "PowerPC hypervisor mode is not
> fundamentally available only for PowerPC 64" and added a 32-bit version
> of the MSR[HV] bit.
> 
> But nothing was ever really done with that; there is no meaningful support
> for 32-bit hypervisor mode 13 years later.  Let's stop pretending and just
> remove the stubs.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Fabiano Rosas <farosas@linux.ibm.com>
> ---

Reviewed-by: Greg Kurz <groug@kaod.org>

>  target/ppc/cpu.h                | 21 +++++++--------------
>  target/ppc/translate_init.inc.c |  6 +++---
>  2 files changed, 10 insertions(+), 17 deletions(-)
> 
> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> index b283042515..8077fdb068 100644
> --- a/target/ppc/cpu.h
> +++ b/target/ppc/cpu.h
> @@ -24,8 +24,6 @@
>  #include "exec/cpu-defs.h"
>  #include "cpu-qom.h"
>  
> -/* #define PPC_EMULATE_32BITS_HYPV */
> -
>  #define TCG_GUEST_DEFAULT_MO 0
>  
>  #define TARGET_PAGE_BITS_64K 16
> @@ -300,13 +298,12 @@ typedef struct ppc_v3_pate_t {
>  #define MSR_SF   63 /* Sixty-four-bit mode                            hflags */
>  #define MSR_TAG  62 /* Tag-active mode (POWERx ?)                            */
>  #define MSR_ISF  61 /* Sixty-four-bit interrupt mode on 630                  */
> -#define MSR_SHV  60 /* hypervisor state                               hflags */
> +#define MSR_HV   60 /* hypervisor state                               hflags */
>  #define MSR_TS0  34 /* Transactional state, 2 bits (Book3s)                  */
>  #define MSR_TS1  33
>  #define MSR_TM   32 /* Transactional Memory Available (Book3s)               */
>  #define MSR_CM   31 /* Computation mode for BookE                     hflags */
>  #define MSR_ICM  30 /* Interrupt computation mode for BookE                  */
> -#define MSR_THV  29 /* hypervisor state for 32 bits PowerPC           hflags */
>  #define MSR_GS   28 /* guest state for BookE                                 */
>  #define MSR_UCLE 26 /* User-mode cache lock enable for BookE                 */
>  #define MSR_VR   25 /* altivec available                            x hflags */
> @@ -401,10 +398,13 @@ typedef struct ppc_v3_pate_t {
>  
>  #define msr_sf   ((env->msr >> MSR_SF)   & 1)
>  #define msr_isf  ((env->msr >> MSR_ISF)  & 1)
> -#define msr_shv  ((env->msr >> MSR_SHV)  & 1)
> +#if defined(TARGET_PPC64)
> +#define msr_hv   ((env->msr >> MSR_HV)   & 1)
> +#else
> +#define msr_hv   (0)
> +#endif
>  #define msr_cm   ((env->msr >> MSR_CM)   & 1)
>  #define msr_icm  ((env->msr >> MSR_ICM)  & 1)
> -#define msr_thv  ((env->msr >> MSR_THV)  & 1)
>  #define msr_gs   ((env->msr >> MSR_GS)   & 1)
>  #define msr_ucle ((env->msr >> MSR_UCLE) & 1)
>  #define msr_vr   ((env->msr >> MSR_VR)   & 1)
> @@ -449,16 +449,9 @@ typedef struct ppc_v3_pate_t {
>  
>  /* Hypervisor bit is more specific */
>  #if defined(TARGET_PPC64)
> -#define MSR_HVB (1ULL << MSR_SHV)
> -#define msr_hv  msr_shv
> -#else
> -#if defined(PPC_EMULATE_32BITS_HYPV)
> -#define MSR_HVB (1ULL << MSR_THV)
> -#define msr_hv  msr_thv
> +#define MSR_HVB (1ULL << MSR_HV)
>  #else
>  #define MSR_HVB (0ULL)
> -#define msr_hv  (0)
> -#endif
>  #endif
>  
>  /* DSISR */
> diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
> index 53995f62ea..a0d0eaabf2 100644
> --- a/target/ppc/translate_init.inc.c
> +++ b/target/ppc/translate_init.inc.c
> @@ -8804,7 +8804,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
>                          PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
>                          PPC2_TM | PPC2_PM_ISA206;
>      pcc->msr_mask = (1ull << MSR_SF) |
> -                    (1ull << MSR_SHV) |
> +                    (1ull << MSR_HV) |
>                      (1ull << MSR_TM) |
>                      (1ull << MSR_VR) |
>                      (1ull << MSR_VSX) |
> @@ -9017,7 +9017,7 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
>                          PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
>                          PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
>      pcc->msr_mask = (1ull << MSR_SF) |
> -                    (1ull << MSR_SHV) |
> +                    (1ull << MSR_HV) |
>                      (1ull << MSR_TM) |
>                      (1ull << MSR_VR) |
>                      (1ull << MSR_VSX) |
> @@ -9228,7 +9228,7 @@ POWERPC_FAMILY(POWER10)(ObjectClass *oc, void *data)
>                          PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 |
>                          PPC2_TM | PPC2_ISA300 | PPC2_PRCNTL;
>      pcc->msr_mask = (1ull << MSR_SF) |
> -                    (1ull << MSR_SHV) |
> +                    (1ull << MSR_HV) |
>                      (1ull << MSR_TM) |
>                      (1ull << MSR_VR) |
>                      (1ull << MSR_VSX) |



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 13/18] spapr: Don't use weird units for MIN_RMA_SLOF
  2020-02-24 23:37 ` [PATCH v6 13/18] spapr: Don't use weird units for MIN_RMA_SLOF David Gibson
@ 2020-02-25  7:49   ` Cédric Le Goater
  2020-02-26 13:32   ` Greg Kurz
  1 sibling, 0 replies; 45+ messages in thread
From: Cédric Le Goater @ 2020-02-25  7:49 UTC (permalink / raw)
  To: David Gibson, groug, qemu-ppc, qemu-devel
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, Igor Mammedov, paulus, Paolo Bonzini,
	Edgar E. Iglesias

On 2/25/20 12:37 AM, David Gibson wrote:
> MIN_RMA_SLOF records the minimum about of RMA that the SLOF firmware
> requires.  It lets us give a meaningful error if the RMA ends up too small,
> rather than just letting SLOF crash.
> 
> It's currently stored as a number of megabytes, which is strange for global
> constants.  Move that megabyte scaling into the definition of the constant
> like most other things use.
> 
> Change from M to MiB in the associated message while we're at it.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>

Reviewed-by: Cédric Le Goater <clg@kaod.org>


> ---
>  hw/ppc/spapr.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 828e2cc135..272a270b7a 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -103,7 +103,7 @@
>  #define FW_OVERHEAD             0x2800000
>  #define KERNEL_LOAD_ADDR        FW_MAX_SIZE
>  
> -#define MIN_RMA_SLOF            128UL
> +#define MIN_RMA_SLOF            (128 * MiB)
>  
>  #define PHANDLE_INTC            0x00001111
>  
> @@ -2959,10 +2959,10 @@ static void spapr_machine_init(MachineState *machine)
>          }
>      }
>  
> -    if (spapr->rma_size < (MIN_RMA_SLOF * MiB)) {
> +    if (spapr->rma_size < MIN_RMA_SLOF) {
>          error_report(
> -            "pSeries SLOF firmware requires >= %ldM guest RMA (Real Mode Area memory)",
> -            MIN_RMA_SLOF);
> +            "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area memory)",
> +            MIN_RMA_SLOF / MiB);
>          exit(1);
>      }
>  
> 



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 04/18] target/ppc: Correct handling of real mode accesses with vhyp on hash MMU
  2020-02-24 23:37 ` [PATCH v6 04/18] target/ppc: Correct handling of real mode accesses with vhyp on hash MMU David Gibson
@ 2020-02-25 10:29   ` Greg Kurz
  0 siblings, 0 replies; 45+ messages in thread
From: Greg Kurz @ 2020-02-25 10:29 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:10 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> On ppc we have the concept of virtual hypervisor ("vhyp") mode, where we
> only model the non-hypervisor-privileged parts of the cpu.  Essentially we
> model the hypervisor's behaviour from the point of view of a guest OS, but
> we don't model the hypervisor's execution.
> 
> In particular, in this mode, qemu's notion of target physical address is
> a guest physical address from the vcpu's point of view.  So accesses in
> guest real mode don't require translation.  If we were modelling the
> hypervisor mode, we'd need to translate the guest physical address into
> a host physical address.
> 
> Currently, we handle this sloppily: we rely on setting up the virtual LPCR
> and RMOR registers so that GPAs are simply HPAs plus an offset, which we
> set to zero.  This is already conceptually dubious, since the LPCR and RMOR
> registers don't exist in the non-hypervisor portion of the CPU.  It gets
> worse with POWER9, where RMOR and LPCR[VPM0] no longer exist at all.
> 
> Clean this up by explicitly handling the vhyp case.  While we're there,
> remove some unnecessary nesting of if statements that made the logic to
> select the correct real mode behaviour a bit less clear than it could be.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---

Reviewed-by: Greg Kurz <groug@kaod.org>

>  target/ppc/mmu-hash64.c | 60 ++++++++++++++++++++++++-----------------
>  1 file changed, 35 insertions(+), 25 deletions(-)
> 
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index 3e0be4d55f..392f90e0ae 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -789,27 +789,30 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>           */
>          raddr = eaddr & 0x0FFFFFFFFFFFFFFFULL;
>  
> -        /* In HV mode, add HRMOR if top EA bit is clear */
> -        if (msr_hv || !env->has_hv_mode) {
> +        if (cpu->vhyp) {
> +            /*
> +             * In virtual hypervisor mode, there's nothing to do:
> +             *   EA == GPA == qemu guest address
> +             */
> +        } else if (msr_hv || !env->has_hv_mode) {
> +            /* In HV mode, add HRMOR if top EA bit is clear */
>              if (!(eaddr >> 63)) {
>                  raddr |= env->spr[SPR_HRMOR];
>              }
> -        } else {
> -            /* Otherwise, check VPM for RMA vs VRMA */
> -            if (env->spr[SPR_LPCR] & LPCR_VPM0) {
> -                slb = &env->vrma_slb;
> -                if (slb->sps) {
> -                    goto skip_slb_search;
> -                }
> -                /* Not much else to do here */
> +        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
> +            /* Emulated VRMA mode */
> +            slb = &env->vrma_slb;
> +            if (!slb->sps) {
> +                /* Invalid VRMA setup, machine check */
>                  cs->exception_index = POWERPC_EXCP_MCHECK;
>                  env->error_code = 0;
>                  return 1;
> -            } else if (raddr < env->rmls) {
> -                /* RMA. Check bounds in RMLS */
> -                raddr |= env->spr[SPR_RMOR];
> -            } else {
> -                /* The access failed, generate the approriate interrupt */
> +            }
> +
> +            goto skip_slb_search;
> +        } else {
> +            /* Emulated old-style RMO mode, bounds check against RMLS */
> +            if (raddr >= env->rmls) {
>                  if (rwx == 2) {
>                      ppc_hash64_set_isi(cs, SRR1_PROTFAULT);
>                  } else {
> @@ -821,6 +824,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>                  }
>                  return 1;
>              }
> +
> +            raddr |= env->spr[SPR_RMOR];
>          }
>          tlb_set_page(cs, eaddr & TARGET_PAGE_MASK, raddr & TARGET_PAGE_MASK,
>                       PAGE_READ | PAGE_WRITE | PAGE_EXEC, mmu_idx,
> @@ -953,22 +958,27 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
>          /* In real mode the top 4 effective address bits are ignored */
>          raddr = addr & 0x0FFFFFFFFFFFFFFFULL;
>  
> -        /* In HV mode, add HRMOR if top EA bit is clear */
> -        if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) {
> +        if (cpu->vhyp) {
> +            /*
> +             * In virtual hypervisor mode, there's nothing to do:
> +             *   EA == GPA == qemu guest address
> +             */
> +            return raddr;
> +        } else if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) {
> +            /* In HV mode, add HRMOR if top EA bit is clear */
>              return raddr | env->spr[SPR_HRMOR];
> -        }
> -
> -        /* Otherwise, check VPM for RMA vs VRMA */
> -        if (env->spr[SPR_LPCR] & LPCR_VPM0) {
> +        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
> +            /* Emulated VRMA mode */
>              slb = &env->vrma_slb;
>              if (!slb->sps) {
>                  return -1;
>              }
> -        } else if (raddr < env->rmls) {
> -            /* RMA. Check bounds in RMLS */
> -            return raddr | env->spr[SPR_RMOR];
>          } else {
> -            return -1;
> +            /* Emulated old-style RMO mode, bounds check against RMLS */
> +            if (raddr >= env->rmls) {
> +                return -1;
> +            }
> +            return raddr | env->spr[SPR_RMOR];
>          }
>      } else {
>          slb = slb_lookup(cpu, addr);



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 05/18] target/ppc: Introduce ppc_hash64_use_vrma() helper
  2020-02-24 23:37 ` [PATCH v6 05/18] target/ppc: Introduce ppc_hash64_use_vrma() helper David Gibson
  2020-02-25  0:12   ` Fabiano Rosas
@ 2020-02-25 10:30   ` Greg Kurz
  1 sibling, 0 replies; 45+ messages in thread
From: Greg Kurz @ 2020-02-25 10:30 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:11 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> When running guests under a hypervisor, the hypervisor obviously needs to
> be protected from guest accesses even if those are in what the guest
> considers real mode (translation off).  The POWER hardware provides two
> ways of doing that: The old way has guest real mode accesses simply offset
> and bounds checked into host addresses.  It works, but requires that a
> significant chunk of the guest's memory - the RMA - be physically
> contiguous in the host, which is pretty inconvenient.  The new way, known
> as VRMA, has guest real mode accesses translated in roughly the normal way
> but with some special parameters.
> 
> In POWER7 and POWER8 the LPCR[VPM0] bit selected between the two modes, but
> in POWER9 only VRMA mode is supported and LPCR[VPM0] no longer exists.  We
> handle that difference in behaviour in ppc_hash64_set_isi().. but not in
> other places that we blindly check LPCR[VPM0].
> 
> Correct those instances with a new helper to tell if we should be in VRMA
> mode.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---

Reviewed-by: Greg Kurz <groug@kaod.org>

>  target/ppc/mmu-hash64.c | 43 ++++++++++++++++++++---------------------
>  1 file changed, 21 insertions(+), 22 deletions(-)
> 
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index 392f90e0ae..e372c42add 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -668,6 +668,21 @@ unsigned ppc_hash64_hpte_page_shift_noslb(PowerPCCPU *cpu,
>      return 0;
>  }
>  
> +static bool ppc_hash64_use_vrma(CPUPPCState *env)
> +{
> +    switch (env->mmu_model) {
> +    case POWERPC_MMU_3_00:
> +        /*
> +         * ISAv3.0 (POWER9) always uses VRMA, the VPM0 field and RMOR
> +         * register no longer exist
> +         */
> +        return true;
> +
> +    default:
> +        return !!(env->spr[SPR_LPCR] & LPCR_VPM0);
> +    }
> +}
> +
>  static void ppc_hash64_set_isi(CPUState *cs, uint64_t error_code)
>  {
>      CPUPPCState *env = &POWERPC_CPU(cs)->env;
> @@ -676,15 +691,7 @@ static void ppc_hash64_set_isi(CPUState *cs, uint64_t error_code)
>      if (msr_ir) {
>          vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM1);
>      } else {
> -        switch (env->mmu_model) {
> -        case POWERPC_MMU_3_00:
> -            /* Field deprecated in ISAv3.00 - interrupts always go to hyperv */
> -            vpm = true;
> -            break;
> -        default:
> -            vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM0);
> -            break;
> -        }
> +        vpm = ppc_hash64_use_vrma(env);
>      }
>      if (vpm && !msr_hv) {
>          cs->exception_index = POWERPC_EXCP_HISI;
> @@ -702,15 +709,7 @@ static void ppc_hash64_set_dsi(CPUState *cs, uint64_t dar, uint64_t dsisr)
>      if (msr_dr) {
>          vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM1);
>      } else {
> -        switch (env->mmu_model) {
> -        case POWERPC_MMU_3_00:
> -            /* Field deprecated in ISAv3.00 - interrupts always go to hyperv */
> -            vpm = true;
> -            break;
> -        default:
> -            vpm = !!(env->spr[SPR_LPCR] & LPCR_VPM0);
> -            break;
> -        }
> +        vpm = ppc_hash64_use_vrma(env);
>      }
>      if (vpm && !msr_hv) {
>          cs->exception_index = POWERPC_EXCP_HDSI;
> @@ -799,7 +798,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>              if (!(eaddr >> 63)) {
>                  raddr |= env->spr[SPR_HRMOR];
>              }
> -        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
> +        } else if (ppc_hash64_use_vrma(env)) {
>              /* Emulated VRMA mode */
>              slb = &env->vrma_slb;
>              if (!slb->sps) {
> @@ -967,7 +966,7 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
>          } else if ((msr_hv || !env->has_hv_mode) && !(addr >> 63)) {
>              /* In HV mode, add HRMOR if top EA bit is clear */
>              return raddr | env->spr[SPR_HRMOR];
> -        } else if (env->spr[SPR_LPCR] & LPCR_VPM0) {
> +        } else if (ppc_hash64_use_vrma(env)) {
>              /* Emulated VRMA mode */
>              slb = &env->vrma_slb;
>              if (!slb->sps) {
> @@ -1056,8 +1055,7 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
>      slb->sps = NULL;
>  
>      /* Is VRMA enabled ? */
> -    lpcr = env->spr[SPR_LPCR];
> -    if (!(lpcr & LPCR_VPM0)) {
> +    if (!ppc_hash64_use_vrma(env)) {
>          return;
>      }
>  
> @@ -1065,6 +1063,7 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
>       * Make one up. Mostly ignore the ESID which will not be needed
>       * for translation
>       */
> +    lpcr = env->spr[SPR_LPCR];
>      vsid = SLB_VSID_VRMA;
>      vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT;
>      vsid |= (vrmasd << 4) & (SLB_VSID_L | SLB_VSID_LP);



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 17/18] spapr: Clean up RMA size calculation
  2020-02-24 23:37 ` [PATCH v6 17/18] spapr: Clean up RMA size calculation David Gibson
@ 2020-02-25 11:07   ` Philippe Mathieu-Daudé
  2020-02-26  1:08     ` David Gibson
  2020-02-26 13:37   ` Greg Kurz
  1 sibling, 1 reply; 45+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-02-25 11:07 UTC (permalink / raw)
  To: David Gibson, groug, qemu-ppc, qemu-devel, clg
  Cc: lvivier, Thomas Huth, Xiao Guangrong, farosas, aik,
	Michael S. Tsirkin, Mark Cave-Ayland, paulus, Paolo Bonzini,
	Igor Mammedov, Edgar E. Iglesias

On 2/25/20 12:37 AM, David Gibson wrote:
> Move the calculation of the Real Mode Area (RMA) size into a helper
> function.  While we're there clean it up and correct it in a few ways:
>    * Add comments making it clearer where the various constraints come from
>    * Remove a pointless check that the RMA fits within Node 0 (we've just
>      clamped it so that it does)
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>   hw/ppc/spapr.c | 59 ++++++++++++++++++++++++++++++--------------------
>   1 file changed, 35 insertions(+), 24 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 6e9f15f64d..f0354b699d 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -2648,6 +2648,40 @@ static PCIHostState *spapr_create_default_phb(void)
>       return PCI_HOST_BRIDGE(dev);
>   }
>   
> +static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp)
> +{
> +    MachineState *machine = MACHINE(spapr);
> +    hwaddr rma_size = machine->ram_size;
> +    hwaddr node0_size = spapr_node0_size(machine);
> +
> +    /* RMA has to fit in the first NUMA node */
> +    rma_size = MIN(rma_size, node0_size);
> +
> +    /*
> +     * VRMA access is via a special 1TiB SLB mapping, so the RMA can
> +     * never exceed that
> +     */
> +    rma_size = MIN(rma_size, TiB);

Can you use '1 * TiB'? It makes review obvious.

> +
> +    /*
> +     * Clamp the RMA size based on machine type.  This is for
> +     * migration compatibility with older qemu versions, which limited
> +     * the RMA size for complicated and mostly bad reasons.
> +     */
> +    if (smc->rma_limit) {
> +        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
> +    }
> +
> +    if (rma_size < (MIN_RMA_SLOF * MiB)) {

This looks old copy/paste before the change "spapr: Don't use weird 
units for MIN_RMA_SLOF".

> +        error_setg(errp,
> +"pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area)",
> +                   MIN_RMA_SLOF);

Similarly, "MIN_RMA_SLOF / MiB"?

> +        return -1;

Maybe return 0 in case this function is called with errp != &error_fatal.

> +    }
> +
> +    return rma_size;
> +}
> +
>   /* pSeries LPAR / sPAPR hardware init */
>   static void spapr_machine_init(MachineState *machine)
>   {
> @@ -2660,7 +2694,6 @@ static void spapr_machine_init(MachineState *machine)
>       int i;
>       MemoryRegion *sysmem = get_system_memory();
>       MemoryRegion *ram = g_new(MemoryRegion, 1);
> -    hwaddr node0_size = spapr_node0_size(machine);
>       long load_limit, fw_size;
>       char *filename;
>       Error *resize_hpt_err = NULL;
> @@ -2700,22 +2733,7 @@ static void spapr_machine_init(MachineState *machine)
>           exit(1);
>       }
>   
> -    spapr->rma_size = node0_size;
> -
> -    /*
> -     * Clamp the RMA size based on machine type.  This is for
> -     * migration compatibility with older qemu versions, which limited
> -     * the RMA size for complicated and mostly bad reasons.
> -     */
> -    if (smc->rma_limit) {
> -        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
> -    }
> -
> -    if (spapr->rma_size > node0_size) {
> -        error_report("Numa node 0 has to span the RMA (%#08"HWADDR_PRIx")",
> -                     spapr->rma_size);
> -        exit(1);
> -    }
> +    spapr->rma_size = spapr_rma_size(spapr, &error_fatal);
>   
>       /* Setup a load limit for the ramdisk leaving room for SLOF and FDT */
>       load_limit = MIN(spapr->rma_size, RTAS_MAX_ADDR) - FW_OVERHEAD;
> @@ -2954,13 +2972,6 @@ static void spapr_machine_init(MachineState *machine)
>           }
>       }
>   
> -    if (spapr->rma_size < MIN_RMA_SLOF) {
> -        error_report(
> -            "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area memory)",
> -            MIN_RMA_SLOF / MiB);
> -        exit(1);
> -    }
> -
>       if (kernel_filename) {
>           uint64_t lowaddr = 0;
>   
> 



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 06/18] spapr, ppc: Remove VPM0/RMLS hacks for POWER9
  2020-02-24 23:37 ` [PATCH v6 06/18] spapr, ppc: Remove VPM0/RMLS hacks for POWER9 David Gibson
@ 2020-02-25 11:29   ` Greg Kurz
  2020-02-25 15:58     ` Greg Kurz
  0 siblings, 1 reply; 45+ messages in thread
From: Greg Kurz @ 2020-02-25 11:29 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:12 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> For the "pseries" machine, we use "virtual hypervisor" mode where we
> only model the CPU in non-hypervisor privileged mode.  This means that
> we need guest physical addresses within the modelled cpu to be treated
> as absolute physical addresses.
> 
> We used to do that by clearing LPCR[VPM0] and setting LPCR[RMLS] to a high
> limit so that the old offset based translation for guest mode applied,
> which does what we need.  However, POWER9 has removed support for that
> translation mode, which meant we had some ugly hacks to keep it working.
> 
> We now explicitly handle this sort of translation for virtual hypervisor
> mode, so the hacks aren't necessary.  We don't need to set VPM0 and RMLS
> from the machine type code - they're now ignored in vhyp mode.  On the cpu
> side we don't need to allow LPCR[RMLS] to be set on POWER9 in vhyp mode -
> that was only there to allow the hack on the machine side.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---

Reviewed-by: Greg Kurz <groug@kaod.org>

>  hw/ppc/spapr_cpu_core.c | 6 +-----
>  target/ppc/mmu-hash64.c | 8 --------
>  2 files changed, 1 insertion(+), 13 deletions(-)
> 
> diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> index d09125d9af..ea5e11f1d9 100644
> --- a/hw/ppc/spapr_cpu_core.c
> +++ b/hw/ppc/spapr_cpu_core.c
> @@ -58,14 +58,10 @@ static void spapr_reset_vcpu(PowerPCCPU *cpu)
>       * we don't get spurious wakups before an RTAS start-cpu call.
>       * For the same reason, set PSSCR_EC.
>       */
> -    lpcr &= ~(LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm);
> +    lpcr &= ~(LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm);
>      lpcr |= LPCR_LPES0 | LPCR_LPES1;
>      env->spr[SPR_PSSCR] |= PSSCR_EC;
>  
> -    /* Set RMLS to the max (ie, 16G) */
> -    lpcr &= ~LPCR_RMLS;
> -    lpcr |= 1ull << LPCR_RMLS_SHIFT;
> -
>      ppc_store_lpcr(cpu, lpcr);
>  
>      /* Set a full AMOR so guest can use the AMR as it sees fit */
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index e372c42add..caf47ad6fc 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -1126,14 +1126,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
>                        (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
>                        LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC |
>                        LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE);
> -        /*
> -         * If we have a virtual hypervisor, we need to bring back RMLS. It
> -         * doesn't exist on an actual P9 but that's all we know how to
> -         * configure with softmmu at the moment
> -         */
> -        if (cpu->vhyp) {
> -            lpcr |= (val & LPCR_RMLS);
> -        }
>          break;
>      default:
>          g_assert_not_reached();



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 07/18] target/ppc: Remove RMOR register from POWER9 & POWER10
  2020-02-24 23:37 ` [PATCH v6 07/18] target/ppc: Remove RMOR register from POWER9 & POWER10 David Gibson
@ 2020-02-25 11:30   ` Greg Kurz
  0 siblings, 0 replies; 45+ messages in thread
From: Greg Kurz @ 2020-02-25 11:30 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:13 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> Currently we create the Real Mode Offset Register (RMOR) on all Book3S cpus
> from POWER7 onwards.  However the translation mode which the RMOR controls
> is no longer supported in POWER9, and so the register has been removed from
> the architecture.
> 
> Remove it from our model on POWER9 and POWER10.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---

Reviewed-by: Greg Kurz <groug@kaod.org>

>  target/ppc/translate_init.inc.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
> index ab79975fec..925bc31ca5 100644
> --- a/target/ppc/translate_init.inc.c
> +++ b/target/ppc/translate_init.inc.c
> @@ -8015,12 +8015,16 @@ static void gen_spr_book3s_ids(CPUPPCState *env)
>                   SPR_NOACCESS, SPR_NOACCESS,
>                   &spr_read_generic, &spr_write_generic,
>                   0x00000000);
> -    spr_register_hv(env, SPR_RMOR, "RMOR",
> +    spr_register_hv(env, SPR_HRMOR, "HRMOR",
>                   SPR_NOACCESS, SPR_NOACCESS,
>                   SPR_NOACCESS, SPR_NOACCESS,
>                   &spr_read_generic, &spr_write_generic,
>                   0x00000000);
> -    spr_register_hv(env, SPR_HRMOR, "HRMOR",
> +}
> +
> +static void gen_spr_rmor(CPUPPCState *env)
> +{
> +    spr_register_hv(env, SPR_RMOR, "RMOR",
>                   SPR_NOACCESS, SPR_NOACCESS,
>                   SPR_NOACCESS, SPR_NOACCESS,
>                   &spr_read_generic, &spr_write_generic,
> @@ -8535,6 +8539,7 @@ static void init_proc_POWER7(CPUPPCState *env)
>  
>      /* POWER7 Specific Registers */
>      gen_spr_book3s_ids(env);
> +    gen_spr_rmor(env);
>      gen_spr_amr(env);
>      gen_spr_book3s_purr(env);
>      gen_spr_power5p_common(env);
> @@ -8676,6 +8681,7 @@ static void init_proc_POWER8(CPUPPCState *env)
>  
>      /* POWER8 Specific Registers */
>      gen_spr_book3s_ids(env);
> +    gen_spr_rmor(env);
>      gen_spr_amr(env);
>      gen_spr_iamr(env);
>      gen_spr_book3s_purr(env);



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 08/18] target/ppc: Use class fields to simplify LPCR masking
  2020-02-24 23:37 ` [PATCH v6 08/18] target/ppc: Use class fields to simplify LPCR masking David Gibson
@ 2020-02-25 15:48   ` Greg Kurz
  0 siblings, 0 replies; 45+ messages in thread
From: Greg Kurz @ 2020-02-25 15:48 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:14 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> When we store the Logical Partitioning Control Register (LPCR) we have a
> big switch statement to work out which are valid bits for the cpu model
> we're emulating.
> 
> As well as being ugly, this isn't really conceptually correct, since it is
> based on the mmu_model variable, whereas the LPCR isn't (only) about the
> MMU, so mmu_model is basically just acting as a proxy for the cpu model.
> 
> Handle this in a simpler way, by adding a suitable lpcr_mask to the QOM
> class.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---

Reviewed-by: Greg Kurz <groug@kaod.org>

>  target/ppc/cpu-qom.h            |  1 +
>  target/ppc/mmu-hash64.c         | 36 ++-------------------------------
>  target/ppc/translate_init.inc.c | 27 +++++++++++++++++++++----
>  3 files changed, 26 insertions(+), 38 deletions(-)
> 
> diff --git a/target/ppc/cpu-qom.h b/target/ppc/cpu-qom.h
> index e499575dc8..15d6b54a7d 100644
> --- a/target/ppc/cpu-qom.h
> +++ b/target/ppc/cpu-qom.h
> @@ -177,6 +177,7 @@ typedef struct PowerPCCPUClass {
>      uint64_t insns_flags;
>      uint64_t insns_flags2;
>      uint64_t msr_mask;
> +    uint64_t lpcr_mask;         /* Available bits in the LPCR */
>      uint64_t lpcr_pm;           /* Power-saving mode Exit Cause Enable bits */
>      powerpc_mmu_t   mmu_model;
>      powerpc_excp_t  excp_model;
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index caf47ad6fc..0ef330a614 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -1095,42 +1095,10 @@ static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
>  
>  void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
>  {
> +    PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
>      CPUPPCState *env = &cpu->env;
> -    uint64_t lpcr = 0;
>  
> -    /* Filter out bits */
> -    switch (env->mmu_model) {
> -    case POWERPC_MMU_2_03: /* P5p */
> -        lpcr = val & (LPCR_RMLS | LPCR_ILE |
> -                      LPCR_LPES0 | LPCR_LPES1 |
> -                      LPCR_RMI | LPCR_HDICE);
> -        break;
> -    case POWERPC_MMU_2_06: /* P7 */
> -        lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
> -                      LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
> -                      LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
> -                      LPCR_MER | LPCR_TC |
> -                      LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE);
> -        break;
> -    case POWERPC_MMU_2_07: /* P8 */
> -        lpcr = val & (LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
> -                      LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
> -                      LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
> -                      LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 |
> -                      LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE);
> -        break;
> -    case POWERPC_MMU_3_00: /* P9 */
> -        lpcr = val & (LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
> -                      (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
> -                      LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
> -                      (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
> -                      LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC |
> -                      LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE);
> -        break;
> -    default:
> -        g_assert_not_reached();
> -    }
> -    env->spr[SPR_LPCR] = lpcr;
> +    env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
>      ppc_hash64_update_rmls(cpu);
>      ppc_hash64_update_vrma(cpu);
>  }
> diff --git a/target/ppc/translate_init.inc.c b/target/ppc/translate_init.inc.c
> index 925bc31ca5..5b7a5226e1 100644
> --- a/target/ppc/translate_init.inc.c
> +++ b/target/ppc/translate_init.inc.c
> @@ -8476,6 +8476,8 @@ POWERPC_FAMILY(POWER5P)(ObjectClass *oc, void *data)
>                      (1ull << MSR_DR) |
>                      (1ull << MSR_PMM) |
>                      (1ull << MSR_RI);
> +    pcc->lpcr_mask = LPCR_RMLS | LPCR_ILE | LPCR_LPES0 | LPCR_LPES1 |
> +        LPCR_RMI | LPCR_HDICE;
>      pcc->mmu_model = POWERPC_MMU_2_03;
>  #if defined(CONFIG_SOFTMMU)
>      pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
> @@ -8653,6 +8655,12 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
>                      (1ull << MSR_PMM) |
>                      (1ull << MSR_RI) |
>                      (1ull << MSR_LE);
> +    pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_DPFD |
> +        LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
> +        LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2 |
> +        LPCR_MER | LPCR_TC |
> +        LPCR_LPES0 | LPCR_LPES1 | LPCR_HDICE;
> +    pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
>      pcc->mmu_model = POWERPC_MMU_2_06;
>  #if defined(CONFIG_SOFTMMU)
>      pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
> @@ -8669,7 +8677,6 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
>      pcc->l1_dcache_size = 0x8000;
>      pcc->l1_icache_size = 0x8000;
>      pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
> -    pcc->lpcr_pm = LPCR_P7_PECE0 | LPCR_P7_PECE1 | LPCR_P7_PECE2;
>  }
>  
>  static void init_proc_POWER8(CPUPPCState *env)
> @@ -8825,6 +8832,13 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
>                      (1ull << MSR_TS0) |
>                      (1ull << MSR_TS1) |
>                      (1ull << MSR_LE);
> +    pcc->lpcr_mask = LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV |
> +        LPCR_DPFD | LPCR_VRMASD | LPCR_RMLS | LPCR_ILE |
> +        LPCR_AIL | LPCR_ONL | LPCR_P8_PECE0 | LPCR_P8_PECE1 |
> +        LPCR_P8_PECE2 | LPCR_P8_PECE3 | LPCR_P8_PECE4 |
> +        LPCR_MER | LPCR_TC | LPCR_LPES0 | LPCR_HDICE;
> +    pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
> +                   LPCR_P8_PECE3 | LPCR_P8_PECE4;
>      pcc->mmu_model = POWERPC_MMU_2_07;
>  #if defined(CONFIG_SOFTMMU)
>      pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
> @@ -8842,8 +8856,6 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
>      pcc->l1_dcache_size = 0x8000;
>      pcc->l1_icache_size = 0x8000;
>      pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
> -    pcc->lpcr_pm = LPCR_P8_PECE0 | LPCR_P8_PECE1 | LPCR_P8_PECE2 |
> -                   LPCR_P8_PECE3 | LPCR_P8_PECE4;
>  }
>  
>  #ifdef CONFIG_SOFTMMU
> @@ -9036,6 +9048,14 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
>                      (1ull << MSR_PMM) |
>                      (1ull << MSR_RI) |
>                      (1ull << MSR_LE);
> +    pcc->lpcr_mask = LPCR_VPM1 | LPCR_ISL | LPCR_KBV | LPCR_DPFD |
> +        (LPCR_PECE_U_MASK & LPCR_HVEE) | LPCR_ILE | LPCR_AIL |
> +        LPCR_UPRT | LPCR_EVIRT | LPCR_ONL | LPCR_HR | LPCR_LD |
> +        (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
> +                             LPCR_DEE | LPCR_OEE))
> +        | LPCR_MER | LPCR_GTSE | LPCR_TC |
> +        LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE;
> +    pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
>      pcc->mmu_model = POWERPC_MMU_3_00;
>  #if defined(CONFIG_SOFTMMU)
>      pcc->handle_mmu_fault = ppc64_v3_handle_mmu_fault;
> @@ -9055,7 +9075,6 @@ POWERPC_FAMILY(POWER9)(ObjectClass *oc, void *data)
>      pcc->l1_dcache_size = 0x8000;
>      pcc->l1_icache_size = 0x8000;
>      pcc->interrupts_big_endian = ppc_cpu_interrupts_big_endian_lpcr;
> -    pcc->lpcr_pm = LPCR_PDEE | LPCR_HDEE | LPCR_EEE | LPCR_DEE | LPCR_OEE;
>  }
>  
>  #ifdef CONFIG_SOFTMMU



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 06/18] spapr, ppc: Remove VPM0/RMLS hacks for POWER9
  2020-02-25 11:29   ` Greg Kurz
@ 2020-02-25 15:58     ` Greg Kurz
  2020-02-26  1:00       ` David Gibson
  0 siblings, 1 reply; 45+ messages in thread
From: Greg Kurz @ 2020-02-25 15:58 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, farosas,
	Michael S. Tsirkin, qemu-devel, qemu-ppc, clg, Paolo Bonzini,
	Igor Mammedov, paulus

On Tue, 25 Feb 2020 12:29:00 +0100
Greg Kurz <groug@kaod.org> wrote:

> On Tue, 25 Feb 2020 10:37:12 +1100
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > For the "pseries" machine, we use "virtual hypervisor" mode where we
> > only model the CPU in non-hypervisor privileged mode.  This means that
> > we need guest physical addresses within the modelled cpu to be treated
> > as absolute physical addresses.
> > 
> > We used to do that by clearing LPCR[VPM0] and setting LPCR[RMLS] to a high
> > limit so that the old offset based translation for guest mode applied,
> > which does what we need.  However, POWER9 has removed support for that
> > translation mode, which meant we had some ugly hacks to keep it working.
> > 
> > We now explicitly handle this sort of translation for virtual hypervisor
> > mode, so the hacks aren't necessary.  We don't need to set VPM0 and RMLS
> > from the machine type code - they're now ignored in vhyp mode.  On the cpu
> > side we don't need to allow LPCR[RMLS] to be set on POWER9 in vhyp mode -
> > that was only there to allow the hack on the machine side.
> > 
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > Reviewed-by: Cédric Le Goater <clg@kaod.org>
> > ---
> 
> Reviewed-by: Greg Kurz <groug@kaod.org>
> 

Ah wait...

> >  hw/ppc/spapr_cpu_core.c | 6 +-----
> >  target/ppc/mmu-hash64.c | 8 --------
> >  2 files changed, 1 insertion(+), 13 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> > index d09125d9af..ea5e11f1d9 100644
> > --- a/hw/ppc/spapr_cpu_core.c
> > +++ b/hw/ppc/spapr_cpu_core.c
> > @@ -58,14 +58,10 @@ static void spapr_reset_vcpu(PowerPCCPU *cpu)
> >       * we don't get spurious wakups before an RTAS start-cpu call.
> >       * For the same reason, set PSSCR_EC.
> >       */
> > -    lpcr &= ~(LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm);
> > +    lpcr &= ~(LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm);

... a few lines above, we have a comment that should be dropped as well.

     * Clearing VPM0 will also cause us to use RMOR in mmu-hash64.c for
     * real mode accesses, which thankfully defaults to 0 and isn't
     * accessible in guest mode.

My R-b tag stands anyway.

> >      lpcr |= LPCR_LPES0 | LPCR_LPES1;
> >      env->spr[SPR_PSSCR] |= PSSCR_EC;
> >  
> > -    /* Set RMLS to the max (ie, 16G) */
> > -    lpcr &= ~LPCR_RMLS;
> > -    lpcr |= 1ull << LPCR_RMLS_SHIFT;
> > -
> >      ppc_store_lpcr(cpu, lpcr);
> >  
> >      /* Set a full AMOR so guest can use the AMR as it sees fit */
> > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> > index e372c42add..caf47ad6fc 100644
> > --- a/target/ppc/mmu-hash64.c
> > +++ b/target/ppc/mmu-hash64.c
> > @@ -1126,14 +1126,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
> >                        (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
> >                        LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC |
> >                        LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE);
> > -        /*
> > -         * If we have a virtual hypervisor, we need to bring back RMLS. It
> > -         * doesn't exist on an actual P9 but that's all we know how to
> > -         * configure with softmmu at the moment
> > -         */
> > -        if (cpu->vhyp) {
> > -            lpcr |= (val & LPCR_RMLS);
> > -        }
> >          break;
> >      default:
> >          g_assert_not_reached();
> 
> 



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS]
  2020-02-24 23:37 ` [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS] David Gibson
@ 2020-02-25 17:05   ` Greg Kurz
  2020-02-25 22:47     ` Greg Kurz
  0 siblings, 1 reply; 45+ messages in thread
From: Greg Kurz @ 2020-02-25 17:05 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:15 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> Currently we use a big switch statement in ppc_hash64_update_rmls() to work
> out what the right RMA limit is based on the LPCR[RMLS] field.  There's no
> formula for this - it's just an arbitrary mapping defined by the existing
> CPU implementations - but we can make it a bit more readable by using a
> lookup table rather than a switch.  In addition we can use the MiB/GiB
> symbols to make it a bit clearer.
> 
> While there we add a bit of clarity and rationale to the comment about
> what happens if the LPCR[RMLS] doesn't contain a valid value.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---
>  target/ppc/mmu-hash64.c | 71 ++++++++++++++++++++---------------------
>  1 file changed, 35 insertions(+), 36 deletions(-)
> 
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index 0ef330a614..4f082d775d 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -18,6 +18,7 @@
>   * License along with this library; if not, see <http://www.gnu.org/licenses/>.
>   */
>  #include "qemu/osdep.h"
> +#include "qemu/units.h"
>  #include "cpu.h"
>  #include "exec/exec-all.h"
>  #include "exec/helper-proto.h"This tool was originally developed to fix Linux CPU throttling issues affecting Lenovo T480 / T480s / X1C6 as described here.
> @@ -757,6 +758,39 @@ static void ppc_hash64_set_c(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte1)
>      stb_phys(CPU(cpu)->as, base + offset, (pte1 & 0xff) | 0x80);
>  }
>  
> +static target_ulong rmls_limit(PowerPCCPU *cpu)
> +{
> +    CPUPPCState *env = &cpu->env;
> +    /*
> +     * This is the full 4 bits encoding of POWER8. Previous
> +     * CPUs only support a subset of these but the filtering
> +     * is done when writing LPCR
> +     */
> +    const target_ulong rma_sizes[] = {
> +        [0] = 0,
> +        [1] = 16 * GiB,
> +        [2] = 1 * GiB,
> +        [3] = 64 * MiB,
> +        [4] = 256 * MiB,
> +        [5] = 0,
> +        [6] = 0,
> +        [7] = 128 * MiB,
> +        [8] = 32 * MiB,
> +    };
> +    target_ulong rmls = (env->spr[SPR_LPCR] & LPCR_RMLS) >> LPCR_RMLS_SHIFT;
> +
> +    if (rmls < ARRAY_SIZE(rma_sizes)) {

This condition is always true since the RMLS field is 4-bit long... I guess
you want to check that RMLS encodes a valid RMA size instead.

    if (rma_sizes[rmls]) {

> +        return rma_sizes[rmls];
> +    } else {
> +        /*
> +         * Bad value, so the OS has shot itself in the foot.  Return a
> +         * 0-sized RMA which we expect to trigger an immediate DSI or
> +         * ISI
> +         */
> +        return 0;
> +    }
> +}
> +
>  int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>                                  int rwx, int mmu_idx)
>  {
> @@ -1006,41 +1040,6 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex,
>      cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH;
>  }
>  
> -static void ppc_hash64_update_rmls(PowerPCCPU *cpu)
> -{
> -    CPUPPCState *env = &cpu->env;
> -    uint64_t lpcr = env->spr[SPR_LPCR];
> -
> -    /*
> -     * This is the full 4 bits encoding of POWER8. Previous
> -     * CPUs only support a subset of these but the filtering
> -     * is done when writing LPCR
> -     */
> -    switch ((lpcr & LPCR_RMLS) >> LPCR_RMLS_SHIFT) {
> -    case 0x8: /* 32MB */
> -        env->rmls = 0x2000000ull;
> -        break;
> -    case 0x3: /* 64MB */
> -        env->rmls = 0x4000000ull;
> -        break;
> -    case 0x7: /* 128MB */
> -        env->rmls = 0x8000000ull;
> -        break;
> -    case 0x4: /* 256MB */
> -        env->rmls = 0x10000000ull;
> -        break;
> -    case 0x2: /* 1GB */
> -        env->rmls = 0x40000000ull;
> -        break;
> -    case 0x1: /* 16GB */
> -        env->rmls = 0x400000000ull;
> -        break;
> -    default:
> -        /* What to do here ??? */
> -        env->rmls = 0;
> -    }
> -}
> -
>  static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
>  {
>      CPUPPCState *env = &cpu->env;
> @@ -1099,7 +1098,7 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
>      CPUPPCState *env = &cpu->env;
>  
>      env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
> -    ppc_hash64_update_rmls(cpu);
> +    env->rmls = rmls_limit(cpu);
>      ppc_hash64_update_vrma(cpu);
>  }
>  



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS]
  2020-02-25 17:05   ` Greg Kurz
@ 2020-02-25 22:47     ` Greg Kurz
  2020-02-26  1:04       ` David Gibson
  0 siblings, 1 reply; 45+ messages in thread
From: Greg Kurz @ 2020-02-25 22:47 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 18:05:31 +0100
Greg Kurz <groug@kaod.org> wrote:

> On Tue, 25 Feb 2020 10:37:15 +1100
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > Currently we use a big switch statement in ppc_hash64_update_rmls() to work
> > out what the right RMA limit is based on the LPCR[RMLS] field.  There's no
> > formula for this - it's just an arbitrary mapping defined by the existing
> > CPU implementations - but we can make it a bit more readable by using a
> > lookup table rather than a switch.  In addition we can use the MiB/GiB
> > symbols to make it a bit clearer.
> > 
> > While there we add a bit of clarity and rationale to the comment about
> > what happens if the LPCR[RMLS] doesn't contain a valid value.
> > 
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > Reviewed-by: Cédric Le Goater <clg@kaod.org>
> > ---
> >  target/ppc/mmu-hash64.c | 71 ++++++++++++++++++++---------------------
> >  1 file changed, 35 insertions(+), 36 deletions(-)
> > 
> > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> > index 0ef330a614..4f082d775d 100644
> > --- a/target/ppc/mmu-hash64.c
> > +++ b/target/ppc/mmu-hash64.c
> > @@ -18,6 +18,7 @@
> >   * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> >   */
> >  #include "qemu/osdep.h"
> > +#include "qemu/units.h"
> >  #include "cpu.h"
> >  #include "exec/exec-all.h"
> >  #include "exec/helper-proto.h"This tool was originally developed to fix Linux CPU throttling issues affecting Lenovo T480 / T480s / X1C6 as described here.
> > @@ -757,6 +758,39 @@ static void ppc_hash64_set_c(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte1)
> >      stb_phys(CPU(cpu)->as, base + offset, (pte1 & 0xff) | 0x80);
> >  }
> >  
> > +static target_ulong rmls_limit(PowerPCCPU *cpu)
> > +{
> > +    CPUPPCState *env = &cpu->env;
> > +    /*
> > +     * This is the full 4 bits encoding of POWER8. Previous
> > +     * CPUs only support a subset of these but the filtering
> > +     * is done when writing LPCR
> > +     */
> > +    const target_ulong rma_sizes[] = {
> > +        [0] = 0,
> > +        [1] = 16 * GiB,
> > +        [2] = 1 * GiB,
> > +        [3] = 64 * MiB,
> > +        [4] = 256 * MiB,
> > +        [5] = 0,
> > +        [6] = 0,
> > +        [7] = 128 * MiB,
> > +        [8] = 32 * MiB,
> > +    };
> > +    target_ulong rmls = (env->spr[SPR_LPCR] & LPCR_RMLS) >> LPCR_RMLS_SHIFT;
> > +
> > +    if (rmls < ARRAY_SIZE(rma_sizes)) {
> 
> This condition is always true since the RMLS field is 4-bit long... 

Oops my mistake, I was already thinking about the suggestion I have
for something that was puzzling me. See below.

> I guess you want to check that RMLS encodes a valid RMA size instead.
> 
>     if (rma_sizes[rmls]) {
> 
> > +        return rma_sizes[rmls];
> > +    } else {
> > +        /*
> > +         * Bad value, so the OS has shot itself in the foot.  Return a
> > +         * 0-sized RMA which we expect to trigger an immediate DSI or
> > +         * ISI
> > +         */

It seems a bit weird to differentiate the case where the value is bad
because it happens to be bigger than the highest supported one, compared
to values that are declared bad in rma_sizes[], like 0, 5 or 6. They're
all basically the same case of values not used to encode a valid size...

What about :

    static const target_ulong rma_sizes[16] = {
        [1] = 16 * GiB,
        [2] = 1 * GiB,
        [3] = 64 * MiB,
        [4] = 256 * MiB,
        [7] = 128 * MiB,
        [8] = 32 * MiB,
    };

?

> > +        return 0;
> > +    }
> > +}
> > +
> >  int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
> >                                  int rwx, int mmu_idx)
> >  {
> > @@ -1006,41 +1040,6 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex,
> >      cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH;
> >  }
> >  
> > -static void ppc_hash64_update_rmls(PowerPCCPU *cpu)
> > -{
> > -    CPUPPCState *env = &cpu->env;
> > -    uint64_t lpcr = env->spr[SPR_LPCR];
> > -
> > -    /*
> > -     * This is the full 4 bits encoding of POWER8. Previous
> > -     * CPUs only support a subset of these but the filtering
> > -     * is done when writing LPCR
> > -     */
> > -    switch ((lpcr & LPCR_RMLS) >> LPCR_RMLS_SHIFT) {
> > -    case 0x8: /* 32MB */
> > -        env->rmls = 0x2000000ull;
> > -        break;
> > -    case 0x3: /* 64MB */
> > -        env->rmls = 0x4000000ull;
> > -        break;
> > -    case 0x7: /* 128MB */
> > -        env->rmls = 0x8000000ull;
> > -        break;
> > -    case 0x4: /* 256MB */
> > -        env->rmls = 0x10000000ull;
> > -        break;
> > -    case 0x2: /* 1GB */
> > -        env->rmls = 0x40000000ull;
> > -        break;
> > -    case 0x1: /* 16GB */
> > -        env->rmls = 0x400000000ull;
> > -        break;
> > -    default:
> > -        /* What to do here ??? */
> > -        env->rmls = 0;
> > -    }
> > -}
> > -
> >  static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
> >  {
> >      CPUPPCState *env = &cpu->env;
> > @@ -1099,7 +1098,7 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
> >      CPUPPCState *env = &cpu->env;
> >  
> >      env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
> > -    ppc_hash64_update_rmls(cpu);
> > +    env->rmls = rmls_limit(cpu);
> >      ppc_hash64_update_vrma(cpu);
> >  }
> >  
> 



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 06/18] spapr, ppc: Remove VPM0/RMLS hacks for POWER9
  2020-02-25 15:58     ` Greg Kurz
@ 2020-02-26  1:00       ` David Gibson
  0 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-26  1:00 UTC (permalink / raw)
  To: Greg Kurz
  Cc: lvivier, Thomas Huth, Xiao Guangrong, farosas,
	Michael S. Tsirkin, qemu-devel, qemu-ppc, clg, Paolo Bonzini,
	Igor Mammedov, paulus

[-- Attachment #1: Type: text/plain, Size: 4014 bytes --]

On Tue, Feb 25, 2020 at 04:58:01PM +0100, Greg Kurz wrote:
> On Tue, 25 Feb 2020 12:29:00 +0100
> Greg Kurz <groug@kaod.org> wrote:
> 
> > On Tue, 25 Feb 2020 10:37:12 +1100
> > David Gibson <david@gibson.dropbear.id.au> wrote:
> > 
> > > For the "pseries" machine, we use "virtual hypervisor" mode where we
> > > only model the CPU in non-hypervisor privileged mode.  This means that
> > > we need guest physical addresses within the modelled cpu to be treated
> > > as absolute physical addresses.
> > > 
> > > We used to do that by clearing LPCR[VPM0] and setting LPCR[RMLS] to a high
> > > limit so that the old offset based translation for guest mode applied,
> > > which does what we need.  However, POWER9 has removed support for that
> > > translation mode, which meant we had some ugly hacks to keep it working.
> > > 
> > > We now explicitly handle this sort of translation for virtual hypervisor
> > > mode, so the hacks aren't necessary.  We don't need to set VPM0 and RMLS
> > > from the machine type code - they're now ignored in vhyp mode.  On the cpu
> > > side we don't need to allow LPCR[RMLS] to be set on POWER9 in vhyp mode -
> > > that was only there to allow the hack on the machine side.
> > > 
> > > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > > Reviewed-by: Cédric Le Goater <clg@kaod.org>
> > > ---
> > 
> > Reviewed-by: Greg Kurz <groug@kaod.org>
> > 
> 
> Ah wait...
> 
> > >  hw/ppc/spapr_cpu_core.c | 6 +-----
> > >  target/ppc/mmu-hash64.c | 8 --------
> > >  2 files changed, 1 insertion(+), 13 deletions(-)
> > > 
> > > diff --git a/hw/ppc/spapr_cpu_core.c b/hw/ppc/spapr_cpu_core.c
> > > index d09125d9af..ea5e11f1d9 100644
> > > --- a/hw/ppc/spapr_cpu_core.c
> > > +++ b/hw/ppc/spapr_cpu_core.c
> > > @@ -58,14 +58,10 @@ static void spapr_reset_vcpu(PowerPCCPU *cpu)
> > >       * we don't get spurious wakups before an RTAS start-cpu call.
> > >       * For the same reason, set PSSCR_EC.
> > >       */
> > > -    lpcr &= ~(LPCR_VPM0 | LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm);
> > > +    lpcr &= ~(LPCR_VPM1 | LPCR_ISL | LPCR_KBV | pcc->lpcr_pm);
> 
> ... a few lines above, we have a comment that should be dropped as well.
> 
>      * Clearing VPM0 will also cause us to use RMOR in mmu-hash64.c for
>      * real mode accesses, which thankfully defaults to 0 and isn't
>      * accessible in guest mode.

Removed, thanks.

> 
> My R-b tag stands anyway.
> 
> > >      lpcr |= LPCR_LPES0 | LPCR_LPES1;
> > >      env->spr[SPR_PSSCR] |= PSSCR_EC;
> > >  
> > > -    /* Set RMLS to the max (ie, 16G) */
> > > -    lpcr &= ~LPCR_RMLS;
> > > -    lpcr |= 1ull << LPCR_RMLS_SHIFT;
> > > -
> > >      ppc_store_lpcr(cpu, lpcr);
> > >  
> > >      /* Set a full AMOR so guest can use the AMR as it sees fit */
> > > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> > > index e372c42add..caf47ad6fc 100644
> > > --- a/target/ppc/mmu-hash64.c
> > > +++ b/target/ppc/mmu-hash64.c
> > > @@ -1126,14 +1126,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
> > >                        (LPCR_PECE_L_MASK & (LPCR_PDEE | LPCR_HDEE | LPCR_EEE |
> > >                        LPCR_DEE | LPCR_OEE)) | LPCR_MER | LPCR_GTSE | LPCR_TC |
> > >                        LPCR_HEIC | LPCR_LPES0 | LPCR_HVICE | LPCR_HDICE);
> > > -        /*
> > > -         * If we have a virtual hypervisor, we need to bring back RMLS. It
> > > -         * doesn't exist on an actual P9 but that's all we know how to
> > > -         * configure with softmmu at the moment
> > > -         */
> > > -        if (cpu->vhyp) {
> > > -            lpcr |= (val & LPCR_RMLS);
> > > -        }
> > >          break;
> > >      default:
> > >          g_assert_not_reached();
> > 
> > 
> 

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS]
  2020-02-25 22:47     ` Greg Kurz
@ 2020-02-26  1:04       ` David Gibson
  2020-02-26  7:56         ` Greg Kurz
  0 siblings, 1 reply; 45+ messages in thread
From: David Gibson @ 2020-02-26  1:04 UTC (permalink / raw)
  To: Greg Kurz
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

[-- Attachment #1: Type: text/plain, Size: 4247 bytes --]

On Tue, Feb 25, 2020 at 11:47:25PM +0100, Greg Kurz wrote:
> On Tue, 25 Feb 2020 18:05:31 +0100
> Greg Kurz <groug@kaod.org> wrote:
> 
> > On Tue, 25 Feb 2020 10:37:15 +1100
> > David Gibson <david@gibson.dropbear.id.au> wrote:
> > 
> > > Currently we use a big switch statement in ppc_hash64_update_rmls() to work
> > > out what the right RMA limit is based on the LPCR[RMLS] field.  There's no
> > > formula for this - it's just an arbitrary mapping defined by the existing
> > > CPU implementations - but we can make it a bit more readable by using a
> > > lookup table rather than a switch.  In addition we can use the MiB/GiB
> > > symbols to make it a bit clearer.
> > > 
> > > While there we add a bit of clarity and rationale to the comment about
> > > what happens if the LPCR[RMLS] doesn't contain a valid value.
> > > 
> > > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > > Reviewed-by: Cédric Le Goater <clg@kaod.org>
> > > ---
> > >  target/ppc/mmu-hash64.c | 71 ++++++++++++++++++++---------------------
> > >  1 file changed, 35 insertions(+), 36 deletions(-)
> > > 
> > > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> > > index 0ef330a614..4f082d775d 100644
> > > --- a/target/ppc/mmu-hash64.c
> > > +++ b/target/ppc/mmu-hash64.c
> > > @@ -18,6 +18,7 @@
> > >   * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> > >   */
> > >  #include "qemu/osdep.h"
> > > +#include "qemu/units.h"
> > >  #include "cpu.h"
> > >  #include "exec/exec-all.h"
> > >  #include "exec/helper-proto.h"This tool was originally developed to fix Linux CPU throttling issues affecting Lenovo T480 / T480s / X1C6 as described here.
> > > @@ -757,6 +758,39 @@ static void ppc_hash64_set_c(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte1)
> > >      stb_phys(CPU(cpu)->as, base + offset, (pte1 & 0xff) | 0x80);
> > >  }
> > >  
> > > +static target_ulong rmls_limit(PowerPCCPU *cpu)
> > > +{
> > > +    CPUPPCState *env = &cpu->env;
> > > +    /*
> > > +     * This is the full 4 bits encoding of POWER8. Previous
> > > +     * CPUs only support a subset of these but the filtering
> > > +     * is done when writing LPCR
> > > +     */
> > > +    const target_ulong rma_sizes[] = {
> > > +        [0] = 0,
> > > +        [1] = 16 * GiB,
> > > +        [2] = 1 * GiB,
> > > +        [3] = 64 * MiB,
> > > +        [4] = 256 * MiB,
> > > +        [5] = 0,
> > > +        [6] = 0,
> > > +        [7] = 128 * MiB,
> > > +        [8] = 32 * MiB,
> > > +    };
> > > +    target_ulong rmls = (env->spr[SPR_LPCR] & LPCR_RMLS) >> LPCR_RMLS_SHIFT;
> > > +
> > > +    if (rmls < ARRAY_SIZE(rma_sizes)) {
> > 
> > This condition is always true since the RMLS field is 4-bit long... 
> 
> Oops my mistake, I was already thinking about the suggestion I have
> for something that was puzzling me. See below.
> 
> > I guess you want to check that RMLS encodes a valid RMA size instead.
> > 
> >     if (rma_sizes[rmls]) {
> > 
> > > +        return rma_sizes[rmls];
> > > +    } else {
> > > +        /*
> > > +         * Bad value, so the OS has shot itself in the foot.  Return a
> > > +         * 0-sized RMA which we expect to trigger an immediate DSI or
> > > +         * ISI
> > > +         */
> 
> It seems a bit weird to differentiate the case where the value is bad
> because it happens to be bigger than the highest supported one, compared
> to values that are declared bad in rma_sizes[], like 0, 5 or 6. They're
> all basically the same case of values not used to encode a valid
> size...

Right, but the result is the same either way - the function returns
0.  This is basically just a small space optimization.

> 
> What about :
> 
>     static const target_ulong rma_sizes[16] = {
>         [1] = 16 * GiB,
>         [2] = 1 * GiB,
>         [3] = 64 * MiB,
>         [4] = 256 * MiB,
>         [7] = 128 * MiB,
>         [8] = 32 * MiB,
>     };

Eh, I guess?  I don't see much to pick between them.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 17/18] spapr: Clean up RMA size calculation
  2020-02-25 11:07   ` Philippe Mathieu-Daudé
@ 2020-02-26  1:08     ` David Gibson
  0 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-26  1:08 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, groug, qemu-devel, qemu-ppc, clg,
	Paolo Bonzini, Igor Mammedov, Edgar E. Iglesias, paulus

[-- Attachment #1: Type: text/plain, Size: 2665 bytes --]

On Tue, Feb 25, 2020 at 12:07:29PM +0100, Philippe Mathieu-Daudé wrote:
> On 2/25/20 12:37 AM, David Gibson wrote:
> > Move the calculation of the Real Mode Area (RMA) size into a helper
> > function.  While we're there clean it up and correct it in a few ways:
> >    * Add comments making it clearer where the various constraints come from
> >    * Remove a pointless check that the RMA fits within Node 0 (we've just
> >      clamped it so that it does)
> > 
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > ---
> >   hw/ppc/spapr.c | 59 ++++++++++++++++++++++++++++++--------------------
> >   1 file changed, 35 insertions(+), 24 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index 6e9f15f64d..f0354b699d 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -2648,6 +2648,40 @@ static PCIHostState *spapr_create_default_phb(void)
> >       return PCI_HOST_BRIDGE(dev);
> >   }
> > +static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp)
> > +{
> > +    MachineState *machine = MACHINE(spapr);
> > +    hwaddr rma_size = machine->ram_size;
> > +    hwaddr node0_size = spapr_node0_size(machine);
> > +
> > +    /* RMA has to fit in the first NUMA node */
> > +    rma_size = MIN(rma_size, node0_size);
> > +
> > +    /*
> > +     * VRMA access is via a special 1TiB SLB mapping, so the RMA can
> > +     * never exceed that
> > +     */
> > +    rma_size = MIN(rma_size, TiB);
> 
> Can you use '1 * TiB'? It makes review obvious.

Done.

> > +
> > +    /*
> > +     * Clamp the RMA size based on machine type.  This is for
> > +     * migration compatibility with older qemu versions, which limited
> > +     * the RMA size for complicated and mostly bad reasons.
> > +     */
> > +    if (smc->rma_limit) {
> > +        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
> > +    }
> > +
> > +    if (rma_size < (MIN_RMA_SLOF * MiB)) {
> 
> This looks old copy/paste before the change "spapr: Don't use weird units
> for MIN_RMA_SLOF".
> 
> > +        error_setg(errp,
> > +"pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area)",
> > +                   MIN_RMA_SLOF);
> 
> Similarly, "MIN_RMA_SLOF / MiB"?

Ah, good catch.  I re-ordered the series at some point and forgot to
fix this up.

> > +        return -1;
> 
> Maybe return 0 in case this function is called with errp !=
> &error_fatal.

Good idea.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS]
  2020-02-26  1:04       ` David Gibson
@ 2020-02-26  7:56         ` Greg Kurz
  2020-02-27  4:25           ` David Gibson
  0 siblings, 1 reply; 45+ messages in thread
From: Greg Kurz @ 2020-02-26  7:56 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

[-- Attachment #1: Type: text/plain, Size: 5149 bytes --]

On Wed, 26 Feb 2020 12:04:13 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> On Tue, Feb 25, 2020 at 11:47:25PM +0100, Greg Kurz wrote:
> > On Tue, 25 Feb 2020 18:05:31 +0100
> > Greg Kurz <groug@kaod.org> wrote:
> > 
> > > On Tue, 25 Feb 2020 10:37:15 +1100
> > > David Gibson <david@gibson.dropbear.id.au> wrote:
> > > 
> > > > Currently we use a big switch statement in ppc_hash64_update_rmls() to work
> > > > out what the right RMA limit is based on the LPCR[RMLS] field.  There's no
> > > > formula for this - it's just an arbitrary mapping defined by the existing
> > > > CPU implementations - but we can make it a bit more readable by using a
> > > > lookup table rather than a switch.  In addition we can use the MiB/GiB
> > > > symbols to make it a bit clearer.
> > > > 
> > > > While there we add a bit of clarity and rationale to the comment about
> > > > what happens if the LPCR[RMLS] doesn't contain a valid value.
> > > > 
> > > > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > > > Reviewed-by: Cédric Le Goater <clg@kaod.org>
> > > > ---
> > > >  target/ppc/mmu-hash64.c | 71 ++++++++++++++++++++---------------------
> > > >  1 file changed, 35 insertions(+), 36 deletions(-)
> > > > 
> > > > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> > > > index 0ef330a614..4f082d775d 100644
> > > > --- a/target/ppc/mmu-hash64.c
> > > > +++ b/target/ppc/mmu-hash64.c
> > > > @@ -18,6 +18,7 @@
> > > >   * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> > > >   */
> > > >  #include "qemu/osdep.h"
> > > > +#include "qemu/units.h"
> > > >  #include "cpu.h"
> > > >  #include "exec/exec-all.h"
> > > >  #include "exec/helper-proto.h"This tool was originally developed to fix Linux CPU throttling issues affecting Lenovo T480 / T480s / X1C6 as described here.
> > > > @@ -757,6 +758,39 @@ static void ppc_hash64_set_c(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte1)
> > > >      stb_phys(CPU(cpu)->as, base + offset, (pte1 & 0xff) | 0x80);
> > > >  }
> > > >  
> > > > +static target_ulong rmls_limit(PowerPCCPU *cpu)
> > > > +{
> > > > +    CPUPPCState *env = &cpu->env;
> > > > +    /*
> > > > +     * This is the full 4 bits encoding of POWER8. Previous
> > > > +     * CPUs only support a subset of these but the filtering
> > > > +     * is done when writing LPCR
> > > > +     */
> > > > +    const target_ulong rma_sizes[] = {
> > > > +        [0] = 0,
> > > > +        [1] = 16 * GiB,
> > > > +        [2] = 1 * GiB,
> > > > +        [3] = 64 * MiB,
> > > > +        [4] = 256 * MiB,
> > > > +        [5] = 0,
> > > > +        [6] = 0,
> > > > +        [7] = 128 * MiB,
> > > > +        [8] = 32 * MiB,
> > > > +    };
> > > > +    target_ulong rmls = (env->spr[SPR_LPCR] & LPCR_RMLS) >> LPCR_RMLS_SHIFT;
> > > > +
> > > > +    if (rmls < ARRAY_SIZE(rma_sizes)) {
> > > 
> > > This condition is always true since the RMLS field is 4-bit long... 
> > 
> > Oops my mistake, I was already thinking about the suggestion I have
> > for something that was puzzling me. See below.
> > 
> > > I guess you want to check that RMLS encodes a valid RMA size instead.
> > > 
> > >     if (rma_sizes[rmls]) {
> > > 
> > > > +        return rma_sizes[rmls];
> > > > +    } else {
> > > > +        /*
> > > > +         * Bad value, so the OS has shot itself in the foot.  Return a
> > > > +         * 0-sized RMA which we expect to trigger an immediate DSI or
> > > > +         * ISI
> > > > +         */
> > 
> > It seems a bit weird to differentiate the case where the value is bad
> > because it happens to be bigger than the highest supported one, compared
> > to values that are declared bad in rma_sizes[], like 0, 5 or 6. They're
> > all basically the same case of values not used to encode a valid
> > size...
> 
> Right, but the result is the same either way - the function returns
> 0.  This is basically just a small space optimization.
> 
> > 
> > What about :
> > 
> >     static const target_ulong rma_sizes[16] = {
> >         [1] = 16 * GiB,
> >         [2] = 1 * GiB,
> >         [3] = 64 * MiB,
> >         [4] = 256 * MiB,
> >         [7] = 128 * MiB,
> >         [8] = 32 * MiB,
> >     };
> 
> Eh, I guess?  I don't see much to pick between them.
> 

This is what I had in mind actually.

static target_ulong rmls_limit(PowerPCCPU *cpu)
{
    CPUPPCState *env = &cpu->env;
    /*
     * This is the full 4 bits encoding of POWER8. Previous
     * CPUs only support a subset of these but the filtering
     * is done when writing LPCR.
     *
     * Unsupported values mean the OS has shot itself in the
     * foot. Return a 0-sized RMA in this case, which we expect
     * to trigger an immediate DSI or ISI
     */
    static const target_ulong rma_sizes[16] = {
        [1] = 16 * GiB,
        [2] = 1 * GiB,
        [3] = 64 * MiB,
        [4] = 256 * MiB,
        [7] = 128 * MiB,
        [8] = 32 * MiB,
    };
    target_ulong rmls = (env->spr[SPR_LPCR] & LPCR_RMLS) >> LPCR_RMLS_SHIFT;

    return rma_sizes[rmls];
}

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 10/18] target/ppc: Correct RMLS table
  2020-02-24 23:37 ` [PATCH v6 10/18] target/ppc: Correct RMLS table David Gibson
@ 2020-02-26  8:23   ` Greg Kurz
  0 siblings, 0 replies; 45+ messages in thread
From: Greg Kurz @ 2020-02-26  8:23 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:16 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> The table of RMA limits based on the LPCR[RMLS] field is slightly wrong.
> We're missing the RMLS == 0 => 256 GiB RMA option, which is available on
> POWER8, so add that.
> 
> The comment that goes with the table is much more wrong.  We *don't* filter
> invalid RMLS values when writing the LPCR, and there's not really a
> sensible way to do so.  Furthermore, while in theory the set of RMLS values
> is implementation dependent, it seems in practice the same set has been
> available since around POWER4+ up until POWER8, the last model which
> supports RMLS at all.  So, correct that as well.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---

Irrespectively of my suggestion for the previous patch, which would
call for some adjustments in this patch, the fix is good, so:

Reviewed-by: Greg Kurz <groug@kaod.org>

>  target/ppc/mmu-hash64.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index 4f082d775d..dd0df6fd01 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -762,12 +762,12 @@ static target_ulong rmls_limit(PowerPCCPU *cpu)
>  {
>      CPUPPCState *env = &cpu->env;
>      /*
> -     * This is the full 4 bits encoding of POWER8. Previous
> -     * CPUs only support a subset of these but the filtering
> -     * is done when writing LPCR
> +     * In theory the meanings of RMLS values are implementation
> +     * dependent.  In practice, this seems to have been the set from
> +     * POWER4+..POWER8, and RMLS is no longer supported in POWER9.
>       */
>      const target_ulong rma_sizes[] = {
> -        [0] = 0,
> +        [0] = 256 * GiB,
>          [1] = 16 * GiB,
>          [2] = 1 * GiB,
>          [3] = 64 * MiB,



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 11/18] target/ppc: Only calculate RMLS derived RMA limit on demand
  2020-02-24 23:37 ` [PATCH v6 11/18] target/ppc: Only calculate RMLS derived RMA limit on demand David Gibson
@ 2020-02-26 13:24   ` Greg Kurz
  2020-02-27  4:33     ` David Gibson
  0 siblings, 1 reply; 45+ messages in thread
From: Greg Kurz @ 2020-02-26 13:24 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:17 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> When the LPCR is written, we update the env->rmls field with the RMA limit
> it implies.  Simplify things by just calculating the value directly from
> the LPCR value when we need it.
> 
> It's possible this is a little slower, but it's unlikely to be significant,
> since this is only for real mode accesses in a translation configuration
> that's not used very often, and the whole thing is behind the qemu TLB
> anyway.  Therefore, keeping the number of state variables down and not
> having to worry about making sure it's always in sync seems the better
> option.
> 

This patch also refactors the code of ppc_hash64_update_vrma(), which
is definitely an improvement, but seems a bit unrelated to the title...
I'd personally make it a separate patch but you decide of course :)

Also, a cosmetic remark. See below.

> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> Reviewed-by: Cédric Le Goater <clg@kaod.org>
> ---
>  target/ppc/cpu.h        |  1 -
>  target/ppc/mmu-hash64.c | 84 ++++++++++++++++++++---------------------
>  2 files changed, 40 insertions(+), 45 deletions(-)
> 
> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> index 8077fdb068..f9871b1233 100644
> --- a/target/ppc/cpu.h
> +++ b/target/ppc/cpu.h
> @@ -1046,7 +1046,6 @@ struct CPUPPCState {
>      uint64_t insns_flags2;
>  #if defined(TARGET_PPC64)
>      ppc_slb_t vrma_slb;
> -    target_ulong rmls;
>  #endif
>  
>      int error_code;
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index dd0df6fd01..ac21c14f68 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -791,6 +791,35 @@ static target_ulong rmls_limit(PowerPCCPU *cpu)
>      }
>  }
>  
> +static int build_vrma_slbe(PowerPCCPU *cpu, ppc_slb_t *slb)
> +{
> +    CPUPPCState *env = &cpu->env;
> +    target_ulong lpcr = env->spr[SPR_LPCR];
> +    uint32_t vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT;
> +    target_ulong vsid = SLB_VSID_VRMA | ((vrmasd << 4) & SLB_VSID_LLP_MASK);
> +    int i;
> +
> +    for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
> +        const PPCHash64SegmentPageSizes *sps = &cpu->hash64_opts->sps[i];
> +
> +        if (!sps->page_shift) {
> +            break;
> +        }
> +
> +        if ((vsid & SLB_VSID_LLP_MASK) == sps->slb_enc) {
> +            slb->esid = SLB_ESID_V;
> +            slb->vsid = vsid;
> +            slb->sps = sps;
> +            return 0;
> +        }
> +    }
> +
> +    error_report("Bad page size encoding in LPCR[VRMASD]; LPCR=0x"
> +                 TARGET_FMT_lx"\n", lpcr);
> +
> +    return -1;
> +}
> +
>  int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>                                  int rwx, int mmu_idx)
>  {
> @@ -844,8 +873,10 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>  
>              goto skip_slb_search;
>          } else {
> +            target_ulong limit = rmls_limit(cpu);
> +
>              /* Emulated old-style RMO mode, bounds check against RMLS */
> -            if (raddr >= env->rmls) {
> +            if (raddr >= limit) {
>                  if (rwx == 2) {
>                      ppc_hash64_set_isi(cs, SRR1_PROTFAULT);
>                  } else {
> @@ -1007,8 +1038,9 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
>                  return -1;
>              }
>          } else {
> +            target_ulong limit = rmls_limit(cpu);

Maybe add an empty line like you did above for consistency and better
readability ?

Anyway, feel free to add:

Reviewed-by: Greg Kurz <groug@kaod.org>

>              /* Emulated old-style RMO mode, bounds check against RMLS */
> -            if (raddr >= env->rmls) {
> +            if (raddr >= limit) {
>                  return -1;
>              }
>              return raddr | env->spr[SPR_RMOR];
> @@ -1043,53 +1075,18 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex,
>  static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
>  {
>      CPUPPCState *env = &cpu->env;
> -    const PPCHash64SegmentPageSizes *sps = NULL;
> -    target_ulong esid, vsid, lpcr;
>      ppc_slb_t *slb = &env->vrma_slb;
> -    uint32_t vrmasd;
> -    int i;
> -
> -    /* First clear it */
> -    slb->esid = slb->vsid = 0;
> -    slb->sps = NULL;
>  
>      /* Is VRMA enabled ? */
> -    if (!ppc_hash64_use_vrma(env)) {
> -        return;
> -    }
> -
> -    /*
> -     * Make one up. Mostly ignore the ESID which will not be needed
> -     * for translation
> -     */
> -    lpcr = env->spr[SPR_LPCR];
> -    vsid = SLB_VSID_VRMA;
> -    vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT;
> -    vsid |= (vrmasd << 4) & (SLB_VSID_L | SLB_VSID_LP);
> -    esid = SLB_ESID_V;
> -
> -    for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
> -        const PPCHash64SegmentPageSizes *sps1 = &cpu->hash64_opts->sps[i];
> -
> -        if (!sps1->page_shift) {
> -            break;
> +    if (ppc_hash64_use_vrma(env)) {
> +        if (build_vrma_slbe(cpu, slb) == 0) {
> +            return;
>          }
> -
> -        if ((vsid & SLB_VSID_LLP_MASK) == sps1->slb_enc) {
> -            sps = sps1;
> -            break;
> -        }
> -    }
> -
> -    if (!sps) {
> -        error_report("Bad page size encoding esid 0x"TARGET_FMT_lx
> -                     " vsid 0x"TARGET_FMT_lx, esid, vsid);
> -        return;
>      }
>  
> -    slb->vsid = vsid;
> -    slb->esid = esid;
> -    slb->sps = sps;
> +    /* Otherwise, clear it to indicate error */
> +    slb->esid = slb->vsid = 0;
> +    slb->sps = NULL;
>  }
>  
>  void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
> @@ -1098,7 +1095,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
>      CPUPPCState *env = &cpu->env;
>  
>      env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
> -    env->rmls = rmls_limit(cpu);
>      ppc_hash64_update_vrma(cpu);
>  }
>  



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 12/18] target/ppc: Don't store VRMA SLBE persistently
  2020-02-24 23:37 ` [PATCH v6 12/18] target/ppc: Don't store VRMA SLBE persistently David Gibson
  2020-02-25  0:25   ` Fabiano Rosas
@ 2020-02-26 13:29   ` Greg Kurz
  1 sibling, 0 replies; 45+ messages in thread
From: Greg Kurz @ 2020-02-26 13:29 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:18 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> Currently, we construct the SLBE used for VRMA translations when the LPCR
> is written (which controls some bits in the SLBE), then use it later for
> translations.
> 
> This is a bit complex and confusing - simplify it by simply constructing
> the SLBE directly from the LPCR when we need it.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---

Reviewed-by: Greg Kurz <groug@kaod.org>

>  target/ppc/cpu.h        |  3 ---
>  target/ppc/mmu-hash64.c | 28 ++++++----------------------
>  2 files changed, 6 insertions(+), 25 deletions(-)
> 
> diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> index f9871b1233..5a55fb02bd 100644
> --- a/target/ppc/cpu.h
> +++ b/target/ppc/cpu.h
> @@ -1044,9 +1044,6 @@ struct CPUPPCState {
>      uint32_t flags;
>      uint64_t insns_flags;
>      uint64_t insns_flags2;
> -#if defined(TARGET_PPC64)
> -    ppc_slb_t vrma_slb;
> -#endif
>  
>      int error_code;
>      uint32_t pending_interrupts;
> diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> index ac21c14f68..f8bf92aa2e 100644
> --- a/target/ppc/mmu-hash64.c
> +++ b/target/ppc/mmu-hash64.c
> @@ -825,6 +825,7 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>  {
>      CPUState *cs = CPU(cpu);
>      CPUPPCState *env = &cpu->env;
> +    ppc_slb_t vrma_slbe;
>      ppc_slb_t *slb;
>      unsigned apshift;
>      hwaddr ptex;
> @@ -863,8 +864,8 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
>              }
>          } else if (ppc_hash64_use_vrma(env)) {
>              /* Emulated VRMA mode */
> -            slb = &env->vrma_slb;
> -            if (!slb->sps) {
> +            slb = &vrma_slbe;
> +            if (build_vrma_slbe(cpu, slb) != 0) {
>                  /* Invalid VRMA setup, machine check */
>                  cs->exception_index = POWERPC_EXCP_MCHECK;
>                  env->error_code = 0;
> @@ -1012,6 +1013,7 @@ skip_slb_search:
>  hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
>  {
>      CPUPPCState *env = &cpu->env;
> +    ppc_slb_t vrma_slbe;
>      ppc_slb_t *slb;
>      hwaddr ptex, raddr;
>      ppc_hash_pte64_t pte;
> @@ -1033,8 +1035,8 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
>              return raddr | env->spr[SPR_HRMOR];
>          } else if (ppc_hash64_use_vrma(env)) {
>              /* Emulated VRMA mode */
> -            slb = &env->vrma_slb;
> -            if (!slb->sps) {
> +            slb = &vrma_slbe;
> +            if (build_vrma_slbe(cpu, slb) != 0) {
>                  return -1;
>              }
>          } else {
> @@ -1072,30 +1074,12 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex,
>      cpu->env.tlb_need_flush = TLB_NEED_GLOBAL_FLUSH | TLB_NEED_LOCAL_FLUSH;
>  }
>  
> -static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
> -{
> -    CPUPPCState *env = &cpu->env;
> -    ppc_slb_t *slb = &env->vrma_slb;
> -
> -    /* Is VRMA enabled ? */
> -    if (ppc_hash64_use_vrma(env)) {
> -        if (build_vrma_slbe(cpu, slb) == 0) {
> -            return;
> -        }
> -    }
> -
> -    /* Otherwise, clear it to indicate error */
> -    slb->esid = slb->vsid = 0;
> -    slb->sps = NULL;
> -}
> -
>  void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
>  {
>      PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu);
>      CPUPPCState *env = &cpu->env;
>  
>      env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
> -    ppc_hash64_update_vrma(cpu);
>  }
>  
>  void helper_store_lpcr(CPUPPCState *env, target_ulong val)



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 13/18] spapr: Don't use weird units for MIN_RMA_SLOF
  2020-02-24 23:37 ` [PATCH v6 13/18] spapr: Don't use weird units for MIN_RMA_SLOF David Gibson
  2020-02-25  7:49   ` Cédric Le Goater
@ 2020-02-26 13:32   ` Greg Kurz
  1 sibling, 0 replies; 45+ messages in thread
From: Greg Kurz @ 2020-02-26 13:32 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:19 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> MIN_RMA_SLOF records the minimum about of RMA that the SLOF firmware
> requires.  It lets us give a meaningful error if the RMA ends up too small,
> rather than just letting SLOF crash.
> 
> It's currently stored as a number of megabytes, which is strange for global
> constants.  Move that megabyte scaling into the definition of the constant
> like most other things use.
> 
> Change from M to MiB in the associated message while we're at it.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---

Reviewed-by: Greg Kurz <groug@kaod.org>

>  hw/ppc/spapr.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 828e2cc135..272a270b7a 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -103,7 +103,7 @@
>  #define FW_OVERHEAD             0x2800000
>  #define KERNEL_LOAD_ADDR        FW_MAX_SIZE
>  
> -#define MIN_RMA_SLOF            128UL
> +#define MIN_RMA_SLOF            (128 * MiB)
>  
>  #define PHANDLE_INTC            0x00001111
>  
> @@ -2959,10 +2959,10 @@ static void spapr_machine_init(MachineState *machine)
>          }
>      }
>  
> -    if (spapr->rma_size < (MIN_RMA_SLOF * MiB)) {
> +    if (spapr->rma_size < MIN_RMA_SLOF) {
>          error_report(
> -            "pSeries SLOF firmware requires >= %ldM guest RMA (Real Mode Area memory)",
> -            MIN_RMA_SLOF);
> +            "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area memory)",
> +            MIN_RMA_SLOF / MiB);
>          exit(1);
>      }
>  



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 17/18] spapr: Clean up RMA size calculation
  2020-02-24 23:37 ` [PATCH v6 17/18] spapr: Clean up RMA size calculation David Gibson
  2020-02-25 11:07   ` Philippe Mathieu-Daudé
@ 2020-02-26 13:37   ` Greg Kurz
  2020-02-27  6:04     ` David Gibson
  1 sibling, 1 reply; 45+ messages in thread
From: Greg Kurz @ 2020-02-26 13:37 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:23 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> Move the calculation of the Real Mode Area (RMA) size into a helper
> function.  While we're there clean it up and correct it in a few ways:
>   * Add comments making it clearer where the various constraints come from
>   * Remove a pointless check that the RMA fits within Node 0 (we've just
>     clamped it so that it does)
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>  hw/ppc/spapr.c | 59 ++++++++++++++++++++++++++++++--------------------
>  1 file changed, 35 insertions(+), 24 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 6e9f15f64d..f0354b699d 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -2648,6 +2648,40 @@ static PCIHostState *spapr_create_default_phb(void)
>      return PCI_HOST_BRIDGE(dev);
>  }
>  
> +static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp)
> +{
> +    MachineState *machine = MACHINE(spapr);
> +    hwaddr rma_size = machine->ram_size;
> +    hwaddr node0_size = spapr_node0_size(machine);
> +
> +    /* RMA has to fit in the first NUMA node */
> +    rma_size = MIN(rma_size, node0_size);
> +
> +    /*
> +     * VRMA access is via a special 1TiB SLB mapping, so the RMA can
> +     * never exceed that
> +     */
> +    rma_size = MIN(rma_size, TiB);
> +
> +    /*
> +     * Clamp the RMA size based on machine type.  This is for
> +     * migration compatibility with older qemu versions, which limited
> +     * the RMA size for complicated and mostly bad reasons.
> +     */
> +    if (smc->rma_limit) {

/home/greg/Work/qemu/qemu-ppc/hw/ppc/spapr.c: In function ‘spapr_rma_size’:
/home/greg/Work/qemu/qemu-ppc/hw/ppc/spapr.c:2671:9: error: ‘smc’ undeclared (first use in this function)
     if (smc->rma_limit) {

> +        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
> +    }
> +
> +    if (rma_size < (MIN_RMA_SLOF * MiB)) {
> +        error_setg(errp,
> +"pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area)",
> +                   MIN_RMA_SLOF);
> +        return -1;
> +    }
> +
> +    return rma_size;
> +}
> +
>  /* pSeries LPAR / sPAPR hardware init */
>  static void spapr_machine_init(MachineState *machine)
>  {
> @@ -2660,7 +2694,6 @@ static void spapr_machine_init(MachineState *machine)
>      int i;
>      MemoryRegion *sysmem = get_system_memory();
>      MemoryRegion *ram = g_new(MemoryRegion, 1);
> -    hwaddr node0_size = spapr_node0_size(machine);
>      long load_limit, fw_size;
>      char *filename;
>      Error *resize_hpt_err = NULL;
> @@ -2700,22 +2733,7 @@ static void spapr_machine_init(MachineState *machine)
>          exit(1);
>      }
>  
> -    spapr->rma_size = node0_size;
> -
> -    /*
> -     * Clamp the RMA size based on machine type.  This is for
> -     * migration compatibility with older qemu versions, which limited
> -     * the RMA size for complicated and mostly bad reasons.
> -     */
> -    if (smc->rma_limit) {
> -        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
> -    }
> -
> -    if (spapr->rma_size > node0_size) {
> -        error_report("Numa node 0 has to span the RMA (%#08"HWADDR_PRIx")",
> -                     spapr->rma_size);
> -        exit(1);
> -    }
> +    spapr->rma_size = spapr_rma_size(spapr, &error_fatal);
>  
>      /* Setup a load limit for the ramdisk leaving room for SLOF and FDT */
>      load_limit = MIN(spapr->rma_size, RTAS_MAX_ADDR) - FW_OVERHEAD;
> @@ -2954,13 +2972,6 @@ static void spapr_machine_init(MachineState *machine)
>          }
>      }
>  
> -    if (spapr->rma_size < MIN_RMA_SLOF) {
> -        error_report(
> -            "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area memory)",
> -            MIN_RMA_SLOF / MiB);
> -        exit(1);
> -    }
> -
>      if (kernel_filename) {
>          uint64_t lowaddr = 0;
>  



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 18/18] spapr: Fold spapr_node0_size() into its only caller
  2020-02-24 23:37 ` [PATCH v6 18/18] spapr: Fold spapr_node0_size() into its only caller David Gibson
@ 2020-02-26 14:47   ` Greg Kurz
  0 siblings, 0 replies; 45+ messages in thread
From: Greg Kurz @ 2020-02-26 14:47 UTC (permalink / raw)
  To: David Gibson
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

On Tue, 25 Feb 2020 10:37:24 +1100
David Gibson <david@gibson.dropbear.id.au> wrote:

> The Real Mode Area (RMA) needs to fit within the NUMA node owning memory
> at address 0.  That's usually node 0, but can be a later one if there are
> some nodes which have no memory (only CPUs).
> 
> This is currently handled by the spapr_node0_size() helper.  It has only
> one caller, so there's not a lot of point splitting it out.  It's also
> extremely easy to misread the code as clamping to the size of the smallest
> node rather than the first node with any memory.
> 
> So, fold it into the caller, and add some commentary to make it a bit
> clearer exactly what it's doing.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>  hw/ppc/spapr.c | 37 +++++++++++++++++++++----------------
>  1 file changed, 21 insertions(+), 16 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index f0354b699d..9ba645c9cb 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -296,20 +296,6 @@ static void spapr_populate_pa_features(SpaprMachineState *spapr,
>      _FDT((fdt_setprop(fdt, offset, "ibm,pa-features", pa_features, pa_size)));
>  }
>  
> -static hwaddr spapr_node0_size(MachineState *machine)
> -{
> -    if (machine->numa_state->num_nodes) {
> -        int i;
> -        for (i = 0; i < machine->numa_state->num_nodes; ++i) {
> -            if (machine->numa_state->nodes[i].node_mem) {
> -                return MIN(pow2floor(machine->numa_state->nodes[i].node_mem),
> -                           machine->ram_size);
> -            }
> -        }
> -    }
> -    return machine->ram_size;
> -}
> -
>  static void add_str(GString *s, const gchar *s1)
>  {
>      g_string_append_len(s, s1, strlen(s1) + 1);
> @@ -2652,10 +2638,24 @@ static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp)
>  {
>      MachineState *machine = MACHINE(spapr);
>      hwaddr rma_size = machine->ram_size;
> -    hwaddr node0_size = spapr_node0_size(machine);
>  
>      /* RMA has to fit in the first NUMA node */
> -    rma_size = MIN(rma_size, node0_size);
> +    if (machine->numa_state->num_nodes) {
> +        /*
> +         * It's possible for there to be some zero-memory nodes first
> +         * in the list.  We need the RMA to fit inside the memory of
> +         * the first node which actually has some memory.
> +         */
> +        int i;
> +
> +        for (i = 0; i < machine->numa_state->num_nodes; ++i) {
> +            if (machine->numa_state->nodes[i].node_mem != 0) {
> +                rma_size = MIN(rma_size,
> +                               machine->numa_state->nodes[i].node_mem);
> +                break;
> +            }
> +        }
> +    }
>  
>      /*
>       * VRMA access is via a special 1TiB SLB mapping, so the RMA can
> @@ -2672,6 +2672,11 @@ static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp)
>          spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
>      }
>  
> +    /*
> +     * RMA size must be a power of 2
> +     */
> +    rma_size = pow2floor(rma_size);
> +

This slightly changes semantics. In a scenario without NUMA,
we used to get:

    rma_size == machine->ram_size

but with this patch we now get:

    rma_size == pow2floor(machine->ram_size)

Maybe mention it in the changelog ?

Anyway,

Reviewed-by: Greg Kurz <groug@kaod.org>

>      if (rma_size < (MIN_RMA_SLOF * MiB)) {
>          error_setg(errp,
>  "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area)",



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS]
  2020-02-26  7:56         ` Greg Kurz
@ 2020-02-27  4:25           ` David Gibson
  0 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-27  4:25 UTC (permalink / raw)
  To: Greg Kurz
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

[-- Attachment #1: Type: text/plain, Size: 5733 bytes --]

On Wed, Feb 26, 2020 at 08:56:40AM +0100, Greg Kurz wrote:
> On Wed, 26 Feb 2020 12:04:13 +1100
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > On Tue, Feb 25, 2020 at 11:47:25PM +0100, Greg Kurz wrote:
> > > On Tue, 25 Feb 2020 18:05:31 +0100
> > > Greg Kurz <groug@kaod.org> wrote:
> > > 
> > > > On Tue, 25 Feb 2020 10:37:15 +1100
> > > > David Gibson <david@gibson.dropbear.id.au> wrote:
> > > > 
> > > > > Currently we use a big switch statement in ppc_hash64_update_rmls() to work
> > > > > out what the right RMA limit is based on the LPCR[RMLS] field.  There's no
> > > > > formula for this - it's just an arbitrary mapping defined by the existing
> > > > > CPU implementations - but we can make it a bit more readable by using a
> > > > > lookup table rather than a switch.  In addition we can use the MiB/GiB
> > > > > symbols to make it a bit clearer.
> > > > > 
> > > > > While there we add a bit of clarity and rationale to the comment about
> > > > > what happens if the LPCR[RMLS] doesn't contain a valid value.
> > > > > 
> > > > > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > > > > Reviewed-by: Cédric Le Goater <clg@kaod.org>
> > > > > ---
> > > > >  target/ppc/mmu-hash64.c | 71 ++++++++++++++++++++---------------------
> > > > >  1 file changed, 35 insertions(+), 36 deletions(-)
> > > > > 
> > > > > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> > > > > index 0ef330a614..4f082d775d 100644
> > > > > --- a/target/ppc/mmu-hash64.c
> > > > > +++ b/target/ppc/mmu-hash64.c
> > > > > @@ -18,6 +18,7 @@
> > > > >   * License along with this library; if not, see <http://www.gnu.org/licenses/>.
> > > > >   */
> > > > >  #include "qemu/osdep.h"
> > > > > +#include "qemu/units.h"
> > > > >  #include "cpu.h"
> > > > >  #include "exec/exec-all.h"
> > > > >  #include "exec/helper-proto.h"This tool was originally developed to fix Linux CPU throttling issues affecting Lenovo T480 / T480s / X1C6 as described here.
> > > > > @@ -757,6 +758,39 @@ static void ppc_hash64_set_c(PowerPCCPU *cpu, hwaddr ptex, uint64_t pte1)
> > > > >      stb_phys(CPU(cpu)->as, base + offset, (pte1 & 0xff) | 0x80);
> > > > >  }
> > > > >  
> > > > > +static target_ulong rmls_limit(PowerPCCPU *cpu)
> > > > > +{
> > > > > +    CPUPPCState *env = &cpu->env;
> > > > > +    /*
> > > > > +     * This is the full 4 bits encoding of POWER8. Previous
> > > > > +     * CPUs only support a subset of these but the filtering
> > > > > +     * is done when writing LPCR
> > > > > +     */
> > > > > +    const target_ulong rma_sizes[] = {
> > > > > +        [0] = 0,
> > > > > +        [1] = 16 * GiB,
> > > > > +        [2] = 1 * GiB,
> > > > > +        [3] = 64 * MiB,
> > > > > +        [4] = 256 * MiB,
> > > > > +        [5] = 0,
> > > > > +        [6] = 0,
> > > > > +        [7] = 128 * MiB,
> > > > > +        [8] = 32 * MiB,
> > > > > +    };
> > > > > +    target_ulong rmls = (env->spr[SPR_LPCR] & LPCR_RMLS) >> LPCR_RMLS_SHIFT;
> > > > > +
> > > > > +    if (rmls < ARRAY_SIZE(rma_sizes)) {
> > > > 
> > > > This condition is always true since the RMLS field is 4-bit long... 
> > > 
> > > Oops my mistake, I was already thinking about the suggestion I have
> > > for something that was puzzling me. See below.
> > > 
> > > > I guess you want to check that RMLS encodes a valid RMA size instead.
> > > > 
> > > >     if (rma_sizes[rmls]) {
> > > > 
> > > > > +        return rma_sizes[rmls];
> > > > > +    } else {
> > > > > +        /*
> > > > > +         * Bad value, so the OS has shot itself in the foot.  Return a
> > > > > +         * 0-sized RMA which we expect to trigger an immediate DSI or
> > > > > +         * ISI
> > > > > +         */
> > > 
> > > It seems a bit weird to differentiate the case where the value is bad
> > > because it happens to be bigger than the highest supported one, compared
> > > to values that are declared bad in rma_sizes[], like 0, 5 or 6. They're
> > > all basically the same case of values not used to encode a valid
> > > size...
> > 
> > Right, but the result is the same either way - the function returns
> > 0.  This is basically just a small space optimization.
> > 
> > > 
> > > What about :
> > > 
> > >     static const target_ulong rma_sizes[16] = {
> > >         [1] = 16 * GiB,
> > >         [2] = 1 * GiB,
> > >         [3] = 64 * MiB,
> > >         [4] = 256 * MiB,
> > >         [7] = 128 * MiB,
> > >         [8] = 32 * MiB,
> > >     };
> > 
> > Eh, I guess?  I don't see much to pick between them.
> > 
> 
> This is what I had in mind actually.
> 
> static target_ulong rmls_limit(PowerPCCPU *cpu)
> {
>     CPUPPCState *env = &cpu->env;
>     /*
>      * This is the full 4 bits encoding of POWER8. Previous
>      * CPUs only support a subset of these but the filtering
>      * is done when writing LPCR.
>      *
>      * Unsupported values mean the OS has shot itself in the
>      * foot. Return a 0-sized RMA in this case, which we expect
>      * to trigger an immediate DSI or ISI
>      */
>     static const target_ulong rma_sizes[16] = {
>         [1] = 16 * GiB,
>         [2] = 1 * GiB,
>         [3] = 64 * MiB,
>         [4] = 256 * MiB,
>         [7] = 128 * MiB,
>         [8] = 32 * MiB,
>     };
>     target_ulong rmls = (env->spr[SPR_LPCR] & LPCR_RMLS) >> LPCR_RMLS_SHIFT;
> 
>     return rma_sizes[rmls];
> }

Yeah, I guess that is a little neater.  I've made the change.

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 11/18] target/ppc: Only calculate RMLS derived RMA limit on demand
  2020-02-26 13:24   ` Greg Kurz
@ 2020-02-27  4:33     ` David Gibson
  0 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-27  4:33 UTC (permalink / raw)
  To: Greg Kurz
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

[-- Attachment #1: Type: text/plain, Size: 6887 bytes --]

On Wed, Feb 26, 2020 at 02:24:53PM +0100, Greg Kurz wrote:
> On Tue, 25 Feb 2020 10:37:17 +1100
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > When the LPCR is written, we update the env->rmls field with the RMA limit
> > it implies.  Simplify things by just calculating the value directly from
> > the LPCR value when we need it.
> > 
> > It's possible this is a little slower, but it's unlikely to be significant,
> > since this is only for real mode accesses in a translation configuration
> > that's not used very often, and the whole thing is behind the qemu TLB
> > anyway.  Therefore, keeping the number of state variables down and not
> > having to worry about making sure it's always in sync seems the better
> > option.
> > 
> 
> This patch also refactors the code of ppc_hash64_update_vrma(), which
> is definitely an improvement, but seems a bit unrelated to the title...
> I'd personally make it a separate patch but you decide of course :)

Ah, dang it, botched rebase damage.  There are a couple of hunks here
that are supposed to be in the next patch.  I think I've sorted it out
now.

> 
> Also, a cosmetic remark. See below.
> 
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > Reviewed-by: Cédric Le Goater <clg@kaod.org>
> > ---
> >  target/ppc/cpu.h        |  1 -
> >  target/ppc/mmu-hash64.c | 84 ++++++++++++++++++++---------------------
> >  2 files changed, 40 insertions(+), 45 deletions(-)
> > 
> > diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
> > index 8077fdb068..f9871b1233 100644
> > --- a/target/ppc/cpu.h
> > +++ b/target/ppc/cpu.h
> > @@ -1046,7 +1046,6 @@ struct CPUPPCState {
> >      uint64_t insns_flags2;
> >  #if defined(TARGET_PPC64)
> >      ppc_slb_t vrma_slb;
> > -    target_ulong rmls;
> >  #endif
> >  
> >      int error_code;
> > diff --git a/target/ppc/mmu-hash64.c b/target/ppc/mmu-hash64.c
> > index dd0df6fd01..ac21c14f68 100644
> > --- a/target/ppc/mmu-hash64.c
> > +++ b/target/ppc/mmu-hash64.c
> > @@ -791,6 +791,35 @@ static target_ulong rmls_limit(PowerPCCPU *cpu)
> >      }
> >  }
> >  
> > +static int build_vrma_slbe(PowerPCCPU *cpu, ppc_slb_t *slb)
> > +{
> > +    CPUPPCState *env = &cpu->env;
> > +    target_ulong lpcr = env->spr[SPR_LPCR];
> > +    uint32_t vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT;
> > +    target_ulong vsid = SLB_VSID_VRMA | ((vrmasd << 4) & SLB_VSID_LLP_MASK);
> > +    int i;
> > +
> > +    for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
> > +        const PPCHash64SegmentPageSizes *sps = &cpu->hash64_opts->sps[i];
> > +
> > +        if (!sps->page_shift) {
> > +            break;
> > +        }
> > +
> > +        if ((vsid & SLB_VSID_LLP_MASK) == sps->slb_enc) {
> > +            slb->esid = SLB_ESID_V;
> > +            slb->vsid = vsid;
> > +            slb->sps = sps;
> > +            return 0;
> > +        }
> > +    }
> > +
> > +    error_report("Bad page size encoding in LPCR[VRMASD]; LPCR=0x"
> > +                 TARGET_FMT_lx"\n", lpcr);
> > +
> > +    return -1;
> > +}
> > +
> >  int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
> >                                  int rwx, int mmu_idx)
> >  {
> > @@ -844,8 +873,10 @@ int ppc_hash64_handle_mmu_fault(PowerPCCPU *cpu, vaddr eaddr,
> >  
> >              goto skip_slb_search;
> >          } else {
> > +            target_ulong limit = rmls_limit(cpu);
> > +
> >              /* Emulated old-style RMO mode, bounds check against RMLS */
> > -            if (raddr >= env->rmls) {
> > +            if (raddr >= limit) {
> >                  if (rwx == 2) {
> >                      ppc_hash64_set_isi(cs, SRR1_PROTFAULT);
> >                  } else {
> > @@ -1007,8 +1038,9 @@ hwaddr ppc_hash64_get_phys_page_debug(PowerPCCPU *cpu, target_ulong addr)
> >                  return -1;
> >              }
> >          } else {
> > +            target_ulong limit = rmls_limit(cpu);
> 
> Maybe add an empty line like you did above for consistency and better
> readability ?

Ok, done.

> 
> Anyway, feel free to add:
> 
> Reviewed-by: Greg Kurz <groug@kaod.org>
> 
> >              /* Emulated old-style RMO mode, bounds check against RMLS */
> > -            if (raddr >= env->rmls) {
> > +            if (raddr >= limit) {
> >                  return -1;
> >              }
> >              return raddr | env->spr[SPR_RMOR];
> > @@ -1043,53 +1075,18 @@ void ppc_hash64_tlb_flush_hpte(PowerPCCPU *cpu, target_ulong ptex,
> >  static void ppc_hash64_update_vrma(PowerPCCPU *cpu)
> >  {
> >      CPUPPCState *env = &cpu->env;
> > -    const PPCHash64SegmentPageSizes *sps = NULL;
> > -    target_ulong esid, vsid, lpcr;
> >      ppc_slb_t *slb = &env->vrma_slb;
> > -    uint32_t vrmasd;
> > -    int i;
> > -
> > -    /* First clear it */
> > -    slb->esid = slb->vsid = 0;
> > -    slb->sps = NULL;
> >  
> >      /* Is VRMA enabled ? */
> > -    if (!ppc_hash64_use_vrma(env)) {
> > -        return;
> > -    }
> > -
> > -    /*
> > -     * Make one up. Mostly ignore the ESID which will not be needed
> > -     * for translation
> > -     */
> > -    lpcr = env->spr[SPR_LPCR];
> > -    vsid = SLB_VSID_VRMA;
> > -    vrmasd = (lpcr & LPCR_VRMASD) >> LPCR_VRMASD_SHIFT;
> > -    vsid |= (vrmasd << 4) & (SLB_VSID_L | SLB_VSID_LP);
> > -    esid = SLB_ESID_V;
> > -
> > -    for (i = 0; i < PPC_PAGE_SIZES_MAX_SZ; i++) {
> > -        const PPCHash64SegmentPageSizes *sps1 = &cpu->hash64_opts->sps[i];
> > -
> > -        if (!sps1->page_shift) {
> > -            break;
> > +    if (ppc_hash64_use_vrma(env)) {
> > +        if (build_vrma_slbe(cpu, slb) == 0) {
> > +            return;
> >          }
> > -
> > -        if ((vsid & SLB_VSID_LLP_MASK) == sps1->slb_enc) {
> > -            sps = sps1;
> > -            break;
> > -        }
> > -    }
> > -
> > -    if (!sps) {
> > -        error_report("Bad page size encoding esid 0x"TARGET_FMT_lx
> > -                     " vsid 0x"TARGET_FMT_lx, esid, vsid);
> > -        return;
> >      }
> >  
> > -    slb->vsid = vsid;
> > -    slb->esid = esid;
> > -    slb->sps = sps;
> > +    /* Otherwise, clear it to indicate error */
> > +    slb->esid = slb->vsid = 0;
> > +    slb->sps = NULL;
> >  }
> >  
> >  void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
> > @@ -1098,7 +1095,6 @@ void ppc_store_lpcr(PowerPCCPU *cpu, target_ulong val)
> >      CPUPPCState *env = &cpu->env;
> >  
> >      env->spr[SPR_LPCR] = val & pcc->lpcr_mask;
> > -    env->rmls = rmls_limit(cpu);
> >      ppc_hash64_update_vrma(cpu);
> >  }
> >  
> 

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: [PATCH v6 17/18] spapr: Clean up RMA size calculation
  2020-02-26 13:37   ` Greg Kurz
@ 2020-02-27  6:04     ` David Gibson
  0 siblings, 0 replies; 45+ messages in thread
From: David Gibson @ 2020-02-27  6:04 UTC (permalink / raw)
  To: Greg Kurz
  Cc: lvivier, Thomas Huth, Xiao Guangrong, Michael S. Tsirkin, aik,
	farosas, Mark Cave-Ayland, qemu-devel, Igor Mammedov, qemu-ppc,
	clg, Paolo Bonzini, Edgar E. Iglesias, paulus

[-- Attachment #1: Type: text/plain, Size: 4513 bytes --]

On Wed, Feb 26, 2020 at 02:37:51PM +0100, Greg Kurz wrote:
> On Tue, 25 Feb 2020 10:37:23 +1100
> David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > Move the calculation of the Real Mode Area (RMA) size into a helper
> > function.  While we're there clean it up and correct it in a few ways:
> >   * Add comments making it clearer where the various constraints come from
> >   * Remove a pointless check that the RMA fits within Node 0 (we've just
> >     clamped it so that it does)
> > 
> > Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> > ---
> >  hw/ppc/spapr.c | 59 ++++++++++++++++++++++++++++++--------------------
> >  1 file changed, 35 insertions(+), 24 deletions(-)
> > 
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index 6e9f15f64d..f0354b699d 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -2648,6 +2648,40 @@ static PCIHostState *spapr_create_default_phb(void)
> >      return PCI_HOST_BRIDGE(dev);
> >  }
> >  
> > +static hwaddr spapr_rma_size(SpaprMachineState *spapr, Error **errp)
> > +{
> > +    MachineState *machine = MACHINE(spapr);
> > +    hwaddr rma_size = machine->ram_size;
> > +    hwaddr node0_size = spapr_node0_size(machine);
> > +
> > +    /* RMA has to fit in the first NUMA node */
> > +    rma_size = MIN(rma_size, node0_size);
> > +
> > +    /*
> > +     * VRMA access is via a special 1TiB SLB mapping, so the RMA can
> > +     * never exceed that
> > +     */
> > +    rma_size = MIN(rma_size, TiB);
> > +
> > +    /*
> > +     * Clamp the RMA size based on machine type.  This is for
> > +     * migration compatibility with older qemu versions, which limited
> > +     * the RMA size for complicated and mostly bad reasons.
> > +     */
> > +    if (smc->rma_limit) {
> 
> /home/greg/Work/qemu/qemu-ppc/hw/ppc/spapr.c: In function ‘spapr_rma_size’:
> /home/greg/Work/qemu/qemu-ppc/hw/ppc/spapr.c:2671:9: error: ‘smc’ undeclared (first use in this function)
>      if (smc->rma_limit) {

Oops.  Fixed.

> 
> > +        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
> > +    }
> > +
> > +    if (rma_size < (MIN_RMA_SLOF * MiB)) {
> > +        error_setg(errp,
> > +"pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area)",
> > +                   MIN_RMA_SLOF);
> > +        return -1;
> > +    }
> > +
> > +    return rma_size;
> > +}
> > +
> >  /* pSeries LPAR / sPAPR hardware init */
> >  static void spapr_machine_init(MachineState *machine)
> >  {
> > @@ -2660,7 +2694,6 @@ static void spapr_machine_init(MachineState *machine)
> >      int i;
> >      MemoryRegion *sysmem = get_system_memory();
> >      MemoryRegion *ram = g_new(MemoryRegion, 1);
> > -    hwaddr node0_size = spapr_node0_size(machine);
> >      long load_limit, fw_size;
> >      char *filename;
> >      Error *resize_hpt_err = NULL;
> > @@ -2700,22 +2733,7 @@ static void spapr_machine_init(MachineState *machine)
> >          exit(1);
> >      }
> >  
> > -    spapr->rma_size = node0_size;
> > -
> > -    /*
> > -     * Clamp the RMA size based on machine type.  This is for
> > -     * migration compatibility with older qemu versions, which limited
> > -     * the RMA size for complicated and mostly bad reasons.
> > -     */
> > -    if (smc->rma_limit) {
> > -        spapr->rma_size = MIN(spapr->rma_size, smc->rma_limit);
> > -    }
> > -
> > -    if (spapr->rma_size > node0_size) {
> > -        error_report("Numa node 0 has to span the RMA (%#08"HWADDR_PRIx")",
> > -                     spapr->rma_size);
> > -        exit(1);
> > -    }
> > +    spapr->rma_size = spapr_rma_size(spapr, &error_fatal);
> >  
> >      /* Setup a load limit for the ramdisk leaving room for SLOF and FDT */
> >      load_limit = MIN(spapr->rma_size, RTAS_MAX_ADDR) - FW_OVERHEAD;
> > @@ -2954,13 +2972,6 @@ static void spapr_machine_init(MachineState *machine)
> >          }
> >      }
> >  
> > -    if (spapr->rma_size < MIN_RMA_SLOF) {
> > -        error_report(
> > -            "pSeries SLOF firmware requires >= %ldMiB guest RMA (Real Mode Area memory)",
> > -            MIN_RMA_SLOF / MiB);
> > -        exit(1);
> > -    }
> > -
> >      if (kernel_filename) {
> >          uint64_t lowaddr = 0;
> >  
> 

-- 
David Gibson			| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
				| _way_ _around_!
http://www.ozlabs.org/~dgibson

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 45+ messages in thread

end of thread, other threads:[~2020-02-27 21:56 UTC | newest]

Thread overview: 45+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-24 23:37 [PATCH v6 00/18] target/ppc: Correct some errors with real mode handling David Gibson
2020-02-24 23:37 ` [PATCH v6 01/18] pseries: Update SLOF firmware image David Gibson
2020-02-24 23:37 ` [PATCH v6 02/18] ppc: Remove stub support for 32-bit hypervisor mode David Gibson
2020-02-25  6:31   ` Greg Kurz
2020-02-24 23:37 ` [PATCH v6 03/18] ppc: Remove stub of PPC970 HID4 implementation David Gibson
2020-02-24 23:37 ` [PATCH v6 04/18] target/ppc: Correct handling of real mode accesses with vhyp on hash MMU David Gibson
2020-02-25 10:29   ` Greg Kurz
2020-02-24 23:37 ` [PATCH v6 05/18] target/ppc: Introduce ppc_hash64_use_vrma() helper David Gibson
2020-02-25  0:12   ` Fabiano Rosas
2020-02-25 10:30   ` Greg Kurz
2020-02-24 23:37 ` [PATCH v6 06/18] spapr, ppc: Remove VPM0/RMLS hacks for POWER9 David Gibson
2020-02-25 11:29   ` Greg Kurz
2020-02-25 15:58     ` Greg Kurz
2020-02-26  1:00       ` David Gibson
2020-02-24 23:37 ` [PATCH v6 07/18] target/ppc: Remove RMOR register from POWER9 & POWER10 David Gibson
2020-02-25 11:30   ` Greg Kurz
2020-02-24 23:37 ` [PATCH v6 08/18] target/ppc: Use class fields to simplify LPCR masking David Gibson
2020-02-25 15:48   ` Greg Kurz
2020-02-24 23:37 ` [PATCH v6 09/18] target/ppc: Streamline calculation of RMA limit from LPCR[RMLS] David Gibson
2020-02-25 17:05   ` Greg Kurz
2020-02-25 22:47     ` Greg Kurz
2020-02-26  1:04       ` David Gibson
2020-02-26  7:56         ` Greg Kurz
2020-02-27  4:25           ` David Gibson
2020-02-24 23:37 ` [PATCH v6 10/18] target/ppc: Correct RMLS table David Gibson
2020-02-26  8:23   ` Greg Kurz
2020-02-24 23:37 ` [PATCH v6 11/18] target/ppc: Only calculate RMLS derived RMA limit on demand David Gibson
2020-02-26 13:24   ` Greg Kurz
2020-02-27  4:33     ` David Gibson
2020-02-24 23:37 ` [PATCH v6 12/18] target/ppc: Don't store VRMA SLBE persistently David Gibson
2020-02-25  0:25   ` Fabiano Rosas
2020-02-26 13:29   ` Greg Kurz
2020-02-24 23:37 ` [PATCH v6 13/18] spapr: Don't use weird units for MIN_RMA_SLOF David Gibson
2020-02-25  7:49   ` Cédric Le Goater
2020-02-26 13:32   ` Greg Kurz
2020-02-24 23:37 ` [PATCH v6 14/18] spapr,ppc: Simplify signature of kvmppc_rma_size() David Gibson
2020-02-24 23:37 ` [PATCH v6 15/18] spapr: Don't attempt to clamp RMA to VRMA constraint David Gibson
2020-02-24 23:37 ` [PATCH v6 16/18] spapr: Don't clamp RMA to 16GiB on new machine types David Gibson
2020-02-24 23:37 ` [PATCH v6 17/18] spapr: Clean up RMA size calculation David Gibson
2020-02-25 11:07   ` Philippe Mathieu-Daudé
2020-02-26  1:08     ` David Gibson
2020-02-26 13:37   ` Greg Kurz
2020-02-27  6:04     ` David Gibson
2020-02-24 23:37 ` [PATCH v6 18/18] spapr: Fold spapr_node0_size() into its only caller David Gibson
2020-02-26 14:47   ` Greg Kurz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.