All of lore.kernel.org
 help / color / mirror / Atom feed
* [PULL 0/3] ppc 6.2 queue
@ 2021-11-12 11:15 Cédric Le Goater
  2021-11-12 11:15 ` [PULL 1/3] target/ppc: Fix register update on lf[sd]u[x]/stf[sd]u[x] Cédric Le Goater
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Cédric Le Goater @ 2021-11-12 11:15 UTC (permalink / raw)
  To: qemu-ppc, qemu-devel, Greg Kurz
  Cc: Daniel Henrique Barboza, Cédric Le Goater, David Gibson

The following changes since commit 0a70bcf18caf7a61d480f8448723c15209d128ef:

  Update version for v6.2.0-rc0 release (2021-11-09 18:22:57 +0100)

are available in the Git repository at:

  https://github.com/legoater/qemu/ tags/pull-ppc-20211112

for you to fetch changes up to d139786e1b3d67991e6cb49a8a59bb2182350285:

  ppc/mmu_helper.c: do not truncate 'ea' in booke206_invalidate_ea_tlb() (2021-11-11 11:35:13 +0100)

----------------------------------------------------------------
ppc 6.2 queue :

* Fix of a regression in floating point load instructions (Matheus)
* Associativity fix for pseries machine (Daniel)
* tlbivax fix for BookE machines (Danel)

----------------------------------------------------------------
Daniel Henrique Barboza (2):
      spapr_numa.c: fix FORM1 distance-less nodes
      ppc/mmu_helper.c: do not truncate 'ea' in booke206_invalidate_ea_tlb()

Matheus Ferst (1):
      target/ppc: Fix register update on lf[sd]u[x]/stf[sd]u[x]

 hw/ppc/spapr_numa.c                | 62 +++++++++++++++++++-------------------
 target/ppc/mmu_helper.c            |  2 +-
 target/ppc/translate/fp-impl.c.inc |  2 +-
 3 files changed, 33 insertions(+), 33 deletions(-)


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

* [PULL 1/3] target/ppc: Fix register update on lf[sd]u[x]/stf[sd]u[x]
  2021-11-12 11:15 [PULL 0/3] ppc 6.2 queue Cédric Le Goater
@ 2021-11-12 11:15 ` Cédric Le Goater
  2021-11-12 11:15 ` [PULL 2/3] spapr_numa.c: fix FORM1 distance-less nodes Cédric Le Goater
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Cédric Le Goater @ 2021-11-12 11:15 UTC (permalink / raw)
  To: qemu-ppc, qemu-devel, Greg Kurz
  Cc: Mark Cave-Ayland, Daniel Henrique Barboza, Matheus Ferst,
	Cédric Le Goater, David Gibson

From: Matheus Ferst <matheus.ferst@eldorado.org.br>

These instructions should update the GPR indicated by the field RA
instead of RT. This error caused a regression on Mac OS 9 boot and some
graphical glitches in OS X.

Fixes: a39a106634a9 ("target/ppc: Move load and store floating point instructions to decodetree")
Reported-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Signed-off-by: Matheus Ferst <matheus.ferst@eldorado.org.br>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 target/ppc/translate/fp-impl.c.inc | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/target/ppc/translate/fp-impl.c.inc b/target/ppc/translate/fp-impl.c.inc
index d1dbb1b96b16..c9e05201d9e7 100644
--- a/target/ppc/translate/fp-impl.c.inc
+++ b/target/ppc/translate/fp-impl.c.inc
@@ -1328,7 +1328,7 @@ static bool do_lsfpsd(DisasContext *ctx, int rt, int ra, TCGv displ,
         set_fpr(rt, t0);
     }
     if (update) {
-        tcg_gen_mov_tl(cpu_gpr[rt], ea);
+        tcg_gen_mov_tl(cpu_gpr[ra], ea);
     }
     tcg_temp_free_i64(t0);
     tcg_temp_free(ea);
-- 
2.31.1



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

* [PULL 2/3] spapr_numa.c: fix FORM1 distance-less nodes
  2021-11-12 11:15 [PULL 0/3] ppc 6.2 queue Cédric Le Goater
  2021-11-12 11:15 ` [PULL 1/3] target/ppc: Fix register update on lf[sd]u[x]/stf[sd]u[x] Cédric Le Goater
