Make PowerPC cache line size implementation dependant.
Implement dcbz tunable cache line size for PowerPC 970. Make hardware reset vector implementation dependant. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3321 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
064034211a
commit
d63001d114
@ -82,12 +82,6 @@ typedef uint32_t ppc_gpr_t;
|
|||||||
#define ELF_MACHINE EM_PPC
|
#define ELF_MACHINE EM_PPC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* XXX: this should be tunable: PowerPC 601 & 64 bits PowerPC
|
|
||||||
* have different cache line sizes
|
|
||||||
*/
|
|
||||||
#define ICACHE_LINE_SIZE 32
|
|
||||||
#define DCACHE_LINE_SIZE 32
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/* MMU model */
|
/* MMU model */
|
||||||
enum {
|
enum {
|
||||||
@ -521,6 +515,9 @@ struct CPUPPCState {
|
|||||||
/* 403 dedicated access protection registers */
|
/* 403 dedicated access protection registers */
|
||||||
target_ulong pb[4];
|
target_ulong pb[4];
|
||||||
|
|
||||||
|
int dcache_line_size;
|
||||||
|
int icache_line_size;
|
||||||
|
|
||||||
/* Those resources are used during exception processing */
|
/* Those resources are used during exception processing */
|
||||||
/* CPU model definition */
|
/* CPU model definition */
|
||||||
target_ulong msr_mask;
|
target_ulong msr_mask;
|
||||||
@ -546,6 +543,7 @@ struct CPUPPCState {
|
|||||||
target_ulong excp_prefix;
|
target_ulong excp_prefix;
|
||||||
target_ulong ivor_mask;
|
target_ulong ivor_mask;
|
||||||
target_ulong ivpr_mask;
|
target_ulong ivpr_mask;
|
||||||
|
target_ulong hreset_vector;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Those resources are used only during code translation */
|
/* Those resources are used only during code translation */
|
||||||
@ -1052,6 +1050,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val);
|
|||||||
#define SPR_601_HID5 (0x3F5)
|
#define SPR_601_HID5 (0x3F5)
|
||||||
#define SPR_40x_DAC1 (0x3F6)
|
#define SPR_40x_DAC1 (0x3F6)
|
||||||
#define SPR_MSSCR0 (0x3F6)
|
#define SPR_MSSCR0 (0x3F6)
|
||||||
|
#define SPR_970_HID5 (0x3F6)
|
||||||
#define SPR_MSSSR0 (0x3F7)
|
#define SPR_MSSSR0 (0x3F7)
|
||||||
#define SPR_DABRX (0x3F7)
|
#define SPR_DABRX (0x3F7)
|
||||||
#define SPR_40x_DAC2 (0x3F7)
|
#define SPR_40x_DAC2 (0x3F7)
|
||||||
|
@ -1061,21 +1061,21 @@ void do_POWER_clcs (void)
|
|||||||
switch (T0) {
|
switch (T0) {
|
||||||
case 0x0CUL:
|
case 0x0CUL:
|
||||||
/* Instruction cache line size */
|
/* Instruction cache line size */
|
||||||
T0 = ICACHE_LINE_SIZE;
|
T0 = env->icache_line_size;
|
||||||
break;
|
break;
|
||||||
case 0x0DUL:
|
case 0x0DUL:
|
||||||
/* Data cache line size */
|
/* Data cache line size */
|
||||||
T0 = DCACHE_LINE_SIZE;
|
T0 = env->dcache_line_size;
|
||||||
break;
|
break;
|
||||||
case 0x0EUL:
|
case 0x0EUL:
|
||||||
/* Minimum cache line size */
|
/* Minimum cache line size */
|
||||||
T0 = ICACHE_LINE_SIZE < DCACHE_LINE_SIZE ?
|
T0 = env->icache_line_size < env->dcache_line_size ?
|
||||||
ICACHE_LINE_SIZE : DCACHE_LINE_SIZE;
|
env->icache_line_size : env->dcache_line_size;
|
||||||
break;
|
break;
|
||||||
case 0x0FUL:
|
case 0x0FUL:
|
||||||
/* Maximum cache line size */
|
/* Maximum cache line size */
|
||||||
T0 = ICACHE_LINE_SIZE > DCACHE_LINE_SIZE ?
|
T0 = env->icache_line_size > env->dcache_line_size ?
|
||||||
ICACHE_LINE_SIZE : DCACHE_LINE_SIZE;
|
env->icache_line_size : env->dcache_line_size;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
/* Undefined */
|
/* Undefined */
|
||||||
|
@ -30,6 +30,7 @@ void glue(do_lmw_le, MEMSUFFIX) (int dst);
|
|||||||
void glue(do_stmw, MEMSUFFIX) (int src);
|
void glue(do_stmw, MEMSUFFIX) (int src);
|
||||||
void glue(do_stmw_le, MEMSUFFIX) (int src);
|
void glue(do_stmw_le, MEMSUFFIX) (int src);
|
||||||
void glue(do_icbi, MEMSUFFIX) (void);
|
void glue(do_icbi, MEMSUFFIX) (void);
|
||||||
|
void glue(do_dcbz, MEMSUFFIX) (void);
|
||||||
void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb);
|
void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb);
|
||||||
void glue(do_POWER2_lfq, MEMSUFFIX) (void);
|
void glue(do_POWER2_lfq, MEMSUFFIX) (void);
|
||||||
void glue(do_POWER2_lfq_le, MEMSUFFIX) (void);
|
void glue(do_POWER2_lfq_le, MEMSUFFIX) (void);
|
||||||
@ -46,6 +47,7 @@ void glue(do_lmw_le_64, MEMSUFFIX) (int dst);
|
|||||||
void glue(do_stmw_64, MEMSUFFIX) (int src);
|
void glue(do_stmw_64, MEMSUFFIX) (int src);
|
||||||
void glue(do_stmw_le_64, MEMSUFFIX) (int src);
|
void glue(do_stmw_le_64, MEMSUFFIX) (int src);
|
||||||
void glue(do_icbi_64, MEMSUFFIX) (void);
|
void glue(do_icbi_64, MEMSUFFIX) (void);
|
||||||
|
void glue(do_dcbz_64, MEMSUFFIX) (void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -252,8 +252,9 @@ void glue(do_icbi, MEMSUFFIX) (void)
|
|||||||
* do the load "by hand".
|
* do the load "by hand".
|
||||||
*/
|
*/
|
||||||
tmp = glue(ldl, MEMSUFFIX)((uint32_t)T0);
|
tmp = glue(ldl, MEMSUFFIX)((uint32_t)T0);
|
||||||
T0 &= ~(ICACHE_LINE_SIZE - 1);
|
T0 &= ~(env->icache_line_size - 1);
|
||||||
tb_invalidate_page_range((uint32_t)T0, (uint32_t)(T0 + ICACHE_LINE_SIZE));
|
tb_invalidate_page_range((uint32_t)T0,
|
||||||
|
(uint32_t)(T0 + env->icache_line_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TARGET_PPC64)
|
#if defined(TARGET_PPC64)
|
||||||
@ -266,8 +267,101 @@ void glue(do_icbi_64, MEMSUFFIX) (void)
|
|||||||
* do the load "by hand".
|
* do the load "by hand".
|
||||||
*/
|
*/
|
||||||
tmp = glue(ldq, MEMSUFFIX)((uint64_t)T0);
|
tmp = glue(ldq, MEMSUFFIX)((uint64_t)T0);
|
||||||
T0 &= ~(ICACHE_LINE_SIZE - 1);
|
T0 &= ~(env->icache_line_size - 1);
|
||||||
tb_invalidate_page_range((uint64_t)T0, (uint64_t)(T0 + ICACHE_LINE_SIZE));
|
tb_invalidate_page_range((uint64_t)T0,
|
||||||
|
(uint64_t)(T0 + env->icache_line_size));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void glue(do_dcbz, MEMSUFFIX) (void)
|
||||||
|
{
|
||||||
|
int dcache_line_size = env->dcache_line_size;
|
||||||
|
|
||||||
|
/* XXX: should be 970 specific (?) */
|
||||||
|
if (((env->spr[SPR_970_HID5] >> 7) & 0x3) == 1)
|
||||||
|
dcache_line_size = 32;
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0);
|
||||||
|
if (dcache_line_size >= 64) {
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0);
|
||||||
|
if (dcache_line_size >= 128) {
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x40UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x44UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x48UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x4CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x50UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x54UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x58UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x5CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x60UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x64UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x68UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x6CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x70UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x74UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x78UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x7CUL), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(TARGET_PPC64)
|
||||||
|
void glue(do_dcbz_64, MEMSUFFIX) (void)
|
||||||
|
{
|
||||||
|
int dcache_line_size = env->dcache_line_size;
|
||||||
|
|
||||||
|
/* XXX: should be 970 specific (?) */
|
||||||
|
if (((env->spr[SPR_970_HID5] >> 7) & 0x3) == 1)
|
||||||
|
dcache_line_size = 32;
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0);
|
||||||
|
if (dcache_line_size >= 64) {
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0);
|
||||||
|
if (dcache_line_size >= 128) {
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x40UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x44UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x48UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x4CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x50UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x54UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x58UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x5CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x60UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x64UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x68UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x6CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x70UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x74UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x78UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x7CUL), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -787,7 +787,20 @@ void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void OPPROTO glue(op_dcbz, MEMSUFFIX) (void)
|
void OPPROTO glue(op_dcbz_l32, MEMSUFFIX) (void)
|
||||||
|
{
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0);
|
||||||
|
RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OPPROTO glue(op_dcbz_l64, MEMSUFFIX) (void)
|
||||||
{
|
{
|
||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0);
|
||||||
@ -797,8 +810,6 @@ void OPPROTO glue(op_dcbz, MEMSUFFIX) (void)
|
|||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0);
|
||||||
#if DCACHE_LINE_SIZE == 64
|
|
||||||
/* XXX: cache line size should be 64 for POWER & PowerPC 601 */
|
|
||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0);
|
||||||
@ -807,12 +818,67 @@ void OPPROTO glue(op_dcbz, MEMSUFFIX) (void)
|
|||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0);
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0);
|
||||||
#endif
|
RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OPPROTO glue(op_dcbz_l128, MEMSUFFIX) (void)
|
||||||
|
{
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x40UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x44UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x48UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x4CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x50UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x54UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x58UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x5CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x60UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x64UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x68UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x6CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x70UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x74UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x78UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x7CUL), 0);
|
||||||
|
RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OPPROTO glue(op_dcbz, MEMSUFFIX) (void)
|
||||||
|
{
|
||||||
|
glue(do_dcbz, MEMSUFFIX)();
|
||||||
RETURN();
|
RETURN();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(TARGET_PPC64)
|
#if defined(TARGET_PPC64)
|
||||||
void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void)
|
void OPPROTO glue(op_dcbz_l32_64, MEMSUFFIX) (void)
|
||||||
|
{
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0);
|
||||||
|
RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OPPROTO glue(op_dcbz_l64_64, MEMSUFFIX) (void)
|
||||||
{
|
{
|
||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0);
|
||||||
@ -822,8 +888,6 @@ void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void)
|
|||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0);
|
||||||
#if DCACHE_LINE_SIZE == 64
|
|
||||||
/* XXX: cache line size should be 64 for POWER & PowerPC 601 */
|
|
||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0);
|
||||||
@ -832,7 +896,49 @@ void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void)
|
|||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0);
|
||||||
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0);
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0);
|
||||||
#endif
|
RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OPPROTO glue(op_dcbz_l128_64, MEMSUFFIX) (void)
|
||||||
|
{
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x40UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x44UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x48UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x4CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x50UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x54UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x58UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x5CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x60UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x64UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x68UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x6CUL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x70UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x74UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x78UL), 0);
|
||||||
|
glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x7CUL), 0);
|
||||||
|
RETURN();
|
||||||
|
}
|
||||||
|
|
||||||
|
void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void)
|
||||||
|
{
|
||||||
|
glue(do_dcbz_64, MEMSUFFIX)();
|
||||||
RETURN();
|
RETURN();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -169,6 +169,7 @@ typedef struct DisasContext {
|
|||||||
#endif
|
#endif
|
||||||
ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */
|
ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */
|
||||||
int singlestep_enabled;
|
int singlestep_enabled;
|
||||||
|
int dcache_line_size;
|
||||||
} DisasContext;
|
} DisasContext;
|
||||||
|
|
||||||
struct opc_handler_t {
|
struct opc_handler_t {
|
||||||
@ -482,6 +483,10 @@ enum {
|
|||||||
PPC_WAIT = 0x0000100000000000ULL,
|
PPC_WAIT = 0x0000100000000000ULL,
|
||||||
/* New 64 bits extensions (PowerPC 2.0x) */
|
/* New 64 bits extensions (PowerPC 2.0x) */
|
||||||
PPC_64BX = 0x0000200000000000ULL,
|
PPC_64BX = 0x0000200000000000ULL,
|
||||||
|
/* dcbz instruction with fixed cache line size */
|
||||||
|
PPC_CACHE_DCBZ = 0x0000400000000000ULL,
|
||||||
|
/* dcbz instruction with tunable cache line size */
|
||||||
|
PPC_CACHE_DCBZT = 0x0000800000000000ULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -3623,51 +3628,178 @@ GEN_HANDLER(dcbtst, 0x1F, 0x16, 0x07, 0x02000001, PPC_CACHE)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* dcbz */
|
/* dcbz */
|
||||||
#define op_dcbz() (*gen_op_dcbz[ctx->mem_idx])()
|
#define op_dcbz(n) (*gen_op_dcbz[n][ctx->mem_idx])()
|
||||||
#if defined(CONFIG_USER_ONLY)
|
#if defined(CONFIG_USER_ONLY)
|
||||||
/* User-mode only */
|
/* User-mode only */
|
||||||
static GenOpFunc *gen_op_dcbz[] = {
|
static GenOpFunc *gen_op_dcbz[4][4] = {
|
||||||
&gen_op_dcbz_raw,
|
{
|
||||||
&gen_op_dcbz_raw,
|
&gen_op_dcbz_l32_raw,
|
||||||
|
&gen_op_dcbz_l32_raw,
|
||||||
#if defined(TARGET_PPC64)
|
#if defined(TARGET_PPC64)
|
||||||
&gen_op_dcbz_64_raw,
|
&gen_op_dcbz_l32_64_raw,
|
||||||
&gen_op_dcbz_64_raw,
|
&gen_op_dcbz_l32_64_raw,
|
||||||
#endif
|
#endif
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&gen_op_dcbz_l64_raw,
|
||||||
|
&gen_op_dcbz_l64_raw,
|
||||||
|
#if defined(TARGET_PPC64)
|
||||||
|
&gen_op_dcbz_l64_64_raw,
|
||||||
|
&gen_op_dcbz_l64_64_raw,
|
||||||
|
#endif
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&gen_op_dcbz_l128_raw,
|
||||||
|
&gen_op_dcbz_l128_raw,
|
||||||
|
#if defined(TARGET_PPC64)
|
||||||
|
&gen_op_dcbz_l128_64_raw,
|
||||||
|
&gen_op_dcbz_l128_64_raw,
|
||||||
|
#endif
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&gen_op_dcbz_raw,
|
||||||
|
&gen_op_dcbz_raw,
|
||||||
|
#if defined(TARGET_PPC64)
|
||||||
|
&gen_op_dcbz_64_raw,
|
||||||
|
&gen_op_dcbz_64_raw,
|
||||||
|
#endif
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
#if defined(TARGET_PPC64)
|
#if defined(TARGET_PPC64)
|
||||||
/* Full system - 64 bits mode */
|
/* Full system - 64 bits mode */
|
||||||
static GenOpFunc *gen_op_dcbz[] = {
|
static GenOpFunc *gen_op_dcbz[4][12] = {
|
||||||
&gen_op_dcbz_user,
|
{
|
||||||
&gen_op_dcbz_user,
|
&gen_op_dcbz_l32_user,
|
||||||
&gen_op_dcbz_64_user,
|
&gen_op_dcbz_l32_user,
|
||||||
&gen_op_dcbz_64_user,
|
&gen_op_dcbz_l32_64_user,
|
||||||
&gen_op_dcbz_kernel,
|
&gen_op_dcbz_l32_64_user,
|
||||||
&gen_op_dcbz_kernel,
|
&gen_op_dcbz_l32_kernel,
|
||||||
&gen_op_dcbz_64_kernel,
|
&gen_op_dcbz_l32_kernel,
|
||||||
&gen_op_dcbz_64_kernel,
|
&gen_op_dcbz_l32_64_kernel,
|
||||||
|
&gen_op_dcbz_l32_64_kernel,
|
||||||
#if defined(TARGET_PPC64H)
|
#if defined(TARGET_PPC64H)
|
||||||
&gen_op_dcbz_hypv,
|
&gen_op_dcbz_l32_hypv,
|
||||||
&gen_op_dcbz_hypv,
|
&gen_op_dcbz_l32_hypv,
|
||||||
&gen_op_dcbz_64_hypv,
|
&gen_op_dcbz_l32_64_hypv,
|
||||||
&gen_op_dcbz_64_hypv,
|
&gen_op_dcbz_l32_64_hypv,
|
||||||
#endif
|
#endif
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&gen_op_dcbz_l64_user,
|
||||||
|
&gen_op_dcbz_l64_user,
|
||||||
|
&gen_op_dcbz_l64_64_user,
|
||||||
|
&gen_op_dcbz_l64_64_user,
|
||||||
|
&gen_op_dcbz_l64_kernel,
|
||||||
|
&gen_op_dcbz_l64_kernel,
|
||||||
|
&gen_op_dcbz_l64_64_kernel,
|
||||||
|
&gen_op_dcbz_l64_64_kernel,
|
||||||
|
#if defined(TARGET_PPC64H)
|
||||||
|
&gen_op_dcbz_l64_hypv,
|
||||||
|
&gen_op_dcbz_l64_hypv,
|
||||||
|
&gen_op_dcbz_l64_64_hypv,
|
||||||
|
&gen_op_dcbz_l64_64_hypv,
|
||||||
|
#endif
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&gen_op_dcbz_l128_user,
|
||||||
|
&gen_op_dcbz_l128_user,
|
||||||
|
&gen_op_dcbz_l128_64_user,
|
||||||
|
&gen_op_dcbz_l128_64_user,
|
||||||
|
&gen_op_dcbz_l128_kernel,
|
||||||
|
&gen_op_dcbz_l128_kernel,
|
||||||
|
&gen_op_dcbz_l128_64_kernel,
|
||||||
|
&gen_op_dcbz_l128_64_kernel,
|
||||||
|
#if defined(TARGET_PPC64H)
|
||||||
|
&gen_op_dcbz_l128_hypv,
|
||||||
|
&gen_op_dcbz_l128_hypv,
|
||||||
|
&gen_op_dcbz_l128_64_hypv,
|
||||||
|
&gen_op_dcbz_l128_64_hypv,
|
||||||
|
#endif
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&gen_op_dcbz_user,
|
||||||
|
&gen_op_dcbz_user,
|
||||||
|
&gen_op_dcbz_64_user,
|
||||||
|
&gen_op_dcbz_64_user,
|
||||||
|
&gen_op_dcbz_kernel,
|
||||||
|
&gen_op_dcbz_kernel,
|
||||||
|
&gen_op_dcbz_64_kernel,
|
||||||
|
&gen_op_dcbz_64_kernel,
|
||||||
|
#if defined(TARGET_PPC64H)
|
||||||
|
&gen_op_dcbz_hypv,
|
||||||
|
&gen_op_dcbz_hypv,
|
||||||
|
&gen_op_dcbz_64_hypv,
|
||||||
|
&gen_op_dcbz_64_hypv,
|
||||||
|
#endif
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
/* Full system - 32 bits mode */
|
/* Full system - 32 bits mode */
|
||||||
static GenOpFunc *gen_op_dcbz[] = {
|
static GenOpFunc *gen_op_dcbz[4][4] = {
|
||||||
&gen_op_dcbz_user,
|
{
|
||||||
&gen_op_dcbz_user,
|
&gen_op_dcbz_l32_user,
|
||||||
&gen_op_dcbz_kernel,
|
&gen_op_dcbz_l32_user,
|
||||||
&gen_op_dcbz_kernel,
|
&gen_op_dcbz_l32_kernel,
|
||||||
|
&gen_op_dcbz_l32_kernel,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&gen_op_dcbz_l64_user,
|
||||||
|
&gen_op_dcbz_l64_user,
|
||||||
|
&gen_op_dcbz_l64_kernel,
|
||||||
|
&gen_op_dcbz_l64_kernel,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&gen_op_dcbz_l128_user,
|
||||||
|
&gen_op_dcbz_l128_user,
|
||||||
|
&gen_op_dcbz_l128_kernel,
|
||||||
|
&gen_op_dcbz_l128_kernel,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&gen_op_dcbz_user,
|
||||||
|
&gen_op_dcbz_user,
|
||||||
|
&gen_op_dcbz_kernel,
|
||||||
|
&gen_op_dcbz_kernel,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GEN_HANDLER(dcbz, 0x1F, 0x16, 0x1F, 0x03E00001, PPC_CACHE)
|
static inline void handler_dcbz (DisasContext *ctx, int dcache_line_size)
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
|
||||||
|
switch (dcache_line_size) {
|
||||||
|
case 32:
|
||||||
|
n = 0;
|
||||||
|
break;
|
||||||
|
case 64:
|
||||||
|
n = 1;
|
||||||
|
break;
|
||||||
|
case 128:
|
||||||
|
n = 2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
n = 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
op_dcbz(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
GEN_HANDLER(dcbz, 0x1F, 0x16, 0x1F, 0x03E00001, PPC_CACHE_DCBZ)
|
||||||
{
|
{
|
||||||
gen_addr_reg_index(ctx);
|
gen_addr_reg_index(ctx);
|
||||||
op_dcbz();
|
handler_dcbz(ctx, ctx->dcache_line_size);
|
||||||
|
gen_op_check_reservation();
|
||||||
|
}
|
||||||
|
|
||||||
|
GEN_HANDLER(dcbz_970, 0x1F, 0x16, 0x1F, 0x03C00001, PPC_CACHE_DCBZT)
|
||||||
|
{
|
||||||
|
gen_addr_reg_index(ctx);
|
||||||
|
if (ctx->opcode & 0x00200000)
|
||||||
|
handler_dcbz(ctx, ctx->dcache_line_size);
|
||||||
|
else
|
||||||
|
handler_dcbz(ctx, -1);
|
||||||
gen_op_check_reservation();
|
gen_op_check_reservation();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6341,6 +6473,7 @@ static inline int gen_intermediate_code_internal (CPUState *env,
|
|||||||
#else
|
#else
|
||||||
ctx.mem_idx = (supervisor << 1) | msr_le;
|
ctx.mem_idx = (supervisor << 1) | msr_le;
|
||||||
#endif
|
#endif
|
||||||
|
ctx.dcache_line_size = env->dcache_line_size;
|
||||||
ctx.fpu_enabled = msr_fp;
|
ctx.fpu_enabled = msr_fp;
|
||||||
#if defined(TARGET_PPCEMB)
|
#if defined(TARGET_PPCEMB)
|
||||||
ctx.spe_enabled = msr_spe;
|
ctx.spe_enabled = msr_spe;
|
||||||
|
@ -2542,7 +2542,7 @@ static void init_excp_970 (CPUPPCState *env)
|
|||||||
/* PowerPC implementations definitions */
|
/* PowerPC implementations definitions */
|
||||||
|
|
||||||
/* PowerPC 40x instruction set */
|
/* PowerPC 40x instruction set */
|
||||||
#define POWERPC_INSNS_EMB (PPC_INSNS_BASE | PPC_EMB_COMMON)
|
#define POWERPC_INSNS_EMB (PPC_INSNS_BASE | PPC_CACHE_DCBZ | PPC_EMB_COMMON)
|
||||||
|
|
||||||
/* PowerPC 401 */
|
/* PowerPC 401 */
|
||||||
#define POWERPC_INSNS_401 (POWERPC_INSNS_EMB | \
|
#define POWERPC_INSNS_401 (POWERPC_INSNS_EMB | \
|
||||||
@ -2560,8 +2560,14 @@ static void init_proc_401 (CPUPPCState *env)
|
|||||||
gen_spr_401_403(env);
|
gen_spr_401_403(env);
|
||||||
gen_spr_401(env);
|
gen_spr_401(env);
|
||||||
init_excp_4xx_real(env);
|
init_excp_4xx_real(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc40x_irq_init(env);
|
ppc40x_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 401x2 */
|
/* PowerPC 401x2 */
|
||||||
@ -2587,8 +2593,14 @@ static void init_proc_401x2 (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_4xx_softmmu(env);
|
init_excp_4xx_softmmu(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc40x_irq_init(env);
|
ppc40x_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 401x3 */
|
/* PowerPC 401x3 */
|
||||||
@ -2612,8 +2624,14 @@ static void init_proc_401x3 (CPUPPCState *env)
|
|||||||
gen_spr_401x2(env);
|
gen_spr_401x2(env);
|
||||||
gen_spr_compress(env);
|
gen_spr_compress(env);
|
||||||
init_excp_4xx_softmmu(env);
|
init_excp_4xx_softmmu(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc40x_irq_init(env);
|
ppc40x_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* IOP480 */
|
/* IOP480 */
|
||||||
@ -2639,8 +2657,14 @@ static void init_proc_IOP480 (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_4xx_softmmu(env);
|
init_excp_4xx_softmmu(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc40x_irq_init(env);
|
ppc40x_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 403 */
|
/* PowerPC 403 */
|
||||||
@ -2661,8 +2685,14 @@ static void init_proc_403 (CPUPPCState *env)
|
|||||||
gen_spr_403(env);
|
gen_spr_403(env);
|
||||||
gen_spr_403_real(env);
|
gen_spr_403_real(env);
|
||||||
init_excp_4xx_real(env);
|
init_excp_4xx_real(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc40x_irq_init(env);
|
ppc40x_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 403 GCX */
|
/* PowerPC 403 GCX */
|
||||||
@ -2699,8 +2729,14 @@ static void init_proc_403GCX (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_4xx_softmmu(env);
|
init_excp_4xx_softmmu(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc40x_irq_init(env);
|
ppc40x_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 405 */
|
/* PowerPC 405 */
|
||||||
@ -2737,8 +2773,14 @@ static void init_proc_405 (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_4xx_softmmu(env);
|
init_excp_4xx_softmmu(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc40x_irq_init(env);
|
ppc40x_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 440 EP */
|
/* PowerPC 440 EP */
|
||||||
@ -2781,7 +2823,13 @@ static void init_proc_440EP (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_BookE(env);
|
init_excp_BookE(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* XXX: TODO: allocate internal IRQ controller */
|
/* XXX: TODO: allocate internal IRQ controller */
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 440 GP */
|
/* PowerPC 440 GP */
|
||||||
@ -2806,7 +2854,13 @@ static void init_proc_440GP (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_BookE(env);
|
init_excp_BookE(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* XXX: TODO: allocate internal IRQ controller */
|
/* XXX: TODO: allocate internal IRQ controller */
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 440x4 */
|
/* PowerPC 440x4 */
|
||||||
@ -2832,7 +2886,13 @@ static void init_proc_440x4 (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_BookE(env);
|
init_excp_BookE(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* XXX: TODO: allocate internal IRQ controller */
|
/* XXX: TODO: allocate internal IRQ controller */
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 440x5 */
|
/* PowerPC 440x5 */
|
||||||
@ -2875,7 +2935,13 @@ static void init_proc_440x5 (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_BookE(env);
|
init_excp_BookE(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* XXX: TODO: allocate internal IRQ controller */
|
/* XXX: TODO: allocate internal IRQ controller */
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 460 (guessed) */
|
/* PowerPC 460 (guessed) */
|
||||||
@ -2924,7 +2990,13 @@ static void init_proc_460 (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_BookE(env);
|
init_excp_BookE(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* XXX: TODO: allocate internal IRQ controller */
|
/* XXX: TODO: allocate internal IRQ controller */
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 460F (guessed) */
|
/* PowerPC 460F (guessed) */
|
||||||
@ -2976,7 +3048,13 @@ static void init_proc_460F (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_BookE(env);
|
init_excp_BookE(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* XXX: TODO: allocate internal IRQ controller */
|
/* XXX: TODO: allocate internal IRQ controller */
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Generic BookE PowerPC */
|
/* Generic BookE PowerPC */
|
||||||
@ -2997,6 +3075,12 @@ __attribute__ (( unused ))
|
|||||||
static void init_proc_BookE (CPUPPCState *env)
|
static void init_proc_BookE (CPUPPCState *env)
|
||||||
{
|
{
|
||||||
init_excp_BookE(env);
|
init_excp_BookE(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* e200 core */
|
/* e200 core */
|
||||||
@ -3025,7 +3109,13 @@ static void init_proc_e500 (CPUPPCState *env)
|
|||||||
env->nb_ways = 1;
|
env->nb_ways = 1;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_BookE(env);
|
init_excp_BookE(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* XXX: TODO: allocate internal IRQ controller */
|
/* XXX: TODO: allocate internal IRQ controller */
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* e600 core */
|
/* e600 core */
|
||||||
@ -3038,7 +3128,7 @@ static void init_proc_e500 (CPUPPCState *env)
|
|||||||
#define POWERPC_INSNS_WORKS (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT | \
|
#define POWERPC_INSNS_WORKS (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT | \
|
||||||
PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \
|
PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \
|
||||||
PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \
|
PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \
|
||||||
PPC_MEM_TLBSYNC | PPC_MFTB)
|
PPC_MEM_TLBSYNC | PPC_CACHE_DCBZ | PPC_MFTB)
|
||||||
|
|
||||||
/* POWER : same as 601, without mfmsr, mfsr */
|
/* POWER : same as 601, without mfmsr, mfsr */
|
||||||
#if defined(TODO)
|
#if defined(TODO)
|
||||||
@ -3048,7 +3138,8 @@ static void init_proc_e500 (CPUPPCState *env)
|
|||||||
#endif /* TODO */
|
#endif /* TODO */
|
||||||
|
|
||||||
/* PowerPC 601 */
|
/* PowerPC 601 */
|
||||||
#define POWERPC_INSNS_601 (POWERPC_INSNS_6xx | PPC_EXTERN | PPC_POWER_BR)
|
#define POWERPC_INSNS_601 (POWERPC_INSNS_6xx | PPC_CACHE_DCBZ | \
|
||||||
|
PPC_EXTERN | PPC_POWER_BR)
|
||||||
#define POWERPC_MSRM_601 (0x000000000000FE70ULL)
|
#define POWERPC_MSRM_601 (0x000000000000FE70ULL)
|
||||||
//#define POWERPC_MMU_601 (POWERPC_MMU_601)
|
//#define POWERPC_MMU_601 (POWERPC_MMU_601)
|
||||||
//#define POWERPC_EXCP_601 (POWERPC_EXCP_601)
|
//#define POWERPC_EXCP_601 (POWERPC_EXCP_601)
|
||||||
@ -3091,14 +3182,21 @@ static void init_proc_601 (CPUPPCState *env)
|
|||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
env->id_tlbs = 0;
|
env->id_tlbs = 0;
|
||||||
init_excp_601(env);
|
init_excp_601(env);
|
||||||
|
env->dcache_line_size = 64;
|
||||||
|
env->icache_line_size = 64;
|
||||||
/* XXX: TODO: allocate internal IRQ controller */
|
/* XXX: TODO: allocate internal IRQ controller */
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 602 */
|
/* PowerPC 602 */
|
||||||
#define POWERPC_INSNS_602 (POWERPC_INSNS_6xx | PPC_MFTB | \
|
#define POWERPC_INSNS_602 (POWERPC_INSNS_6xx | PPC_MFTB | \
|
||||||
PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \
|
PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \
|
||||||
PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \
|
PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \
|
||||||
PPC_6xx_TLB | PPC_MEM_TLBSYNC | PPC_602_SPEC)
|
PPC_6xx_TLB | PPC_MEM_TLBSYNC | PPC_CACHE_DCBZ |\
|
||||||
|
PPC_602_SPEC)
|
||||||
#define POWERPC_MSRM_602 (0x000000000033FF73ULL)
|
#define POWERPC_MSRM_602 (0x000000000033FF73ULL)
|
||||||
#define POWERPC_MMU_602 (POWERPC_MMU_SOFT_6xx)
|
#define POWERPC_MMU_602 (POWERPC_MMU_SOFT_6xx)
|
||||||
//#define POWERPC_EXCP_602 (POWERPC_EXCP_602)
|
//#define POWERPC_EXCP_602 (POWERPC_EXCP_602)
|
||||||
@ -3126,8 +3224,14 @@ static void init_proc_602 (CPUPPCState *env)
|
|||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
||||||
init_excp_602(env);
|
init_excp_602(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 603 */
|
/* PowerPC 603 */
|
||||||
@ -3159,8 +3263,14 @@ static void init_proc_603 (CPUPPCState *env)
|
|||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
||||||
init_excp_603(env);
|
init_excp_603(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 603e */
|
/* PowerPC 603e */
|
||||||
@ -3197,8 +3307,14 @@ static void init_proc_603E (CPUPPCState *env)
|
|||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
||||||
init_excp_603(env);
|
init_excp_603(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC G2 */
|
/* PowerPC G2 */
|
||||||
@ -3237,8 +3353,14 @@ static void init_proc_G2 (CPUPPCState *env)
|
|||||||
gen_high_BATs(env);
|
gen_high_BATs(env);
|
||||||
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
||||||
init_excp_G2(env);
|
init_excp_G2(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC G2LE */
|
/* PowerPC G2LE */
|
||||||
@ -3277,8 +3399,14 @@ static void init_proc_G2LE (CPUPPCState *env)
|
|||||||
gen_high_BATs(env);
|
gen_high_BATs(env);
|
||||||
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
||||||
init_excp_G2(env);
|
init_excp_G2(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 604 */
|
/* PowerPC 604 */
|
||||||
@ -3309,8 +3437,14 @@ static void init_proc_604 (CPUPPCState *env)
|
|||||||
/* Memory management */
|
/* Memory management */
|
||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
init_excp_604(env);
|
init_excp_604(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 740/750 (aka G3) */
|
/* PowerPC 740/750 (aka G3) */
|
||||||
@ -3343,8 +3477,14 @@ static void init_proc_7x0 (CPUPPCState *env)
|
|||||||
/* Memory management */
|
/* Memory management */
|
||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
init_excp_7x0(env);
|
init_excp_7x0(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 750FX/GX */
|
/* PowerPC 750FX/GX */
|
||||||
@ -3384,8 +3524,14 @@ static void init_proc_750fx (CPUPPCState *env)
|
|||||||
/* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
|
/* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */
|
||||||
gen_high_BATs(env);
|
gen_high_BATs(env);
|
||||||
init_excp_750FX(env);
|
init_excp_750FX(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 745/755 */
|
/* PowerPC 745/755 */
|
||||||
@ -3433,8 +3579,14 @@ static void init_proc_7x5 (CPUPPCState *env)
|
|||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
gen_high_BATs(env);
|
gen_high_BATs(env);
|
||||||
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
gen_6xx_7xx_soft_tlb(env, 64, 2);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 7400 (aka G4) */
|
/* PowerPC 7400 (aka G4) */
|
||||||
@ -3460,8 +3612,14 @@ static void init_proc_7400 (CPUPPCState *env)
|
|||||||
/* Memory management */
|
/* Memory management */
|
||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
init_excp_7400(env);
|
init_excp_7400(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 7410 (aka G4) */
|
/* PowerPC 7410 (aka G4) */
|
||||||
@ -3499,8 +3657,14 @@ static void init_proc_7410 (CPUPPCState *env)
|
|||||||
/* Memory management */
|
/* Memory management */
|
||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
init_excp_7400(env);
|
init_excp_7400(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 7440 (aka G4) */
|
/* PowerPC 7440 (aka G4) */
|
||||||
@ -3564,8 +3728,14 @@ static void init_proc_7440 (CPUPPCState *env)
|
|||||||
/* Memory management */
|
/* Memory management */
|
||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
gen_74xx_soft_tlb(env, 128, 2);
|
gen_74xx_soft_tlb(env, 128, 2);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 7450 (aka G4) */
|
/* PowerPC 7450 (aka G4) */
|
||||||
@ -3632,8 +3802,14 @@ static void init_proc_7450 (CPUPPCState *env)
|
|||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
gen_74xx_soft_tlb(env, 128, 2);
|
gen_74xx_soft_tlb(env, 128, 2);
|
||||||
init_excp_7450(env);
|
init_excp_7450(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 7445 (aka G4) */
|
/* PowerPC 7445 (aka G4) */
|
||||||
@ -3732,8 +3908,14 @@ static void init_proc_7445 (CPUPPCState *env)
|
|||||||
gen_high_BATs(env);
|
gen_high_BATs(env);
|
||||||
gen_74xx_soft_tlb(env, 128, 2);
|
gen_74xx_soft_tlb(env, 128, 2);
|
||||||
init_excp_7450(env);
|
init_excp_7450(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 7455 (aka G4) */
|
/* PowerPC 7455 (aka G4) */
|
||||||
@ -3834,13 +4016,23 @@ static void init_proc_7455 (CPUPPCState *env)
|
|||||||
gen_high_BATs(env);
|
gen_high_BATs(env);
|
||||||
gen_74xx_soft_tlb(env, 128, 2);
|
gen_74xx_soft_tlb(env, 128, 2);
|
||||||
init_excp_7450(env);
|
init_excp_7450(env);
|
||||||
|
env->dcache_line_size = 32;
|
||||||
|
env->icache_line_size = 32;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc6xx_irq_init(env);
|
ppc6xx_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0xFFFFFFFCUL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined (TARGET_PPC64)
|
#if defined (TARGET_PPC64)
|
||||||
|
#define POWERPC_INSNS_WORK64 (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT | \
|
||||||
|
PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \
|
||||||
|
PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \
|
||||||
|
PPC_MEM_TLBSYNC | PPC_CACHE_DCBZT | PPC_MFTB)
|
||||||
/* PowerPC 970 */
|
/* PowerPC 970 */
|
||||||
#define POWERPC_INSNS_970 (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \
|
#define POWERPC_INSNS_970 (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT | \
|
||||||
PPC_64B | PPC_ALTIVEC | \
|
PPC_64B | PPC_ALTIVEC | \
|
||||||
PPC_64_BRIDGE | PPC_SLBI)
|
PPC_64_BRIDGE | PPC_SLBI)
|
||||||
#define POWERPC_MSRM_970 (0x900000000204FF36ULL)
|
#define POWERPC_MSRM_970 (0x900000000204FF36ULL)
|
||||||
@ -3860,7 +4052,7 @@ static void init_proc_970 (CPUPPCState *env)
|
|||||||
spr_register(env, SPR_HID0, "HID0",
|
spr_register(env, SPR_HID0, "HID0",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, &spr_write_clear,
|
&spr_read_generic, &spr_write_clear,
|
||||||
0x00000000);
|
0x60000000);
|
||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_HID1, "HID1",
|
spr_register(env, SPR_HID1, "HID1",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
@ -3878,12 +4070,18 @@ static void init_proc_970 (CPUPPCState *env)
|
|||||||
env->slb_nr = 32;
|
env->slb_nr = 32;
|
||||||
#endif
|
#endif
|
||||||
init_excp_970(env);
|
init_excp_970(env);
|
||||||
|
env->dcache_line_size = 128;
|
||||||
|
env->icache_line_size = 128;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc970_irq_init(env);
|
ppc970_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0x0000000000000100ULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 970FX (aka G5) */
|
/* PowerPC 970FX (aka G5) */
|
||||||
#define POWERPC_INSNS_970FX (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \
|
#define POWERPC_INSNS_970FX (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT | \
|
||||||
PPC_64B | PPC_ALTIVEC | \
|
PPC_64B | PPC_ALTIVEC | \
|
||||||
PPC_64_BRIDGE | PPC_SLBI)
|
PPC_64_BRIDGE | PPC_SLBI)
|
||||||
#define POWERPC_MSRM_970FX (0x800000000204FF36ULL)
|
#define POWERPC_MSRM_970FX (0x800000000204FF36ULL)
|
||||||
@ -3903,7 +4101,7 @@ static void init_proc_970FX (CPUPPCState *env)
|
|||||||
spr_register(env, SPR_HID0, "HID0",
|
spr_register(env, SPR_HID0, "HID0",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, &spr_write_clear,
|
&spr_read_generic, &spr_write_clear,
|
||||||
0x00000000);
|
0x60000000);
|
||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_HID1, "HID1",
|
spr_register(env, SPR_HID1, "HID1",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
@ -3914,6 +4112,11 @@ static void init_proc_970FX (CPUPPCState *env)
|
|||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, &spr_write_generic,
|
&spr_read_generic, &spr_write_generic,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
|
/* XXX : not implemented */
|
||||||
|
spr_register(env, SPR_970_HID5, "HID5",
|
||||||
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
|
&spr_read_generic, &spr_write_generic,
|
||||||
|
0x00000000);
|
||||||
/* Memory management */
|
/* Memory management */
|
||||||
/* XXX: not correct */
|
/* XXX: not correct */
|
||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
@ -3921,12 +4124,18 @@ static void init_proc_970FX (CPUPPCState *env)
|
|||||||
env->slb_nr = 32;
|
env->slb_nr = 32;
|
||||||
#endif
|
#endif
|
||||||
init_excp_970(env);
|
init_excp_970(env);
|
||||||
|
env->dcache_line_size = 128;
|
||||||
|
env->icache_line_size = 128;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc970_irq_init(env);
|
ppc970_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0x0000000000000100ULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 970 GX */
|
/* PowerPC 970 GX */
|
||||||
#define POWERPC_INSNS_970GX (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \
|
#define POWERPC_INSNS_970GX (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT | \
|
||||||
PPC_64B | PPC_ALTIVEC | \
|
PPC_64B | PPC_ALTIVEC | \
|
||||||
PPC_64_BRIDGE | PPC_SLBI)
|
PPC_64_BRIDGE | PPC_SLBI)
|
||||||
#define POWERPC_MSRM_970GX (0x800000000204FF36ULL)
|
#define POWERPC_MSRM_970GX (0x800000000204FF36ULL)
|
||||||
@ -3946,7 +4155,7 @@ static void init_proc_970GX (CPUPPCState *env)
|
|||||||
spr_register(env, SPR_HID0, "HID0",
|
spr_register(env, SPR_HID0, "HID0",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, &spr_write_clear,
|
&spr_read_generic, &spr_write_clear,
|
||||||
0x00000000);
|
0x60000000);
|
||||||
/* XXX : not implemented */
|
/* XXX : not implemented */
|
||||||
spr_register(env, SPR_HID1, "HID1",
|
spr_register(env, SPR_HID1, "HID1",
|
||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
@ -3957,6 +4166,11 @@ static void init_proc_970GX (CPUPPCState *env)
|
|||||||
SPR_NOACCESS, SPR_NOACCESS,
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
&spr_read_generic, &spr_write_generic,
|
&spr_read_generic, &spr_write_generic,
|
||||||
0x00000000);
|
0x00000000);
|
||||||
|
/* XXX : not implemented */
|
||||||
|
spr_register(env, SPR_970_HID5, "HID5",
|
||||||
|
SPR_NOACCESS, SPR_NOACCESS,
|
||||||
|
&spr_read_generic, &spr_write_generic,
|
||||||
|
0x00000000);
|
||||||
/* Memory management */
|
/* Memory management */
|
||||||
/* XXX: not correct */
|
/* XXX: not correct */
|
||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
@ -3964,8 +4178,14 @@ static void init_proc_970GX (CPUPPCState *env)
|
|||||||
env->slb_nr = 32;
|
env->slb_nr = 32;
|
||||||
#endif
|
#endif
|
||||||
init_excp_970(env);
|
init_excp_970(env);
|
||||||
|
env->dcache_line_size = 128;
|
||||||
|
env->icache_line_size = 128;
|
||||||
/* Allocate hardware IRQ controller */
|
/* Allocate hardware IRQ controller */
|
||||||
ppc970_irq_init(env);
|
ppc970_irq_init(env);
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0x0000000000000100ULL;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PowerPC 620 */
|
/* PowerPC 620 */
|
||||||
@ -3994,7 +4214,13 @@ static void init_proc_620 (CPUPPCState *env)
|
|||||||
gen_low_BATs(env);
|
gen_low_BATs(env);
|
||||||
gen_high_BATs(env);
|
gen_high_BATs(env);
|
||||||
init_excp_620(env);
|
init_excp_620(env);
|
||||||
|
env->dcache_line_size = 64;
|
||||||
|
env->icache_line_size = 64;
|
||||||
/* XXX: TODO: initialize internal interrupt controller */
|
/* XXX: TODO: initialize internal interrupt controller */
|
||||||
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* Hardware reset vector */
|
||||||
|
env->hreset_vector = 0x0000000000000100ULL; /* ? */
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* defined (TARGET_PPC64) */
|
#endif /* defined (TARGET_PPC64) */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user