PPC: Fix L2CR write accesses
Commit 2345f1c01
was supposed to render L2CR writes into noops. Instead,
it made them illegal instruction traps which apparently didn't confuse
XNU, but can easily confuse other OSs.
Fix it up by actually doing nothing when we write to L2CR.
Reported-by: Julio Guerra <guerr@julio.in>
Signed-off-by: Alexander Graf <agraf@suse.de>
Tested-by: Julio Guerra <guerr@julio.in>
This commit is contained in:
parent
bbfb6f132a
commit
9633fcc6a0
@ -108,6 +108,11 @@ static void spr_write_clear (void *opaque, int sprn, int gprn)
|
|||||||
tcg_temp_free(t0);
|
tcg_temp_free(t0);
|
||||||
tcg_temp_free(t1);
|
tcg_temp_free(t1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void spr_access_nop(void *opaque, int sprn, int gprn)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* SPR common to all PowerPC */
|
/* SPR common to all PowerPC */
|
||||||
@ -1382,7 +1387,7 @@ static void gen_spr_74xx (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Not strictly an SPR */
|
/* Not strictly an SPR */
|
||||||
vscr_init(env, 0x00010000);
|
vscr_init(env, 0x00010000);
|
||||||
@ -5170,7 +5175,7 @@ static void init_proc_750 (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Time base */
|
/* Time base */
|
||||||
gen_tbl(env);
|
gen_tbl(env);
|
||||||
@ -5233,7 +5238,7 @@ static void init_proc_750cl (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Time base */
|
/* Time base */
|
||||||
gen_tbl(env);
|
gen_tbl(env);
|
||||||
@ -5419,7 +5424,7 @@ static void init_proc_750cx (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Time base */
|
/* Time base */
|
||||||
gen_tbl(env);
|
gen_tbl(env);
|
||||||
@ -5486,7 +5491,7 @@ static void init_proc_750fx (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Time base */
|
/* Time base */
|
||||||
gen_tbl(env);
|
gen_tbl(env);
|
||||||
@ -5558,7 +5563,7 @@ static void init_proc_750gx (CPUPPCState *env)
|
|||||||
/* XXX : not implemented (XXX: different from 750fx) */
|
/* XXX : not implemented (XXX: different from 750fx) */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Time base */
|
/* Time base */
|
||||||
gen_tbl(env);
|
gen_tbl(env);
|
||||||
@ -5694,7 +5699,7 @@ static void init_proc_755 (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2PMCR, "L2PMCR",
|
spr_register(env, SPR_L2PMCR, "L2PMCR",
|
||||||
@ -6650,7 +6655,7 @@ static void init_proc_970 (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Memory management */
|
/* Memory management */
|
||||||
/* XXX: not correct */
|
/* XXX: not correct */
|
||||||
@ -6750,7 +6755,7 @@ static void init_proc_970FX (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Memory management */
|
/* Memory management */
|
||||||
/* XXX: not correct */
|
/* XXX: not correct */
|
||||||
@ -6862,7 +6867,7 @@ static void init_proc_970GX (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Memory management */
|
/* Memory management */
|
||||||
/* XXX: not correct */
|
/* XXX: not correct */
|
||||||
@ -6962,7 +6967,7 @@ static void init_proc_970MP (CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Memory management */
|
/* Memory management */
|
||||||
/* XXX: not correct */
|
/* XXX: not correct */
|
||||||
@ -7054,7 +7059,7 @@ static void init_proc_power5plus(CPUPPCState *env)
|
|||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_L2CR, "L2CR",
|
spr_register(env, SPR_L2CR, "L2CR",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, NULL,
|
&spr_read_generic, spr_access_nop,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
/* Memory management */
|
/* Memory management */
|
||||||
/* XXX: not correct */
|
/* XXX: not correct */
|
||||||
|
Loading…
Reference in New Issue
Block a user