@ 2021-11-12 11:15 ` Cédric Le Goater
  2021-11-12 11:15 ` [PULL 3/3] ppc/mmu_helper.c: do not truncate 'ea' in booke206_invalidate_ea_tlb() Cédric Le Goater
  2021-11-12 13:30 ` [PULL 0/3] ppc 6.2 queue Richard Henderson
  3 siblings, 0 replies; 5+ messages in thread
From: Cédric Le Goater @ 2021-11-12 11:15 UTC (permalink / raw)
  To: qemu-ppc, qemu-devel, Greg Kurz
  Cc: Aneesh Kumar K . V, Daniel Henrique Barboza, Richard Henderson,
	Nicholas Piggin, Cédric Le Goater, David Gibson

From: Daniel Henrique Barboza <danielhb413@gmail.com>

Commit 71e6fae3a99 fixed an issue with FORM2 affinity guests with NUMA
nodes in which the distance info is absent in
machine_state->numa_state->nodes. This happens when QEMU adds a default
NUMA node and when the user adds NUMA nodes without specifying the
distances.

During the discussions of the forementioned patch [1] it was found that
FORM1 guests were behaving in a strange way in the same scenario, with
the kernel seeing the distances between the nodes as '160', as we can
see in this example with 4 NUMA nodes without distance information:

$ numactl -H
available: 4 nodes (0-3)
(...)
node distances:
node   0   1   2   3
  0:  10  160  160  160
  1:  160  10  160  160
  2:  160  160  10  160
  3:  160  160  160  10

Turns out that we have the same problem with FORM1 guests - we are
calculating associativity domain using zeroed values. And as it also
turns out, the solution from 71e6fae3a99 applies to FORM1 as well.

This patch creates a wrapper called 'get_numa_distance' that contains
the logic used in FORM2 to define node distances when this information
is absent. This helper is then used in all places where we need to read
distance information from machine_state->numa_state->nodes. That way
we'll guarantee that the NUMA node distance is always being curated
before being used.

After this patch, the FORM1 guest mentioned above will have the
following topology:

$ numactl -H
available: 4 nodes (0-3)
(...)
node distances:
node   0   1   2   3
  0:  10  20  20  20
  1:  20  10  20  20
  2:  20  20  10  20
  3:  20  20  20  10

This is compatible with what FORM2 guests and other archs do in this
case.

[1] https://lists.gnu.org/archive/html/qemu-devel/2021-11/msg01960.html

Fixes: 690fbe4295d5 ("spapr_numa: consider user input when defining associativity")
CC: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
CC: Nicholas Piggin <npiggin@gmail.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 hw/ppc/spapr_numa.c | 62 ++++++++++++++++++++++-----------------------
 1 file changed, 31 insertions(+), 31 deletions(-)

diff --git a/hw/ppc/spapr_numa.c b/hw/ppc/spapr_numa.c
index 56ab2a5fb649..e9ef7e764696 100644
--- a/hw/ppc/spapr_numa.c
+++ b/hw/ppc/spapr_numa.c
@@ -66,16 +66,41 @@ static const uint32_t *get_associativity(SpaprMachineState *spapr, int node_id)
     return spapr->FORM1_assoc_array[node_id];
 }
 
+/*
+ * Wrapper that returns node distance from ms->numa_state->nodes
+ * after handling edge cases where the distance might be absent.
+ */
+static int get_numa_distance(MachineState *ms, int src, int dst)
+{
+    NodeInfo *numa_info = ms->numa_state->nodes;
+    int ret = numa_info[src].distance[dst];
+
+    if (ret != 0) {
+        return ret;
+    }
+
+    /*
+     * In case QEMU adds a default NUMA single node when the user
+     * did not add any, or where the user did not supply distances,
+     * the distance will be absent (zero). Return local/remote
+     * distance in this case.
+     */
+    if (src == dst) {
+        return NUMA_DISTANCE_MIN;
+    }
+
+    return NUMA_DISTANCE_DEFAULT;
+}
+
 static bool spapr_numa_is_symmetrical(MachineState *ms)
 {
-    int src, dst;
     int nb_numa_nodes = ms->numa_state->num_nodes;
-    NodeInfo *numa_info = ms->numa_state->nodes;
+    int src, dst;
 
     for (src = 0; src < nb_numa_nodes; src++) {
         for (dst = src; dst < nb_numa_nodes; dst++) {
-            if (numa_info[src].distance[dst] !=
-                numa_info[dst].distance[src]) {
+            if (get_numa_distance(ms, src, dst) !=
+                get_numa_distance(ms, dst, src)) {
                 return false;
             }
         }
@@ -133,7 +158,6 @@ static uint8_t spapr_numa_get_numa_level(uint8_t distance)
 static void spapr_numa_define_FORM1_domains(SpaprMachineState *spapr)
 {
     MachineState *ms = MACHINE(spapr);
-    NodeInfo *numa_info = ms->numa_state->nodes;
     int nb_numa_nodes = ms->numa_state->num_nodes;
     int src, dst, i, j;
 
@@ -170,7 +194,7 @@ static void spapr_numa_define_FORM1_domains(SpaprMachineState *spapr)
              * The PPC kernel expects the associativity domains of node 0 to
              * be always 0, and this algorithm will grant that by default.
              */
-            uint8_t distance = numa_info[src].distance[dst];
+            uint8_t distance = get_numa_distance(ms, src, dst);
             uint8_t n_level = spapr_numa_get_numa_level(distance);
             uint32_t assoc_src;
 
@@ -498,7 +522,6 @@ static void spapr_numa_FORM2_write_rtas_tables(SpaprMachineState *spapr,
                                                void *fdt, int rtas)
 {
     MachineState *ms = MACHINE(spapr);
-    NodeInfo *numa_info = ms->numa_state->nodes;
     int nb_numa_nodes = ms->numa_state->num_nodes;
     int distance_table_entries = nb_numa_nodes * nb_numa_nodes;
     g_autofree uint32_t *lookup_index_table = NULL;
@@ -540,30 +563,7 @@ static void spapr_numa_FORM2_write_rtas_tables(SpaprMachineState *spapr,
 
     for (src = 0; src < nb_numa_nodes; src++) {
         for (dst = 0; dst < nb_numa_nodes; dst++) {
-            /*
-             * We need to be explicit with the local distance
-             * value to cover the case where the user didn't added any
-             * NUMA nodes, but QEMU adds the default NUMA node without
-             * adding the numa_info to retrieve distance info from.
-             */
-            distance_table[i] = numa_info[src].distance[dst];
-            if (distance_table[i] == 0) {
-                /*
-                 * In case QEMU adds a default NUMA single node when the user
-                 * did not add any, or where the user did not supply distances,
-                 * the value will be 0 here. Populate the table with a fallback
-                 * simple local / remote distance.
-                 */
-                if (src == dst) {
-                    distance_table[i] = NUMA_DISTANCE_MIN;
-                } else {
-                    distance_table[i] = numa_info[src].distance[dst];
-                    if (distance_table[i] < NUMA_DISTANCE_MIN) {
-                        distance_table[i] = NUMA_DISTANCE_DEFAULT;
-                    }
-                }
-            }
-            i++;
+            distance_table[i++] = get_numa_distance(ms, src, dst);
         }
     }
 
-- 
2.31.1



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

* [PULL 3/3] ppc/mmu_helper.c: do not truncate 'ea' in booke206_invalidate_ea_tlb()
  2021-11-12 11:15 [PULL 0/3] ppc 6.2 queue Cédric Le Goater
  2021-11-12 11:15 ` [PULL 1/3] target/ppc: Fix register update on lf[sd]u[x]/stf[sd]u[x] Cédric Le Goater
  2021-11-12 11:15 ` [PULL 2/3] spapr_numa.c: fix FORM1 distance-less nodes Cédric Le Goater
@ 2021-11-12 11:15 ` Cédric Le Goater
  2021-11-12 13:30 ` [PULL 0/3] ppc 6.2 queue Richard Henderson
  3 siblings, 0 replies; 5+ messages in thread
From: Cédric Le Goater @ 2021-11-12 11:15 UTC (permalink / raw)
  To: qemu-ppc, qemu-devel, Greg Kurz
  Cc: Cédric Le Goater, Daniel Henrique Barboza,
	Philippe Mathieu-Daudé,
	David Gibson

From: Daniel Henrique Barboza <danielhb413@gmail.com>

'tlbivax' is implemented by gen_tlbivax_booke206() via
gen_helper_booke206_tlbivax(). In case the TLB needs to be flushed,
booke206_invalidate_ea_tlb() is called. All these functions, but
booke206_invalidate_ea_tlb(), uses a 64-bit effective address 'ea'.

booke206_invalidate_ea_tlb() uses an uint32_t 'ea' argument that
truncates the original 'ea' value for apparently no particular reason.
This function retrieves the tlb pointer by calling booke206_get_tlbm(),
which also uses a target_ulong address as parameter - in this case, a
truncated 'ea' address. All the surrounding logic considers the
effective TLB address as a 64 bit value, aside from the signature of
booke206_invalidate_ea_tlb().

Last but not the least, PowerISA 2.07B section 6.11.4.9 [2] makes it
clear that the effective address "EA" is a 64 bit value.

Commit 01662f3e5133 introduced this code and no changes were made ever
since. An user detected a problem with tlbivax [1] stating that this
address truncation was the cause. This same behavior might be the source
of several subtle bugs that were never caught.

For all these reasons, this patch assumes that this address truncation
is the result of a mistake/oversight of the original commit, and changes
booke206_invalidate_ea_tlb() 'ea' argument to 'vaddr'.

[1] https://gitlab.com/qemu-project/qemu/-/issues/52
[2] https://wiki.raptorcs.com/wiki/File:PowerISA_V2.07B.pdf

Fixes: 01662f3e5133 ("PPC: Implement e500 (FSL) MMU")
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/52
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 target/ppc/mmu_helper.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/target/ppc/mmu_helper.c b/target/ppc/mmu_helper.c
index 2cb98c516987..e0c4950dda53 100644
--- a/target/ppc/mmu_helper.c
+++ b/target/ppc/mmu_helper.c
@@ -1216,7 +1216,7 @@ void helper_booke206_tlbsx(CPUPPCState *env, target_ulong address)
 }
 
 static inline void booke206_invalidate_ea_tlb(CPUPPCState *env, int tlbn,
-                                              uint32_t ea)
+                                              vaddr ea)
 {
     int i;
     int ways = booke206_tlb_ways(env, tlbn);
-- 
2.31.1



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

* Re: [PULL 0/3] ppc 6.2 queue
  2021-11-12 11:15 [PULL 0/3] ppc 6.2 queue Cédric Le Goater
                   ` (2 preceding siblings ...)
  2021-11-12 11:15 ` [PULL 3/3] ppc/mmu_helper.c: do not truncate 'ea' in booke206_invalidate_ea_tlb() Cédric Le Goater
@ 2021-11-12 13:30 ` Richard Henderson
  3 siblings, 0 replies; 5+ messages in thread
