aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <richard.henderson@linaro.org>2021-11-12 12:28:25 +0100
committerRichard Henderson <richard.henderson@linaro.org>2021-11-12 12:28:25 +0100
commit42f6c9179be4401974dd3a75ee72defd16b5092d (patch)
treec88184f63e4293a96b39078ad9ecddbd1dbb9119
parent70f872ca916ac4552fa71d82b8d006b3e679089e (diff)
parentd139786e1b3d67991e6cb49a8a59bb2182350285 (diff)
Merge tag 'pull-ppc-20211112' of https://github.com/legoater/qemu into staging
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) # gpg: Signature made Fri 12 Nov 2021 12:11:29 PM CET # gpg: using RSA key A0F66548F04895EBFE6B0B6051A343C7CFFBECA1 # gpg: Good signature from "Cédric Le Goater <clg@kaod.org>" [marginal] # gpg: WARNING: This key is not certified with sufficiently trusted signatures! # gpg: It is not certain that the signature belongs to the owner. # Primary key fingerprint: A0F6 6548 F048 95EB FE6B 0B60 51A3 43C7 CFFB ECA1 * tag 'pull-ppc-20211112' of https://github.com/legoater/qemu: ppc/mmu_helper.c: do not truncate 'ea' in booke206_invalidate_ea_tlb() spapr_numa.c: fix FORM1 distance-less nodes target/ppc: Fix register update on lf[sd]u[x]/stf[sd]u[x] Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
-rw-r--r--hw/ppc/spapr_numa.c62
-rw-r--r--target/ppc/mmu_helper.c2
-rw-r--r--target/ppc/translate/fp-impl.c.inc2
3 files changed, 33 insertions, 33 deletions
diff --git a/hw/ppc/spapr_numa.c b/hw/ppc/spapr_numa.c
index 56ab2a5fb6..e9ef7e7646 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);
}
}
diff --git a/target/ppc/mmu_helper.c b/target/ppc/mmu_helper.c
index 2cb98c5169..e0c4950dda 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);
diff --git a/target/ppc/translate/fp-impl.c.inc b/target/ppc/translate/fp-impl.c.inc
index d1dbb1b96b..c9e05201d9 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);