- s390x/sclp: Simplify get_sclp_device() - target/ppc: Remove msr_pr macro - docs/system/target-arm: Re-alphabetize board list - migration: Extend query-migrate to provide dirty page limit info - migration: Implement dirty-limit convergence algo - migration: Put the detection logic before auto-converge checking - migration: Refactor auto-converge capability logic - migration: Introduce dirty-limit capability - qapi/migration: Introduce vcpu-dirty-limit parameters - qapi/migration: Introduce x-vcpu-dirty-limit-period parameter - Change the value of no_ged from true to false - Allow UNIX socket option for VNC websocket - tpm_emulator: Avoid double initialization during - chardev/char-socket: Update AF_UNIX for Windows - KVM: dirty ring: add missing memory barrier - i386: reset KVM nested state upon CPU reset - esp: Handle CMD_BUSRESET by resetting the SCSI bus - dbus-vmstate: Restrict error checks to registered proxies in dbus_get_proxies - vfio/pci: Add Ascend310b scend910b support - target/i386: Export RFDS bit to guests - target/i386: Add new CPU model SierraForest - target/i386: Introduce Icelake-Server-v7 to enable TSX - hw/virtio: handle un-configured shutdown in virtio-pci - target/s390x: display deprecation status in '-cpu help' - target/i386: display deprecation status in '-cpu help' - pc-bios/s390-ccw: Fix booting with logical block size < physical block size Signed-off-by: Jiabo Feng <fengjiabo1@huawei.com>
237 lines
9.6 KiB
Diff
237 lines
9.6 KiB
Diff
From d83a066d969070373afe68f32f8584c66f2ee747 Mon Sep 17 00:00:00 2001
|
|
From: dinglimin <dinglimin@cmss.chinamobile.com>
|
|
Date: Sun, 9 Jun 2024 14:04:03 +0800
|
|
Subject: [PATCH] target/ppc: Remove msr_pr macro cheery-pick from
|
|
d41ccf6eea918ec121cd38eda6e2526b446013f4 msr_pr macro hides the usage of
|
|
env->msr, which is a bad behavior Substitute it with FIELD_EX64 calls that
|
|
explicitly use env->msr as a parameter.
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
|
|
Signed-off-by: Víctor Colombo <victor.colombo@eldorado.org.br>
|
|
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
|
|
Message-Id: <20220504210541.115256-4-victor.colombo@eldorado.org.br>
|
|
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
|
|
Signed-off-by: dinglimin <dinglimin@cmss.chinamobile.com>
|
|
---
|
|
hw/ppc/pegasos2.c | 2 +-
|
|
hw/ppc/spapr.c | 2 +-
|
|
target/ppc/cpu.h | 4 +++-
|
|
target/ppc/cpu_init.c | 4 ++--
|
|
target/ppc/excp_helper.c | 3 ++-
|
|
target/ppc/mem_helper.c | 5 +++--
|
|
target/ppc/mmu-radix64.c | 5 +++--
|
|
target/ppc/mmu_common.c | 24 +++++++++++++-----------
|
|
8 files changed, 28 insertions(+), 21 deletions(-)
|
|
|
|
diff --git a/hw/ppc/pegasos2.c b/hw/ppc/pegasos2.c
|
|
index 298e6b93e2..7b7eb38152 100644
|
|
--- a/hw/ppc/pegasos2.c
|
|
+++ b/hw/ppc/pegasos2.c
|
|
@@ -457,7 +457,7 @@ static void pegasos2_hypercall(PPCVirtualHypervisor *vhyp, PowerPCCPU *cpu)
|
|
/* The TCG path should also be holding the BQL at this point */
|
|
g_assert(qemu_mutex_iothread_locked());
|
|
|
|
- if (msr_pr) {
|
|
+ if (FIELD_EX64(env->msr, MSR, PR)) {
|
|
qemu_log_mask(LOG_GUEST_ERROR, "Hypercall made with MSR[PR]=1\n");
|
|
env->gpr[3] = H_PRIVILEGE;
|
|
} else if (env->gpr[3] == KVMPPC_H_RTAS) {
|
|
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
|
|
index 7f352ceaaa..d1fbea16e3 100644
|
|
--- a/hw/ppc/spapr.c
|
|
+++ b/hw/ppc/spapr.c
|
|
@@ -1268,7 +1268,7 @@ static void emulate_spapr_hypercall(PPCVirtualHypervisor *vhyp,
|
|
/* The TCG path should also be holding the BQL at this point */
|
|
g_assert(qemu_mutex_iothread_locked());
|
|
|
|
- if (msr_pr) {
|
|
+ if (FIELD_EX64(env->msr, MSR, PR)) {
|
|
hcall_dprintf("Hypercall made with MSR[PR]=1\n");
|
|
env->gpr[3] = H_PRIVILEGE;
|
|
} else {
|
|
diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
|
|
index 26312f9d5f..8b214b2cc1 100644
|
|
--- a/target/ppc/cpu.h
|
|
+++ b/target/ppc/cpu.h
|
|
@@ -24,6 +24,7 @@
|
|
#include "exec/cpu-defs.h"
|
|
#include "cpu-qom.h"
|
|
#include "qom/object.h"
|
|
+#include "hw/registerfields.h"
|
|
|
|
#define TCG_GUEST_DEFAULT_MO 0
|
|
|
|
@@ -343,6 +344,8 @@ typedef struct ppc_v3_pate_t {
|
|
#define MSR_RI 1 /* Recoverable interrupt 1 */
|
|
#define MSR_LE 0 /* Little-endian mode 1 hflags */
|
|
|
|
+FIELD(MSR, PR, MSR_PR, 1)
|
|
+
|
|
/* PMU bits */
|
|
#define MMCR0_FC PPC_BIT(32) /* Freeze Counters */
|
|
#define MMCR0_PMAO PPC_BIT(56) /* Perf Monitor Alert Occurred */
|
|
@@ -443,7 +446,6 @@ typedef struct ppc_v3_pate_t {
|
|
#define msr_ce ((env->msr >> MSR_CE) & 1)
|
|
#define msr_ile ((env->msr >> MSR_ILE) & 1)
|
|
#define msr_ee ((env->msr >> MSR_EE) & 1)
|
|
-#define msr_pr ((env->msr >> MSR_PR) & 1)
|
|
#define msr_fp ((env->msr >> MSR_FP) & 1)
|
|
#define msr_me ((env->msr >> MSR_ME) & 1)
|
|
#define msr_fe0 ((env->msr >> MSR_FE0) & 1)
|
|
diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
|
|
index 986d16a24d..d3b283dcd2 100644
|
|
--- a/target/ppc/cpu_init.c
|
|
+++ b/target/ppc/cpu_init.c
|
|
@@ -7961,7 +7961,7 @@ static bool cpu_has_work_POWER9(CPUState *cs)
|
|
if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
|
|
(env->spr[SPR_LPCR] & LPCR_EEE)) {
|
|
bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC);
|
|
- if (heic == 0 || !msr_hv || msr_pr) {
|
|
+ if (!heic || !msr_hv || FIELD_EX64(env->msr, MSR, PR)) {
|
|
return true;
|
|
}
|
|
}
|
|
@@ -8170,7 +8170,7 @@ static bool cpu_has_work_POWER10(CPUState *cs)
|
|
if ((env->pending_interrupts & (1u << PPC_INTERRUPT_EXT)) &&
|
|
(env->spr[SPR_LPCR] & LPCR_EEE)) {
|
|
bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC);
|
|
- if (heic == 0 || !msr_hv || msr_pr) {
|
|
+ if (!heic || !msr_hv || FIELD_EX64(env->msr, MSR, PR)) {
|
|
return true;
|
|
}
|
|
}
|
|
diff --git a/target/ppc/excp_helper.c b/target/ppc/excp_helper.c
|
|
index f66063d55c..3576e87b28 100644
|
|
--- a/target/ppc/excp_helper.c
|
|
+++ b/target/ppc/excp_helper.c
|
|
@@ -976,7 +976,8 @@ static void ppc_hw_interrupt(CPUPPCState *env)
|
|
bool lpes0 = !!(env->spr[SPR_LPCR] & LPCR_LPES0);
|
|
bool heic = !!(env->spr[SPR_LPCR] & LPCR_HEIC);
|
|
/* HEIC blocks delivery to the hypervisor */
|
|
- if ((async_deliver && !(heic && msr_hv && !msr_pr)) ||
|
|
+ if ((async_deliver && !(heic && msr_hv &&
|
|
+ !FIELD_EX64(env->msr, MSR, PR))) ||
|
|
(env->has_hv_mode && msr_hv == 0 && !lpes0)) {
|
|
powerpc_excp(cpu, env->excp_model, POWERPC_EXCP_EXTERNAL);
|
|
return;
|
|
diff --git a/target/ppc/mem_helper.c b/target/ppc/mem_helper.c
|
|
index 39945d9ea5..ceb4aa41d7 100644
|
|
--- a/target/ppc/mem_helper.c
|
|
+++ b/target/ppc/mem_helper.c
|
|
@@ -613,10 +613,11 @@ void helper_tbegin(CPUPPCState *env)
|
|
(1ULL << TEXASR_FAILURE_PERSISTENT) |
|
|
(1ULL << TEXASR_NESTING_OVERFLOW) |
|
|
(msr_hv << TEXASR_PRIVILEGE_HV) |
|
|
- (msr_pr << TEXASR_PRIVILEGE_PR) |
|
|
+ (FIELD_EX64(env->msr, MSR, PR) << TEXASR_PRIVILEGE_PR) |
|
|
(1ULL << TEXASR_FAILURE_SUMMARY) |
|
|
(1ULL << TEXASR_TFIAR_EXACT);
|
|
- env->spr[SPR_TFIAR] = env->nip | (msr_hv << 1) | msr_pr;
|
|
+ env->spr[SPR_TFIAR] = env->nip | (msr_hv << 1) |
|
|
+ FIELD_EX64(env->msr, MSR, PR);
|
|
env->spr[SPR_TFHAR] = env->nip + 4;
|
|
env->crf[0] = 0xB; /* 0b1010 = transaction failure */
|
|
}
|
|
diff --git a/target/ppc/mmu-radix64.c b/target/ppc/mmu-radix64.c
|
|
index 5b0e62e676..3f016730cd 100644
|
|
--- a/target/ppc/mmu-radix64.c
|
|
+++ b/target/ppc/mmu-radix64.c
|
|
@@ -171,12 +171,13 @@ static bool ppc_radix64_check_prot(PowerPCCPU *cpu, MMUAccessType access_type,
|
|
}
|
|
|
|
/* Determine permissions allowed by Encoded Access Authority */
|
|
- if (!partition_scoped && (pte & R_PTE_EAA_PRIV) && msr_pr) {
|
|
+ if (!partition_scoped && (pte & R_PTE_EAA_PRIV) &&
|
|
+ FIELD_EX64(env->msr, MSR, PR)) {
|
|
*prot = 0;
|
|
} else if (mmuidx_pr(mmu_idx) || (pte & R_PTE_EAA_PRIV) ||
|
|
partition_scoped) {
|
|
*prot = ppc_radix64_get_prot_eaa(pte);
|
|
- } else { /* !msr_pr && !(pte & R_PTE_EAA_PRIV) && !partition_scoped */
|
|
+ } else { /* !MSR_PR && !(pte & R_PTE_EAA_PRIV) && !partition_scoped */
|
|
*prot = ppc_radix64_get_prot_eaa(pte);
|
|
*prot &= ppc_radix64_get_prot_amr(cpu); /* Least combined permissions */
|
|
}
|
|
diff --git a/target/ppc/mmu_common.c b/target/ppc/mmu_common.c
|
|
index 754509e556..fb1059bcf2 100644
|
|
--- a/target/ppc/mmu_common.c
|
|
+++ b/target/ppc/mmu_common.c
|
|
@@ -292,8 +292,8 @@ static inline void bat_size_prot(CPUPPCState *env, target_ulong *blp,
|
|
bl = (*BATu & 0x00001FFC) << 15;
|
|
valid = 0;
|
|
prot = 0;
|
|
- if (((msr_pr == 0) && (*BATu & 0x00000002)) ||
|
|
- ((msr_pr != 0) && (*BATu & 0x00000001))) {
|
|
+ if ((!FIELD_EX64(env->msr, MSR, PR) && (*BATu & 0x00000002)) ||
|
|
+ (FIELD_EX64(env->msr, MSR, PR) && (*BATu & 0x00000001))) {
|
|
valid = 1;
|
|
pp = *BATl & 0x00000003;
|
|
if (pp != 0) {
|
|
@@ -386,16 +386,17 @@ static int get_segment_6xx_tlb(CPUPPCState *env, mmu_ctx_t *ctx,
|
|
PowerPCCPU *cpu = env_archcpu(env);
|
|
hwaddr hash;
|
|
target_ulong vsid;
|
|
- int ds, pr, target_page_bits;
|
|
+ int ds, target_page_bits;
|
|
+ bool pr;
|
|
int ret;
|
|
target_ulong sr, pgidx;
|
|
|
|
- pr = msr_pr;
|
|
+ pr = FIELD_EX64(env->msr, MSR, PR);
|
|
ctx->eaddr = eaddr;
|
|
|
|
sr = env->sr[eaddr >> 28];
|
|
- ctx->key = (((sr & 0x20000000) && (pr != 0)) ||
|
|
- ((sr & 0x40000000) && (pr == 0))) ? 1 : 0;
|
|
+ ctx->key = (((sr & 0x20000000) && pr) ||
|
|
+ ((sr & 0x40000000) && !pr)) ? 1 : 0;
|
|
ds = sr & 0x80000000 ? 1 : 0;
|
|
ctx->nx = sr & 0x10000000 ? 1 : 0;
|
|
vsid = sr & 0x00FFFFFF;
|
|
@@ -404,8 +405,9 @@ static int get_segment_6xx_tlb(CPUPPCState *env, mmu_ctx_t *ctx,
|
|
"Check segment v=" TARGET_FMT_lx " %d " TARGET_FMT_lx
|
|
" nip=" TARGET_FMT_lx " lr=" TARGET_FMT_lx
|
|
" ir=%d dr=%d pr=%d %d t=%d\n",
|
|
- eaddr, (int)(eaddr >> 28), sr, env->nip, env->lr, (int)msr_ir,
|
|
- (int)msr_dr, pr != 0 ? 1 : 0, access_type == MMU_DATA_STORE, type);
|
|
+ eaddr, (int)(eaddr >> 28), sr, env->nip, env->lr,
|
|
+ (int)msr_ir, (int)msr_dr, pr ? 1 : 0,
|
|
+ access_type == MMU_DATA_STORE, type);
|
|
pgidx = (eaddr & ~SEGMENT_MASK_256M) >> target_page_bits;
|
|
hash = vsid ^ pgidx;
|
|
ctx->ptem = (vsid << 7) | (pgidx >> 10);
|
|
@@ -566,7 +568,7 @@ static int mmu40x_get_physical_address(CPUPPCState *env, mmu_ctx_t *ctx,
|
|
|
|
ret = -1;
|
|
raddr = (hwaddr)-1ULL;
|
|
- pr = msr_pr;
|
|
+ pr = FIELD_EX64(env->msr, MSR, PR);
|
|
for (i = 0; i < env->nb_tlb; i++) {
|
|
tlb = &env->tlb.tlbe[i];
|
|
if (ppcemb_tlb_check(env, tlb, &raddr, address,
|
|
@@ -651,7 +653,7 @@ static int mmubooke_check_tlb(CPUPPCState *env, ppcemb_tlb_t *tlb,
|
|
|
|
found_tlb:
|
|
|
|
- if (msr_pr != 0) {
|
|
+ if (FIELD_EX64(env->msr, MSR, PR)) {
|
|
prot2 = tlb->prot & 0xF;
|
|
} else {
|
|
prot2 = (tlb->prot >> 4) & 0xF;
|
|
@@ -799,7 +801,7 @@ static bool mmubooke206_get_as(CPUPPCState *env,
|
|
return true;
|
|
} else {
|
|
*as_out = msr_ds;
|
|
- *pr_out = msr_pr;
|
|
+ *pr_out = FIELD_EX64(env->msr, MSR, PR);
|
|
return false;
|
|
}
|
|
}
|
|
--
|
|
2.27.0
|
|
|