On Tue, 24 Jan 2017, Thomas Huth wrote:
Date: Tue, 24 Jan 2017 21:32:44 +0100
From: Thomas Huth <th...@redhat.com>
To: Valentin Plotkin <calib...@sdf.org>, qemu-triv...@nongnu.org
Cc: qemu-...@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-ppc] [PATCH] PPC: MMU compatibility check.
On 24.01.2017 19:56, Valentin Plotkin wrote:
Hi everyone,
I looked at the "qemu-system-ppc -nographic -cpu G2leGP3 -M ppce500" on
the BiteSizedTasks page. The segfault was caused by machine
initialization code which expected a certain MMU model, checked, so
unused SPR were read, returning zeros. bamboo and virtex machines are
affected as well, but it doesn't always cause segfault, usually running
into unmapped memory and failing somewhat more nicely.
I added the checks. It would be possible to add support for other MMU
models, but I'm not sure if there is any point (would any guest OS
support mutually exclusive CPU and machine)?
Hi,
great to have a fix for this crash! I don't think it make much sense to
add support for other MMU models here, so the simple checks should be
good enough.
However, your new code obviously does not follow the QEMU coding style.
Could you please run your patch through scripts/checkpatch.pl and fix
all issues that it reports? And when you resubmit, please make sure to
copy the maintainers on CC: as well (scripts/get_maintainers.pl is your
friend here).
Thanks,
Thomas
Here is fengshuised version (at least I hope so). Thanks for guiding me.
Signed-off-by: Valentin Plotkin <calib...@sdf.org>
---
hw/ppc/e500.c | 6 ++++++
hw/ppc/ppc440_bamboo.c | 6 ++++++
hw/ppc/virtex_ml507.c | 6 ++++++
3 files changed, 18 insertions(+)
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index cf8b122..683d9a9 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -631,6 +631,12 @@ static uint64_t mmubooke_initial_mapsize(CPUPPCState
*env)
static void mmubooke_create_initial_mapping(CPUPPCState *env)
{
+ if (env->mmu_model != POWERPC_MMU_BOOKE206) {
+ fprintf(stderr, "MMU model %i not supported by this machine.\n",
+ env->mmu_model);
+ exit(-1);
+ }
+
ppcmas_tlb_t *tlb = booke206_get_tlbm(env, 1, 0, 0);
hwaddr size;
int ps;
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 5c535b1..793b758 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -124,6 +124,12 @@ static void
mmubooke_create_initial_mapping(CPUPPCState *env,
target_ulong va,
hwaddr pa)
{
+ if (env->mmu_model != POWERPC_MMU_BOOKE) {
+ fprintf(stderr, "MMU model %i not supported by this machine.\n",
+ env->mmu_model);
+ exit(-1);
+ }
+
ppcemb_tlb_t *tlb = &env->tlb.tlbe[0];
tlb->attr = 0;
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index b97d966..c01415c 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -69,6 +69,12 @@ static void mmubooke_create_initial_mapping(CPUPPCState
*env,
target_ulong va,
hwaddr pa)
{
+ if (env->mmu_model != POWERPC_MMU_BOOKE) {
+ fprintf(stderr, "MMU model %i not supported by this machine.\n",
+ env->mmu_model);
+ exit(-1);
+ }
+
ppcemb_tlb_t *tlb = &env->tlb.tlbe[0];
tlb->attr = 0;
--
2.5.5
calib...@sdf.org
SDF Public Access UNIX System - http://sdf.org