From: Richard Henderson @ 2021-11-12 13:30 UTC (permalink / raw)
  To: Cédric Le Goater, qemu-ppc, qemu-devel, Greg Kurz
  Cc: Daniel Henrique Barboza, David Gibson

On 11/12/21 12:15 PM, Cédric Le Goater wrote:
> The following changes since commit 0a70bcf18caf7a61d480f8448723c15209d128ef:
> 
>    Update version for v6.2.0-rc0 release (2021-11-09 18:22:57 +0100)
> 
> are available in the Git repository at:
> 
>    https://github.com/legoater/qemu/ tags/pull-ppc-20211112
> 
> for you to fetch changes up to d139786e1b3d67991e6cb49a8a59bb2182350285:
> 
>    ppc/mmu_helper.c: do not truncate 'ea' in booke206_invalidate_ea_tlb() (2021-11-11 11:35:13 +0100)
> 
> ----------------------------------------------------------------
> ppc 6.2 queue :
> 
> * Fix of a regression in floating point load instructions (Matheus)
> * Associativity fix for pseries machine (Daniel)
> * tlbivax fix for BookE machines (Danel)
> 
> ----------------------------------------------------------------
> Daniel Henrique Barboza (2):
>        spapr_numa.c: fix FORM1 distance-less nodes
>        ppc/mmu_helper.c: do not truncate 'ea' in booke206_invalidate_ea_tlb()
> 
> Matheus Ferst (1):
>        target/ppc: Fix register update on lf[sd]u[x]/stf[sd]u[x]
> 
>   hw/ppc/spapr_numa.c                | 62 +++++++++++++++++++-------------------
>   target/ppc/mmu_helper.c            |  2 +-
>   target/ppc/translate/fp-impl.c.inc |  2 +-
>   3 files changed, 33 insertions(+), 33 deletions(-)

Applied, thanks.

r~



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

end of thread, other threads:[~2021-11-12 13:32 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-12 11:15 [PULL 0/3] ppc 6.2 queue Cédric Le Goater
2021-11-12 11:15 ` [PULL 1/3] target/ppc: Fix register update on lf[sd]u[x]/stf[sd]u[x] Cédric Le Goater
2021-11-12 11:15 ` [PULL 2/3] spapr_numa.c: fix FORM1 distance-less nodes Cédric Le Goater
2021-11-12 11:15 ` [PULL 3/3] ppc/mmu_helper.c: do not truncate 'ea' in booke206_invalidate_ea_tlb() Cédric Le Goater
2021-11-12 13:30 ` [PULL 0/3] ppc 6.2 queue Richard Henderson

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.