aboutsummaryrefslogtreecommitdiff
path: root/hw
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 /hw
parent70f872ca916ac4552fa71d82b8d006b3e679089e (diff)
parentd139786e1b3d67991e6cb49a8a59bb2182350285 (diff)
downloadqemu-42f6c9179be4401974dd3a75ee72defd16b5092d.zip
qemu-42f6c9179be4401974dd3a75ee72defd16b5092d.tar.gz
qemu-42f6c9179be4401974dd3a75ee72defd16b5092d.tar.bz2
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>
Diffstat (limited to 'hw')
-rw-r--r--hw/ppc/spapr_numa.c62
1 files changed, 31 insertions, 31 deletions
diff --git a/hw/ppc/spapr_numa.c b/hw/ppc/spapr_numa.c
index 56ab2a5..e9ef7e7 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);
}
}