Commit d63001d11434fc6bf217255b51f625a75d05fb35
1 parent
06403421
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
Showing
7 changed files
with
620 additions
and
60 deletions
target-ppc/cpu.h
@@ -82,12 +82,6 @@ typedef uint32_t ppc_gpr_t; | @@ -82,12 +82,6 @@ typedef uint32_t ppc_gpr_t; | ||
82 | #define ELF_MACHINE EM_PPC | 82 | #define ELF_MACHINE EM_PPC |
83 | #endif | 83 | #endif |
84 | 84 | ||
85 | -/* XXX: this should be tunable: PowerPC 601 & 64 bits PowerPC | ||
86 | - * have different cache line sizes | ||
87 | - */ | ||
88 | -#define ICACHE_LINE_SIZE 32 | ||
89 | -#define DCACHE_LINE_SIZE 32 | ||
90 | - | ||
91 | /*****************************************************************************/ | 85 | /*****************************************************************************/ |
92 | /* MMU model */ | 86 | /* MMU model */ |
93 | enum { | 87 | enum { |
@@ -521,6 +515,9 @@ struct CPUPPCState { | @@ -521,6 +515,9 @@ struct CPUPPCState { | ||
521 | /* 403 dedicated access protection registers */ | 515 | /* 403 dedicated access protection registers */ |
522 | target_ulong pb[4]; | 516 | target_ulong pb[4]; |
523 | 517 | ||
518 | + int dcache_line_size; | ||
519 | + int icache_line_size; | ||
520 | + | ||
524 | /* Those resources are used during exception processing */ | 521 | /* Those resources are used during exception processing */ |
525 | /* CPU model definition */ | 522 | /* CPU model definition */ |
526 | target_ulong msr_mask; | 523 | target_ulong msr_mask; |
@@ -546,6 +543,7 @@ struct CPUPPCState { | @@ -546,6 +543,7 @@ struct CPUPPCState { | ||
546 | target_ulong excp_prefix; | 543 | target_ulong excp_prefix; |
547 | target_ulong ivor_mask; | 544 | target_ulong ivor_mask; |
548 | target_ulong ivpr_mask; | 545 | target_ulong ivpr_mask; |
546 | + target_ulong hreset_vector; | ||
549 | #endif | 547 | #endif |
550 | 548 | ||
551 | /* Those resources are used only during code translation */ | 549 | /* 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); | @@ -1052,6 +1050,7 @@ int ppc_dcr_write (ppc_dcr_t *dcr_env, int dcrn, target_ulong val); | ||
1052 | #define SPR_601_HID5 (0x3F5) | 1050 | #define SPR_601_HID5 (0x3F5) |
1053 | #define SPR_40x_DAC1 (0x3F6) | 1051 | #define SPR_40x_DAC1 (0x3F6) |
1054 | #define SPR_MSSCR0 (0x3F6) | 1052 | #define SPR_MSSCR0 (0x3F6) |
1053 | +#define SPR_970_HID5 (0x3F6) | ||
1055 | #define SPR_MSSSR0 (0x3F7) | 1054 | #define SPR_MSSSR0 (0x3F7) |
1056 | #define SPR_DABRX (0x3F7) | 1055 | #define SPR_DABRX (0x3F7) |
1057 | #define SPR_40x_DAC2 (0x3F7) | 1056 | #define SPR_40x_DAC2 (0x3F7) |
target-ppc/op_helper.c
@@ -1061,21 +1061,21 @@ void do_POWER_clcs (void) | @@ -1061,21 +1061,21 @@ void do_POWER_clcs (void) | ||
1061 | switch (T0) { | 1061 | switch (T0) { |
1062 | case 0x0CUL: | 1062 | case 0x0CUL: |
1063 | /* Instruction cache line size */ | 1063 | /* Instruction cache line size */ |
1064 | - T0 = ICACHE_LINE_SIZE; | 1064 | + T0 = env->icache_line_size; |
1065 | break; | 1065 | break; |
1066 | case 0x0DUL: | 1066 | case 0x0DUL: |
1067 | /* Data cache line size */ | 1067 | /* Data cache line size */ |
1068 | - T0 = DCACHE_LINE_SIZE; | 1068 | + T0 = env->dcache_line_size; |
1069 | break; | 1069 | break; |
1070 | case 0x0EUL: | 1070 | case 0x0EUL: |
1071 | /* Minimum cache line size */ | 1071 | /* Minimum cache line size */ |
1072 | - T0 = ICACHE_LINE_SIZE < DCACHE_LINE_SIZE ? | ||
1073 | - ICACHE_LINE_SIZE : DCACHE_LINE_SIZE; | 1072 | + T0 = env->icache_line_size < env->dcache_line_size ? |
1073 | + env->icache_line_size : env->dcache_line_size; | ||
1074 | break; | 1074 | break; |
1075 | case 0x0FUL: | 1075 | case 0x0FUL: |
1076 | /* Maximum cache line size */ | 1076 | /* Maximum cache line size */ |
1077 | - T0 = ICACHE_LINE_SIZE > DCACHE_LINE_SIZE ? | ||
1078 | - ICACHE_LINE_SIZE : DCACHE_LINE_SIZE; | 1077 | + T0 = env->icache_line_size > env->dcache_line_size ? |
1078 | + env->icache_line_size : env->dcache_line_size; | ||
1079 | break; | 1079 | break; |
1080 | default: | 1080 | default: |
1081 | /* Undefined */ | 1081 | /* Undefined */ |
target-ppc/op_helper.h
@@ -30,6 +30,7 @@ void glue(do_lmw_le, MEMSUFFIX) (int dst); | @@ -30,6 +30,7 @@ void glue(do_lmw_le, MEMSUFFIX) (int dst); | ||
30 | void glue(do_stmw, MEMSUFFIX) (int src); | 30 | void glue(do_stmw, MEMSUFFIX) (int src); |
31 | void glue(do_stmw_le, MEMSUFFIX) (int src); | 31 | void glue(do_stmw_le, MEMSUFFIX) (int src); |
32 | void glue(do_icbi, MEMSUFFIX) (void); | 32 | void glue(do_icbi, MEMSUFFIX) (void); |
33 | +void glue(do_dcbz, MEMSUFFIX) (void); | ||
33 | void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb); | 34 | void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb); |
34 | void glue(do_POWER2_lfq, MEMSUFFIX) (void); | 35 | void glue(do_POWER2_lfq, MEMSUFFIX) (void); |
35 | void glue(do_POWER2_lfq_le, MEMSUFFIX) (void); | 36 | void glue(do_POWER2_lfq_le, MEMSUFFIX) (void); |
@@ -46,6 +47,7 @@ void glue(do_lmw_le_64, MEMSUFFIX) (int dst); | @@ -46,6 +47,7 @@ void glue(do_lmw_le_64, MEMSUFFIX) (int dst); | ||
46 | void glue(do_stmw_64, MEMSUFFIX) (int src); | 47 | void glue(do_stmw_64, MEMSUFFIX) (int src); |
47 | void glue(do_stmw_le_64, MEMSUFFIX) (int src); | 48 | void glue(do_stmw_le_64, MEMSUFFIX) (int src); |
48 | void glue(do_icbi_64, MEMSUFFIX) (void); | 49 | void glue(do_icbi_64, MEMSUFFIX) (void); |
50 | +void glue(do_dcbz_64, MEMSUFFIX) (void); | ||
49 | #endif | 51 | #endif |
50 | 52 | ||
51 | #else | 53 | #else |
target-ppc/op_helper_mem.h
@@ -252,8 +252,9 @@ void glue(do_icbi, MEMSUFFIX) (void) | @@ -252,8 +252,9 @@ void glue(do_icbi, MEMSUFFIX) (void) | ||
252 | * do the load "by hand". | 252 | * do the load "by hand". |
253 | */ | 253 | */ |
254 | tmp = glue(ldl, MEMSUFFIX)((uint32_t)T0); | 254 | tmp = glue(ldl, MEMSUFFIX)((uint32_t)T0); |
255 | - T0 &= ~(ICACHE_LINE_SIZE - 1); | ||
256 | - tb_invalidate_page_range((uint32_t)T0, (uint32_t)(T0 + ICACHE_LINE_SIZE)); | 255 | + T0 &= ~(env->icache_line_size - 1); |
256 | + tb_invalidate_page_range((uint32_t)T0, | ||
257 | + (uint32_t)(T0 + env->icache_line_size)); | ||
257 | } | 258 | } |
258 | 259 | ||
259 | #if defined(TARGET_PPC64) | 260 | #if defined(TARGET_PPC64) |
@@ -266,8 +267,101 @@ void glue(do_icbi_64, MEMSUFFIX) (void) | @@ -266,8 +267,101 @@ void glue(do_icbi_64, MEMSUFFIX) (void) | ||
266 | * do the load "by hand". | 267 | * do the load "by hand". |
267 | */ | 268 | */ |
268 | tmp = glue(ldq, MEMSUFFIX)((uint64_t)T0); | 269 | tmp = glue(ldq, MEMSUFFIX)((uint64_t)T0); |
269 | - T0 &= ~(ICACHE_LINE_SIZE - 1); | ||
270 | - tb_invalidate_page_range((uint64_t)T0, (uint64_t)(T0 + ICACHE_LINE_SIZE)); | 270 | + T0 &= ~(env->icache_line_size - 1); |
271 | + tb_invalidate_page_range((uint64_t)T0, | ||
272 | + (uint64_t)(T0 + env->icache_line_size)); | ||
273 | +} | ||
274 | +#endif | ||
275 | + | ||
276 | +void glue(do_dcbz, MEMSUFFIX) (void) | ||
277 | +{ | ||
278 | + int dcache_line_size = env->dcache_line_size; | ||
279 | + | ||
280 | + /* XXX: should be 970 specific (?) */ | ||
281 | + if (((env->spr[SPR_970_HID5] >> 7) & 0x3) == 1) | ||
282 | + dcache_line_size = 32; | ||
283 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); | ||
284 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); | ||
285 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); | ||
286 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); | ||
287 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); | ||
288 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); | ||
289 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); | ||
290 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); | ||
291 | + if (dcache_line_size >= 64) { | ||
292 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); | ||
293 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); | ||
294 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); | ||
295 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0); | ||
296 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0); | ||
297 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); | ||
298 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); | ||
299 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0); | ||
300 | + if (dcache_line_size >= 128) { | ||
301 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x40UL), 0); | ||
302 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x44UL), 0); | ||
303 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x48UL), 0); | ||
304 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x4CUL), 0); | ||
305 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x50UL), 0); | ||
306 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x54UL), 0); | ||
307 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x58UL), 0); | ||
308 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x5CUL), 0); | ||
309 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x60UL), 0); | ||
310 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x64UL), 0); | ||
311 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x68UL), 0); | ||
312 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x6CUL), 0); | ||
313 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x70UL), 0); | ||
314 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x74UL), 0); | ||
315 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x78UL), 0); | ||
316 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x7CUL), 0); | ||
317 | + } | ||
318 | + } | ||
319 | +} | ||
320 | + | ||
321 | +#if defined(TARGET_PPC64) | ||
322 | +void glue(do_dcbz_64, MEMSUFFIX) (void) | ||
323 | +{ | ||
324 | + int dcache_line_size = env->dcache_line_size; | ||
325 | + | ||
326 | + /* XXX: should be 970 specific (?) */ | ||
327 | + if (((env->spr[SPR_970_HID5] >> 7) & 0x3) == 1) | ||
328 | + dcache_line_size = 32; | ||
329 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); | ||
330 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); | ||
331 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); | ||
332 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); | ||
333 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); | ||
334 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); | ||
335 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); | ||
336 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); | ||
337 | + if (dcache_line_size >= 64) { | ||
338 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); | ||
339 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); | ||
340 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); | ||
341 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0); | ||
342 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0); | ||
343 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); | ||
344 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); | ||
345 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0); | ||
346 | + if (dcache_line_size >= 128) { | ||
347 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x40UL), 0); | ||
348 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x44UL), 0); | ||
349 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x48UL), 0); | ||
350 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x4CUL), 0); | ||
351 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x50UL), 0); | ||
352 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x54UL), 0); | ||
353 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x58UL), 0); | ||
354 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x5CUL), 0); | ||
355 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x60UL), 0); | ||
356 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x64UL), 0); | ||
357 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x68UL), 0); | ||
358 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x6CUL), 0); | ||
359 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x70UL), 0); | ||
360 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x74UL), 0); | ||
361 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x78UL), 0); | ||
362 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x7CUL), 0); | ||
363 | + } | ||
364 | + } | ||
271 | } | 365 | } |
272 | #endif | 366 | #endif |
273 | 367 |
target-ppc/op_mem.h
@@ -787,7 +787,20 @@ void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void) | @@ -787,7 +787,20 @@ void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void) | ||
787 | } | 787 | } |
788 | #endif | 788 | #endif |
789 | 789 | ||
790 | -void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) | 790 | +void OPPROTO glue(op_dcbz_l32, MEMSUFFIX) (void) |
791 | +{ | ||
792 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); | ||
793 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); | ||
794 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); | ||
795 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); | ||
796 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); | ||
797 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); | ||
798 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); | ||
799 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); | ||
800 | + RETURN(); | ||
801 | +} | ||
802 | + | ||
803 | +void OPPROTO glue(op_dcbz_l64, MEMSUFFIX) (void) | ||
791 | { | 804 | { |
792 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); | 805 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); |
793 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); | 806 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); |
@@ -797,8 +810,6 @@ void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) | @@ -797,8 +810,6 @@ void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) | ||
797 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); | 810 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); |
798 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); | 811 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); |
799 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); | 812 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); |
800 | -#if DCACHE_LINE_SIZE == 64 | ||
801 | - /* XXX: cache line size should be 64 for POWER & PowerPC 601 */ | ||
802 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); | 813 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); |
803 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); | 814 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); |
804 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); | 815 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); |
@@ -807,12 +818,67 @@ void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) | @@ -807,12 +818,67 @@ void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) | ||
807 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); | 818 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); |
808 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); | 819 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); |
809 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0); | 820 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0); |
810 | -#endif | 821 | + RETURN(); |
822 | +} | ||
823 | + | ||
824 | +void OPPROTO glue(op_dcbz_l128, MEMSUFFIX) (void) | ||
825 | +{ | ||
826 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); | ||
827 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); | ||
828 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x08), 0); | ||
829 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x0C), 0); | ||
830 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x10), 0); | ||
831 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); | ||
832 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); | ||
833 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x1C), 0); | ||
834 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); | ||
835 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); | ||
836 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); | ||
837 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x2CUL), 0); | ||
838 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x30UL), 0); | ||
839 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); | ||
840 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); | ||
841 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x3CUL), 0); | ||
842 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x40UL), 0); | ||
843 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x44UL), 0); | ||
844 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x48UL), 0); | ||
845 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x4CUL), 0); | ||
846 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x50UL), 0); | ||
847 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x54UL), 0); | ||
848 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x58UL), 0); | ||
849 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x5CUL), 0); | ||
850 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x60UL), 0); | ||
851 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x64UL), 0); | ||
852 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x68UL), 0); | ||
853 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x6CUL), 0); | ||
854 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x70UL), 0); | ||
855 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x74UL), 0); | ||
856 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x78UL), 0); | ||
857 | + glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x7CUL), 0); | ||
858 | + RETURN(); | ||
859 | +} | ||
860 | + | ||
861 | +void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) | ||
862 | +{ | ||
863 | + glue(do_dcbz, MEMSUFFIX)(); | ||
811 | RETURN(); | 864 | RETURN(); |
812 | } | 865 | } |
813 | 866 | ||
814 | #if defined(TARGET_PPC64) | 867 | #if defined(TARGET_PPC64) |
815 | -void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) | 868 | +void OPPROTO glue(op_dcbz_l32_64, MEMSUFFIX) (void) |
869 | +{ | ||
870 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); | ||
871 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); | ||
872 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); | ||
873 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); | ||
874 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); | ||
875 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); | ||
876 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); | ||
877 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); | ||
878 | + RETURN(); | ||
879 | +} | ||
880 | + | ||
881 | +void OPPROTO glue(op_dcbz_l64_64, MEMSUFFIX) (void) | ||
816 | { | 882 | { |
817 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); | 883 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); |
818 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); | 884 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); |
@@ -822,8 +888,6 @@ void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) | @@ -822,8 +888,6 @@ void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) | ||
822 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); | 888 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); |
823 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); | 889 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); |
824 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); | 890 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); |
825 | -#if DCACHE_LINE_SIZE == 64 | ||
826 | - /* XXX: cache line size should be 64 for POWER & PowerPC 601 */ | ||
827 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); | 891 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); |
828 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); | 892 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); |
829 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); | 893 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); |
@@ -832,7 +896,49 @@ void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) | @@ -832,7 +896,49 @@ void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) | ||
832 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); | 896 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); |
833 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); | 897 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); |
834 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0); | 898 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0); |
835 | -#endif | 899 | + RETURN(); |
900 | +} | ||
901 | + | ||
902 | +void OPPROTO glue(op_dcbz_l128_64, MEMSUFFIX) (void) | ||
903 | +{ | ||
904 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); | ||
905 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); | ||
906 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x08), 0); | ||
907 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x0C), 0); | ||
908 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x10), 0); | ||
909 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); | ||
910 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); | ||
911 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x1C), 0); | ||
912 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); | ||
913 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); | ||
914 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); | ||
915 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x2CUL), 0); | ||
916 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x30UL), 0); | ||
917 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); | ||
918 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); | ||
919 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x3CUL), 0); | ||
920 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x40UL), 0); | ||
921 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x44UL), 0); | ||
922 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x48UL), 0); | ||
923 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x4CUL), 0); | ||
924 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x50UL), 0); | ||
925 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x54UL), 0); | ||
926 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x58UL), 0); | ||
927 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x5CUL), 0); | ||
928 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x60UL), 0); | ||
929 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x64UL), 0); | ||
930 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x68UL), 0); | ||
931 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x6CUL), 0); | ||
932 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x70UL), 0); | ||
933 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x74UL), 0); | ||
934 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x78UL), 0); | ||
935 | + glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x7CUL), 0); | ||
936 | + RETURN(); | ||
937 | +} | ||
938 | + | ||
939 | +void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) | ||
940 | +{ | ||
941 | + glue(do_dcbz_64, MEMSUFFIX)(); | ||
836 | RETURN(); | 942 | RETURN(); |
837 | } | 943 | } |
838 | #endif | 944 | #endif |
target-ppc/translate.c
@@ -169,6 +169,7 @@ typedef struct DisasContext { | @@ -169,6 +169,7 @@ typedef struct DisasContext { | ||
169 | #endif | 169 | #endif |
170 | ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */ | 170 | ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */ |
171 | int singlestep_enabled; | 171 | int singlestep_enabled; |
172 | + int dcache_line_size; | ||
172 | } DisasContext; | 173 | } DisasContext; |
173 | 174 | ||
174 | struct opc_handler_t { | 175 | struct opc_handler_t { |
@@ -482,6 +483,10 @@ enum { | @@ -482,6 +483,10 @@ enum { | ||
482 | PPC_WAIT = 0x0000100000000000ULL, | 483 | PPC_WAIT = 0x0000100000000000ULL, |
483 | /* New 64 bits extensions (PowerPC 2.0x) */ | 484 | /* New 64 bits extensions (PowerPC 2.0x) */ |
484 | PPC_64BX = 0x0000200000000000ULL, | 485 | PPC_64BX = 0x0000200000000000ULL, |
486 | + /* dcbz instruction with fixed cache line size */ | ||
487 | + PPC_CACHE_DCBZ = 0x0000400000000000ULL, | ||
488 | + /* dcbz instruction with tunable cache line size */ | ||
489 | + PPC_CACHE_DCBZT = 0x0000800000000000ULL, | ||
485 | }; | 490 | }; |
486 | 491 | ||
487 | /*****************************************************************************/ | 492 | /*****************************************************************************/ |
@@ -3623,51 +3628,178 @@ GEN_HANDLER(dcbtst, 0x1F, 0x16, 0x07, 0x02000001, PPC_CACHE) | @@ -3623,51 +3628,178 @@ GEN_HANDLER(dcbtst, 0x1F, 0x16, 0x07, 0x02000001, PPC_CACHE) | ||
3623 | } | 3628 | } |
3624 | 3629 | ||
3625 | /* dcbz */ | 3630 | /* dcbz */ |
3626 | -#define op_dcbz() (*gen_op_dcbz[ctx->mem_idx])() | 3631 | +#define op_dcbz(n) (*gen_op_dcbz[n][ctx->mem_idx])() |
3627 | #if defined(CONFIG_USER_ONLY) | 3632 | #if defined(CONFIG_USER_ONLY) |
3628 | /* User-mode only */ | 3633 | /* User-mode only */ |
3629 | -static GenOpFunc *gen_op_dcbz[] = { | ||
3630 | - &gen_op_dcbz_raw, | ||
3631 | - &gen_op_dcbz_raw, | 3634 | +static GenOpFunc *gen_op_dcbz[4][4] = { |
3635 | + { | ||
3636 | + &gen_op_dcbz_l32_raw, | ||
3637 | + &gen_op_dcbz_l32_raw, | ||
3632 | #if defined(TARGET_PPC64) | 3638 | #if defined(TARGET_PPC64) |
3633 | - &gen_op_dcbz_64_raw, | ||
3634 | - &gen_op_dcbz_64_raw, | 3639 | + &gen_op_dcbz_l32_64_raw, |
3640 | + &gen_op_dcbz_l32_64_raw, | ||
3635 | #endif | 3641 | #endif |
3642 | + }, | ||
3643 | + { | ||
3644 | + &gen_op_dcbz_l64_raw, | ||
3645 | + &gen_op_dcbz_l64_raw, | ||
3646 | +#if defined(TARGET_PPC64) | ||
3647 | + &gen_op_dcbz_l64_64_raw, | ||
3648 | + &gen_op_dcbz_l64_64_raw, | ||
3649 | +#endif | ||
3650 | + }, | ||
3651 | + { | ||
3652 | + &gen_op_dcbz_l128_raw, | ||
3653 | + &gen_op_dcbz_l128_raw, | ||
3654 | +#if defined(TARGET_PPC64) | ||
3655 | + &gen_op_dcbz_l128_64_raw, | ||
3656 | + &gen_op_dcbz_l128_64_raw, | ||
3657 | +#endif | ||
3658 | + }, | ||
3659 | + { | ||
3660 | + &gen_op_dcbz_raw, | ||
3661 | + &gen_op_dcbz_raw, | ||
3662 | +#if defined(TARGET_PPC64) | ||
3663 | + &gen_op_dcbz_64_raw, | ||
3664 | + &gen_op_dcbz_64_raw, | ||
3665 | +#endif | ||
3666 | + }, | ||
3636 | }; | 3667 | }; |
3637 | #else | 3668 | #else |
3638 | #if defined(TARGET_PPC64) | 3669 | #if defined(TARGET_PPC64) |
3639 | /* Full system - 64 bits mode */ | 3670 | /* Full system - 64 bits mode */ |
3640 | -static GenOpFunc *gen_op_dcbz[] = { | ||
3641 | - &gen_op_dcbz_user, | ||
3642 | - &gen_op_dcbz_user, | ||
3643 | - &gen_op_dcbz_64_user, | ||
3644 | - &gen_op_dcbz_64_user, | ||
3645 | - &gen_op_dcbz_kernel, | ||
3646 | - &gen_op_dcbz_kernel, | ||
3647 | - &gen_op_dcbz_64_kernel, | ||
3648 | - &gen_op_dcbz_64_kernel, | 3671 | +static GenOpFunc *gen_op_dcbz[4][12] = { |
3672 | + { | ||
3673 | + &gen_op_dcbz_l32_user, | ||
3674 | + &gen_op_dcbz_l32_user, | ||
3675 | + &gen_op_dcbz_l32_64_user, | ||
3676 | + &gen_op_dcbz_l32_64_user, | ||
3677 | + &gen_op_dcbz_l32_kernel, | ||
3678 | + &gen_op_dcbz_l32_kernel, | ||
3679 | + &gen_op_dcbz_l32_64_kernel, | ||
3680 | + &gen_op_dcbz_l32_64_kernel, | ||
3681 | +#if defined(TARGET_PPC64H) | ||
3682 | + &gen_op_dcbz_l32_hypv, | ||
3683 | + &gen_op_dcbz_l32_hypv, | ||
3684 | + &gen_op_dcbz_l32_64_hypv, | ||
3685 | + &gen_op_dcbz_l32_64_hypv, | ||
3686 | +#endif | ||
3687 | + }, | ||
3688 | + { | ||
3689 | + &gen_op_dcbz_l64_user, | ||
3690 | + &gen_op_dcbz_l64_user, | ||
3691 | + &gen_op_dcbz_l64_64_user, | ||
3692 | + &gen_op_dcbz_l64_64_user, | ||
3693 | + &gen_op_dcbz_l64_kernel, | ||
3694 | + &gen_op_dcbz_l64_kernel, | ||
3695 | + &gen_op_dcbz_l64_64_kernel, | ||
3696 | + &gen_op_dcbz_l64_64_kernel, | ||
3649 | #if defined(TARGET_PPC64H) | 3697 | #if defined(TARGET_PPC64H) |
3650 | - &gen_op_dcbz_hypv, | ||
3651 | - &gen_op_dcbz_hypv, | ||
3652 | - &gen_op_dcbz_64_hypv, | ||
3653 | - &gen_op_dcbz_64_hypv, | 3698 | + &gen_op_dcbz_l64_hypv, |
3699 | + &gen_op_dcbz_l64_hypv, | ||
3700 | + &gen_op_dcbz_l64_64_hypv, | ||
3701 | + &gen_op_dcbz_l64_64_hypv, | ||
3702 | +#endif | ||
3703 | + }, | ||
3704 | + { | ||
3705 | + &gen_op_dcbz_l128_user, | ||
3706 | + &gen_op_dcbz_l128_user, | ||
3707 | + &gen_op_dcbz_l128_64_user, | ||
3708 | + &gen_op_dcbz_l128_64_user, | ||
3709 | + &gen_op_dcbz_l128_kernel, | ||
3710 | + &gen_op_dcbz_l128_kernel, | ||
3711 | + &gen_op_dcbz_l128_64_kernel, | ||
3712 | + &gen_op_dcbz_l128_64_kernel, | ||
3713 | +#if defined(TARGET_PPC64H) | ||
3714 | + &gen_op_dcbz_l128_hypv, | ||
3715 | + &gen_op_dcbz_l128_hypv, | ||
3716 | + &gen_op_dcbz_l128_64_hypv, | ||
3717 | + &gen_op_dcbz_l128_64_hypv, | ||
3718 | +#endif | ||
3719 | + }, | ||
3720 | + { | ||
3721 | + &gen_op_dcbz_user, | ||
3722 | + &gen_op_dcbz_user, | ||
3723 | + &gen_op_dcbz_64_user, | ||
3724 | + &gen_op_dcbz_64_user, | ||
3725 | + &gen_op_dcbz_kernel, | ||
3726 | + &gen_op_dcbz_kernel, | ||
3727 | + &gen_op_dcbz_64_kernel, | ||
3728 | + &gen_op_dcbz_64_kernel, | ||
3729 | +#if defined(TARGET_PPC64H) | ||
3730 | + &gen_op_dcbz_hypv, | ||
3731 | + &gen_op_dcbz_hypv, | ||
3732 | + &gen_op_dcbz_64_hypv, | ||
3733 | + &gen_op_dcbz_64_hypv, | ||
3654 | #endif | 3734 | #endif |
3735 | + }, | ||
3655 | }; | 3736 | }; |
3656 | #else | 3737 | #else |
3657 | /* Full system - 32 bits mode */ | 3738 | /* Full system - 32 bits mode */ |
3658 | -static GenOpFunc *gen_op_dcbz[] = { | ||
3659 | - &gen_op_dcbz_user, | ||
3660 | - &gen_op_dcbz_user, | ||
3661 | - &gen_op_dcbz_kernel, | ||
3662 | - &gen_op_dcbz_kernel, | 3739 | +static GenOpFunc *gen_op_dcbz[4][4] = { |
3740 | + { | ||
3741 | + &gen_op_dcbz_l32_user, | ||
3742 | + &gen_op_dcbz_l32_user, | ||
3743 | + &gen_op_dcbz_l32_kernel, | ||
3744 | + &gen_op_dcbz_l32_kernel, | ||
3745 | + }, | ||
3746 | + { | ||
3747 | + &gen_op_dcbz_l64_user, | ||
3748 | + &gen_op_dcbz_l64_user, | ||
3749 | + &gen_op_dcbz_l64_kernel, | ||
3750 | + &gen_op_dcbz_l64_kernel, | ||
3751 | + }, | ||
3752 | + { | ||
3753 | + &gen_op_dcbz_l128_user, | ||
3754 | + &gen_op_dcbz_l128_user, | ||
3755 | + &gen_op_dcbz_l128_kernel, | ||
3756 | + &gen_op_dcbz_l128_kernel, | ||
3757 | + }, | ||
3758 | + { | ||
3759 | + &gen_op_dcbz_user, | ||
3760 | + &gen_op_dcbz_user, | ||
3761 | + &gen_op_dcbz_kernel, | ||
3762 | + &gen_op_dcbz_kernel, | ||
3763 | + }, | ||
3663 | }; | 3764 | }; |
3664 | #endif | 3765 | #endif |
3665 | #endif | 3766 | #endif |
3666 | 3767 | ||
3667 | -GEN_HANDLER(dcbz, 0x1F, 0x16, 0x1F, 0x03E00001, PPC_CACHE) | 3768 | +static inline void handler_dcbz (DisasContext *ctx, int dcache_line_size) |
3769 | +{ | ||
3770 | + int n; | ||
3771 | + | ||
3772 | + switch (dcache_line_size) { | ||
3773 | + case 32: | ||
3774 | + n = 0; | ||
3775 | + break; | ||
3776 | + case 64: | ||
3777 | + n = 1; | ||
3778 | + break; | ||
3779 | + case 128: | ||
3780 | + n = 2; | ||
3781 | + break; | ||
3782 | + default: | ||
3783 | + n = 3; | ||
3784 | + break; | ||
3785 | + } | ||
3786 | + op_dcbz(n); | ||
3787 | +} | ||
3788 | + | ||
3789 | +GEN_HANDLER(dcbz, 0x1F, 0x16, 0x1F, 0x03E00001, PPC_CACHE_DCBZ) | ||
3668 | { | 3790 | { |
3669 | gen_addr_reg_index(ctx); | 3791 | gen_addr_reg_index(ctx); |
3670 | - op_dcbz(); | 3792 | + handler_dcbz(ctx, ctx->dcache_line_size); |
3793 | + gen_op_check_reservation(); | ||
3794 | +} | ||
3795 | + | ||
3796 | +GEN_HANDLER(dcbz_970, 0x1F, 0x16, 0x1F, 0x03C00001, PPC_CACHE_DCBZT) | ||
3797 | +{ | ||
3798 | + gen_addr_reg_index(ctx); | ||
3799 | + if (ctx->opcode & 0x00200000) | ||
3800 | + handler_dcbz(ctx, ctx->dcache_line_size); | ||
3801 | + else | ||
3802 | + handler_dcbz(ctx, -1); | ||
3671 | gen_op_check_reservation(); | 3803 | gen_op_check_reservation(); |
3672 | } | 3804 | } |
3673 | 3805 | ||
@@ -6341,6 +6473,7 @@ static inline int gen_intermediate_code_internal (CPUState *env, | @@ -6341,6 +6473,7 @@ static inline int gen_intermediate_code_internal (CPUState *env, | ||
6341 | #else | 6473 | #else |
6342 | ctx.mem_idx = (supervisor << 1) | msr_le; | 6474 | ctx.mem_idx = (supervisor << 1) | msr_le; |
6343 | #endif | 6475 | #endif |
6476 | + ctx.dcache_line_size = env->dcache_line_size; | ||
6344 | ctx.fpu_enabled = msr_fp; | 6477 | ctx.fpu_enabled = msr_fp; |
6345 | #if defined(TARGET_PPCEMB) | 6478 | #if defined(TARGET_PPCEMB) |
6346 | ctx.spe_enabled = msr_spe; | 6479 | ctx.spe_enabled = msr_spe; |
target-ppc/translate_init.c
@@ -2542,7 +2542,7 @@ static void init_excp_970 (CPUPPCState *env) | @@ -2542,7 +2542,7 @@ static void init_excp_970 (CPUPPCState *env) | ||
2542 | /* PowerPC implementations definitions */ | 2542 | /* PowerPC implementations definitions */ |
2543 | 2543 | ||
2544 | /* PowerPC 40x instruction set */ | 2544 | /* PowerPC 40x instruction set */ |
2545 | -#define POWERPC_INSNS_EMB (PPC_INSNS_BASE | PPC_EMB_COMMON) | 2545 | +#define POWERPC_INSNS_EMB (PPC_INSNS_BASE | PPC_CACHE_DCBZ | PPC_EMB_COMMON) |
2546 | 2546 | ||
2547 | /* PowerPC 401 */ | 2547 | /* PowerPC 401 */ |
2548 | #define POWERPC_INSNS_401 (POWERPC_INSNS_EMB | \ | 2548 | #define POWERPC_INSNS_401 (POWERPC_INSNS_EMB | \ |
@@ -2560,8 +2560,14 @@ static void init_proc_401 (CPUPPCState *env) | @@ -2560,8 +2560,14 @@ static void init_proc_401 (CPUPPCState *env) | ||
2560 | gen_spr_401_403(env); | 2560 | gen_spr_401_403(env); |
2561 | gen_spr_401(env); | 2561 | gen_spr_401(env); |
2562 | init_excp_4xx_real(env); | 2562 | init_excp_4xx_real(env); |
2563 | + env->dcache_line_size = 32; | ||
2564 | + env->icache_line_size = 32; | ||
2563 | /* Allocate hardware IRQ controller */ | 2565 | /* Allocate hardware IRQ controller */ |
2564 | ppc40x_irq_init(env); | 2566 | ppc40x_irq_init(env); |
2567 | +#if !defined(CONFIG_USER_ONLY) | ||
2568 | + /* Hardware reset vector */ | ||
2569 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2570 | +#endif | ||
2565 | } | 2571 | } |
2566 | 2572 | ||
2567 | /* PowerPC 401x2 */ | 2573 | /* PowerPC 401x2 */ |
@@ -2587,8 +2593,14 @@ static void init_proc_401x2 (CPUPPCState *env) | @@ -2587,8 +2593,14 @@ static void init_proc_401x2 (CPUPPCState *env) | ||
2587 | env->nb_ways = 1; | 2593 | env->nb_ways = 1; |
2588 | env->id_tlbs = 0; | 2594 | env->id_tlbs = 0; |
2589 | init_excp_4xx_softmmu(env); | 2595 | init_excp_4xx_softmmu(env); |
2596 | + env->dcache_line_size = 32; | ||
2597 | + env->icache_line_size = 32; | ||
2590 | /* Allocate hardware IRQ controller */ | 2598 | /* Allocate hardware IRQ controller */ |
2591 | ppc40x_irq_init(env); | 2599 | ppc40x_irq_init(env); |
2600 | +#if !defined(CONFIG_USER_ONLY) | ||
2601 | + /* Hardware reset vector */ | ||
2602 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2603 | +#endif | ||
2592 | } | 2604 | } |
2593 | 2605 | ||
2594 | /* PowerPC 401x3 */ | 2606 | /* PowerPC 401x3 */ |
@@ -2612,8 +2624,14 @@ static void init_proc_401x3 (CPUPPCState *env) | @@ -2612,8 +2624,14 @@ static void init_proc_401x3 (CPUPPCState *env) | ||
2612 | gen_spr_401x2(env); | 2624 | gen_spr_401x2(env); |
2613 | gen_spr_compress(env); | 2625 | gen_spr_compress(env); |
2614 | init_excp_4xx_softmmu(env); | 2626 | init_excp_4xx_softmmu(env); |
2627 | + env->dcache_line_size = 32; | ||
2628 | + env->icache_line_size = 32; | ||
2615 | /* Allocate hardware IRQ controller */ | 2629 | /* Allocate hardware IRQ controller */ |
2616 | ppc40x_irq_init(env); | 2630 | ppc40x_irq_init(env); |
2631 | +#if !defined(CONFIG_USER_ONLY) | ||
2632 | + /* Hardware reset vector */ | ||
2633 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2634 | +#endif | ||
2617 | } | 2635 | } |
2618 | 2636 | ||
2619 | /* IOP480 */ | 2637 | /* IOP480 */ |
@@ -2639,8 +2657,14 @@ static void init_proc_IOP480 (CPUPPCState *env) | @@ -2639,8 +2657,14 @@ static void init_proc_IOP480 (CPUPPCState *env) | ||
2639 | env->nb_ways = 1; | 2657 | env->nb_ways = 1; |
2640 | env->id_tlbs = 0; | 2658 | env->id_tlbs = 0; |
2641 | init_excp_4xx_softmmu(env); | 2659 | init_excp_4xx_softmmu(env); |
2660 | + env->dcache_line_size = 32; | ||
2661 | + env->icache_line_size = 32; | ||
2642 | /* Allocate hardware IRQ controller */ | 2662 | /* Allocate hardware IRQ controller */ |
2643 | ppc40x_irq_init(env); | 2663 | ppc40x_irq_init(env); |
2664 | +#if !defined(CONFIG_USER_ONLY) | ||
2665 | + /* Hardware reset vector */ | ||
2666 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2667 | +#endif | ||
2644 | } | 2668 | } |
2645 | 2669 | ||
2646 | /* PowerPC 403 */ | 2670 | /* PowerPC 403 */ |
@@ -2661,8 +2685,14 @@ static void init_proc_403 (CPUPPCState *env) | @@ -2661,8 +2685,14 @@ static void init_proc_403 (CPUPPCState *env) | ||
2661 | gen_spr_403(env); | 2685 | gen_spr_403(env); |
2662 | gen_spr_403_real(env); | 2686 | gen_spr_403_real(env); |
2663 | init_excp_4xx_real(env); | 2687 | init_excp_4xx_real(env); |
2688 | + env->dcache_line_size = 32; | ||
2689 | + env->icache_line_size = 32; | ||
2664 | /* Allocate hardware IRQ controller */ | 2690 | /* Allocate hardware IRQ controller */ |
2665 | ppc40x_irq_init(env); | 2691 | ppc40x_irq_init(env); |
2692 | +#if !defined(CONFIG_USER_ONLY) | ||
2693 | + /* Hardware reset vector */ | ||
2694 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2695 | +#endif | ||
2666 | } | 2696 | } |
2667 | 2697 | ||
2668 | /* PowerPC 403 GCX */ | 2698 | /* PowerPC 403 GCX */ |
@@ -2699,8 +2729,14 @@ static void init_proc_403GCX (CPUPPCState *env) | @@ -2699,8 +2729,14 @@ static void init_proc_403GCX (CPUPPCState *env) | ||
2699 | env->nb_ways = 1; | 2729 | env->nb_ways = 1; |
2700 | env->id_tlbs = 0; | 2730 | env->id_tlbs = 0; |
2701 | init_excp_4xx_softmmu(env); | 2731 | init_excp_4xx_softmmu(env); |
2732 | + env->dcache_line_size = 32; | ||
2733 | + env->icache_line_size = 32; | ||
2702 | /* Allocate hardware IRQ controller */ | 2734 | /* Allocate hardware IRQ controller */ |
2703 | ppc40x_irq_init(env); | 2735 | ppc40x_irq_init(env); |
2736 | +#if !defined(CONFIG_USER_ONLY) | ||
2737 | + /* Hardware reset vector */ | ||
2738 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2739 | +#endif | ||
2704 | } | 2740 | } |
2705 | 2741 | ||
2706 | /* PowerPC 405 */ | 2742 | /* PowerPC 405 */ |
@@ -2737,8 +2773,14 @@ static void init_proc_405 (CPUPPCState *env) | @@ -2737,8 +2773,14 @@ static void init_proc_405 (CPUPPCState *env) | ||
2737 | env->nb_ways = 1; | 2773 | env->nb_ways = 1; |
2738 | env->id_tlbs = 0; | 2774 | env->id_tlbs = 0; |
2739 | init_excp_4xx_softmmu(env); | 2775 | init_excp_4xx_softmmu(env); |
2776 | + env->dcache_line_size = 32; | ||
2777 | + env->icache_line_size = 32; | ||
2740 | /* Allocate hardware IRQ controller */ | 2778 | /* Allocate hardware IRQ controller */ |
2741 | ppc40x_irq_init(env); | 2779 | ppc40x_irq_init(env); |
2780 | +#if !defined(CONFIG_USER_ONLY) | ||
2781 | + /* Hardware reset vector */ | ||
2782 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2783 | +#endif | ||
2742 | } | 2784 | } |
2743 | 2785 | ||
2744 | /* PowerPC 440 EP */ | 2786 | /* PowerPC 440 EP */ |
@@ -2781,7 +2823,13 @@ static void init_proc_440EP (CPUPPCState *env) | @@ -2781,7 +2823,13 @@ static void init_proc_440EP (CPUPPCState *env) | ||
2781 | env->nb_ways = 1; | 2823 | env->nb_ways = 1; |
2782 | env->id_tlbs = 0; | 2824 | env->id_tlbs = 0; |
2783 | init_excp_BookE(env); | 2825 | init_excp_BookE(env); |
2826 | + env->dcache_line_size = 32; | ||
2827 | + env->icache_line_size = 32; | ||
2784 | /* XXX: TODO: allocate internal IRQ controller */ | 2828 | /* XXX: TODO: allocate internal IRQ controller */ |
2829 | +#if !defined(CONFIG_USER_ONLY) | ||
2830 | + /* Hardware reset vector */ | ||
2831 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2832 | +#endif | ||
2785 | } | 2833 | } |
2786 | 2834 | ||
2787 | /* PowerPC 440 GP */ | 2835 | /* PowerPC 440 GP */ |
@@ -2806,7 +2854,13 @@ static void init_proc_440GP (CPUPPCState *env) | @@ -2806,7 +2854,13 @@ static void init_proc_440GP (CPUPPCState *env) | ||
2806 | env->nb_ways = 1; | 2854 | env->nb_ways = 1; |
2807 | env->id_tlbs = 0; | 2855 | env->id_tlbs = 0; |
2808 | init_excp_BookE(env); | 2856 | init_excp_BookE(env); |
2857 | + env->dcache_line_size = 32; | ||
2858 | + env->icache_line_size = 32; | ||
2809 | /* XXX: TODO: allocate internal IRQ controller */ | 2859 | /* XXX: TODO: allocate internal IRQ controller */ |
2860 | +#if !defined(CONFIG_USER_ONLY) | ||
2861 | + /* Hardware reset vector */ | ||
2862 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2863 | +#endif | ||
2810 | } | 2864 | } |
2811 | 2865 | ||
2812 | /* PowerPC 440x4 */ | 2866 | /* PowerPC 440x4 */ |
@@ -2832,7 +2886,13 @@ static void init_proc_440x4 (CPUPPCState *env) | @@ -2832,7 +2886,13 @@ static void init_proc_440x4 (CPUPPCState *env) | ||
2832 | env->nb_ways = 1; | 2886 | env->nb_ways = 1; |
2833 | env->id_tlbs = 0; | 2887 | env->id_tlbs = 0; |
2834 | init_excp_BookE(env); | 2888 | init_excp_BookE(env); |
2889 | + env->dcache_line_size = 32; | ||
2890 | + env->icache_line_size = 32; | ||
2835 | /* XXX: TODO: allocate internal IRQ controller */ | 2891 | /* XXX: TODO: allocate internal IRQ controller */ |
2892 | +#if !defined(CONFIG_USER_ONLY) | ||
2893 | + /* Hardware reset vector */ | ||
2894 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2895 | +#endif | ||
2836 | } | 2896 | } |
2837 | 2897 | ||
2838 | /* PowerPC 440x5 */ | 2898 | /* PowerPC 440x5 */ |
@@ -2875,7 +2935,13 @@ static void init_proc_440x5 (CPUPPCState *env) | @@ -2875,7 +2935,13 @@ static void init_proc_440x5 (CPUPPCState *env) | ||
2875 | env->nb_ways = 1; | 2935 | env->nb_ways = 1; |
2876 | env->id_tlbs = 0; | 2936 | env->id_tlbs = 0; |
2877 | init_excp_BookE(env); | 2937 | init_excp_BookE(env); |
2938 | + env->dcache_line_size = 32; | ||
2939 | + env->icache_line_size = 32; | ||
2878 | /* XXX: TODO: allocate internal IRQ controller */ | 2940 | /* XXX: TODO: allocate internal IRQ controller */ |
2941 | +#if !defined(CONFIG_USER_ONLY) | ||
2942 | + /* Hardware reset vector */ | ||
2943 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2944 | +#endif | ||
2879 | } | 2945 | } |
2880 | 2946 | ||
2881 | /* PowerPC 460 (guessed) */ | 2947 | /* PowerPC 460 (guessed) */ |
@@ -2924,7 +2990,13 @@ static void init_proc_460 (CPUPPCState *env) | @@ -2924,7 +2990,13 @@ static void init_proc_460 (CPUPPCState *env) | ||
2924 | env->nb_ways = 1; | 2990 | env->nb_ways = 1; |
2925 | env->id_tlbs = 0; | 2991 | env->id_tlbs = 0; |
2926 | init_excp_BookE(env); | 2992 | init_excp_BookE(env); |
2993 | + env->dcache_line_size = 32; | ||
2994 | + env->icache_line_size = 32; | ||
2927 | /* XXX: TODO: allocate internal IRQ controller */ | 2995 | /* XXX: TODO: allocate internal IRQ controller */ |
2996 | +#if !defined(CONFIG_USER_ONLY) | ||
2997 | + /* Hardware reset vector */ | ||
2998 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
2999 | +#endif | ||
2928 | } | 3000 | } |
2929 | 3001 | ||
2930 | /* PowerPC 460F (guessed) */ | 3002 | /* PowerPC 460F (guessed) */ |
@@ -2976,7 +3048,13 @@ static void init_proc_460F (CPUPPCState *env) | @@ -2976,7 +3048,13 @@ static void init_proc_460F (CPUPPCState *env) | ||
2976 | env->nb_ways = 1; | 3048 | env->nb_ways = 1; |
2977 | env->id_tlbs = 0; | 3049 | env->id_tlbs = 0; |
2978 | init_excp_BookE(env); | 3050 | init_excp_BookE(env); |
3051 | + env->dcache_line_size = 32; | ||
3052 | + env->icache_line_size = 32; | ||
2979 | /* XXX: TODO: allocate internal IRQ controller */ | 3053 | /* XXX: TODO: allocate internal IRQ controller */ |
3054 | +#if !defined(CONFIG_USER_ONLY) | ||
3055 | + /* Hardware reset vector */ | ||
3056 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3057 | +#endif | ||
2980 | } | 3058 | } |
2981 | 3059 | ||
2982 | /* Generic BookE PowerPC */ | 3060 | /* Generic BookE PowerPC */ |
@@ -2997,6 +3075,12 @@ __attribute__ (( unused )) | @@ -2997,6 +3075,12 @@ __attribute__ (( unused )) | ||
2997 | static void init_proc_BookE (CPUPPCState *env) | 3075 | static void init_proc_BookE (CPUPPCState *env) |
2998 | { | 3076 | { |
2999 | init_excp_BookE(env); | 3077 | init_excp_BookE(env); |
3078 | + env->dcache_line_size = 32; | ||
3079 | + env->icache_line_size = 32; | ||
3080 | +#if !defined(CONFIG_USER_ONLY) | ||
3081 | + /* Hardware reset vector */ | ||
3082 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3083 | +#endif | ||
3000 | } | 3084 | } |
3001 | 3085 | ||
3002 | /* e200 core */ | 3086 | /* e200 core */ |
@@ -3025,7 +3109,13 @@ static void init_proc_e500 (CPUPPCState *env) | @@ -3025,7 +3109,13 @@ static void init_proc_e500 (CPUPPCState *env) | ||
3025 | env->nb_ways = 1; | 3109 | env->nb_ways = 1; |
3026 | env->id_tlbs = 0; | 3110 | env->id_tlbs = 0; |
3027 | init_excp_BookE(env); | 3111 | init_excp_BookE(env); |
3112 | + env->dcache_line_size = 32; | ||
3113 | + env->icache_line_size = 32; | ||
3028 | /* XXX: TODO: allocate internal IRQ controller */ | 3114 | /* XXX: TODO: allocate internal IRQ controller */ |
3115 | +#if !defined(CONFIG_USER_ONLY) | ||
3116 | + /* Hardware reset vector */ | ||
3117 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3118 | +#endif | ||
3029 | } | 3119 | } |
3030 | 3120 | ||
3031 | /* e600 core */ | 3121 | /* e600 core */ |
@@ -3038,7 +3128,7 @@ static void init_proc_e500 (CPUPPCState *env) | @@ -3038,7 +3128,7 @@ static void init_proc_e500 (CPUPPCState *env) | ||
3038 | #define POWERPC_INSNS_WORKS (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT | \ | 3128 | #define POWERPC_INSNS_WORKS (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT | \ |
3039 | PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ | 3129 | PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ |
3040 | PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \ | 3130 | PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \ |
3041 | - PPC_MEM_TLBSYNC | PPC_MFTB) | 3131 | + PPC_MEM_TLBSYNC | PPC_CACHE_DCBZ | PPC_MFTB) |
3042 | 3132 | ||
3043 | /* POWER : same as 601, without mfmsr, mfsr */ | 3133 | /* POWER : same as 601, without mfmsr, mfsr */ |
3044 | #if defined(TODO) | 3134 | #if defined(TODO) |
@@ -3048,7 +3138,8 @@ static void init_proc_e500 (CPUPPCState *env) | @@ -3048,7 +3138,8 @@ static void init_proc_e500 (CPUPPCState *env) | ||
3048 | #endif /* TODO */ | 3138 | #endif /* TODO */ |
3049 | 3139 | ||
3050 | /* PowerPC 601 */ | 3140 | /* PowerPC 601 */ |
3051 | -#define POWERPC_INSNS_601 (POWERPC_INSNS_6xx | PPC_EXTERN | PPC_POWER_BR) | 3141 | +#define POWERPC_INSNS_601 (POWERPC_INSNS_6xx | PPC_CACHE_DCBZ | \ |
3142 | + PPC_EXTERN | PPC_POWER_BR) | ||
3052 | #define POWERPC_MSRM_601 (0x000000000000FE70ULL) | 3143 | #define POWERPC_MSRM_601 (0x000000000000FE70ULL) |
3053 | //#define POWERPC_MMU_601 (POWERPC_MMU_601) | 3144 | //#define POWERPC_MMU_601 (POWERPC_MMU_601) |
3054 | //#define POWERPC_EXCP_601 (POWERPC_EXCP_601) | 3145 | //#define POWERPC_EXCP_601 (POWERPC_EXCP_601) |
@@ -3091,14 +3182,21 @@ static void init_proc_601 (CPUPPCState *env) | @@ -3091,14 +3182,21 @@ static void init_proc_601 (CPUPPCState *env) | ||
3091 | env->id_tlbs = 0; | 3182 | env->id_tlbs = 0; |
3092 | env->id_tlbs = 0; | 3183 | env->id_tlbs = 0; |
3093 | init_excp_601(env); | 3184 | init_excp_601(env); |
3185 | + env->dcache_line_size = 64; | ||
3186 | + env->icache_line_size = 64; | ||
3094 | /* XXX: TODO: allocate internal IRQ controller */ | 3187 | /* XXX: TODO: allocate internal IRQ controller */ |
3188 | +#if !defined(CONFIG_USER_ONLY) | ||
3189 | + /* Hardware reset vector */ | ||
3190 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3191 | +#endif | ||
3095 | } | 3192 | } |
3096 | 3193 | ||
3097 | /* PowerPC 602 */ | 3194 | /* PowerPC 602 */ |
3098 | #define POWERPC_INSNS_602 (POWERPC_INSNS_6xx | PPC_MFTB | \ | 3195 | #define POWERPC_INSNS_602 (POWERPC_INSNS_6xx | PPC_MFTB | \ |
3099 | PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ | 3196 | PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ |
3100 | PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \ | 3197 | PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \ |
3101 | - PPC_6xx_TLB | PPC_MEM_TLBSYNC | PPC_602_SPEC) | 3198 | + PPC_6xx_TLB | PPC_MEM_TLBSYNC | PPC_CACHE_DCBZ |\ |
3199 | + PPC_602_SPEC) | ||
3102 | #define POWERPC_MSRM_602 (0x000000000033FF73ULL) | 3200 | #define POWERPC_MSRM_602 (0x000000000033FF73ULL) |
3103 | #define POWERPC_MMU_602 (POWERPC_MMU_SOFT_6xx) | 3201 | #define POWERPC_MMU_602 (POWERPC_MMU_SOFT_6xx) |
3104 | //#define POWERPC_EXCP_602 (POWERPC_EXCP_602) | 3202 | //#define POWERPC_EXCP_602 (POWERPC_EXCP_602) |
@@ -3126,8 +3224,14 @@ static void init_proc_602 (CPUPPCState *env) | @@ -3126,8 +3224,14 @@ static void init_proc_602 (CPUPPCState *env) | ||
3126 | gen_low_BATs(env); | 3224 | gen_low_BATs(env); |
3127 | gen_6xx_7xx_soft_tlb(env, 64, 2); | 3225 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3128 | init_excp_602(env); | 3226 | init_excp_602(env); |
3227 | + env->dcache_line_size = 32; | ||
3228 | + env->icache_line_size = 32; | ||
3129 | /* Allocate hardware IRQ controller */ | 3229 | /* Allocate hardware IRQ controller */ |
3130 | ppc6xx_irq_init(env); | 3230 | ppc6xx_irq_init(env); |
3231 | +#if !defined(CONFIG_USER_ONLY) | ||
3232 | + /* Hardware reset vector */ | ||
3233 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3234 | +#endif | ||
3131 | } | 3235 | } |
3132 | 3236 | ||
3133 | /* PowerPC 603 */ | 3237 | /* PowerPC 603 */ |
@@ -3159,8 +3263,14 @@ static void init_proc_603 (CPUPPCState *env) | @@ -3159,8 +3263,14 @@ static void init_proc_603 (CPUPPCState *env) | ||
3159 | gen_low_BATs(env); | 3263 | gen_low_BATs(env); |
3160 | gen_6xx_7xx_soft_tlb(env, 64, 2); | 3264 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3161 | init_excp_603(env); | 3265 | init_excp_603(env); |
3266 | + env->dcache_line_size = 32; | ||
3267 | + env->icache_line_size = 32; | ||
3162 | /* Allocate hardware IRQ controller */ | 3268 | /* Allocate hardware IRQ controller */ |
3163 | ppc6xx_irq_init(env); | 3269 | ppc6xx_irq_init(env); |
3270 | +#if !defined(CONFIG_USER_ONLY) | ||
3271 | + /* Hardware reset vector */ | ||
3272 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3273 | +#endif | ||
3164 | } | 3274 | } |
3165 | 3275 | ||
3166 | /* PowerPC 603e */ | 3276 | /* PowerPC 603e */ |
@@ -3197,8 +3307,14 @@ static void init_proc_603E (CPUPPCState *env) | @@ -3197,8 +3307,14 @@ static void init_proc_603E (CPUPPCState *env) | ||
3197 | gen_low_BATs(env); | 3307 | gen_low_BATs(env); |
3198 | gen_6xx_7xx_soft_tlb(env, 64, 2); | 3308 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3199 | init_excp_603(env); | 3309 | init_excp_603(env); |
3310 | + env->dcache_line_size = 32; | ||
3311 | + env->icache_line_size = 32; | ||
3200 | /* Allocate hardware IRQ controller */ | 3312 | /* Allocate hardware IRQ controller */ |
3201 | ppc6xx_irq_init(env); | 3313 | ppc6xx_irq_init(env); |
3314 | +#if !defined(CONFIG_USER_ONLY) | ||
3315 | + /* Hardware reset vector */ | ||
3316 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3317 | +#endif | ||
3202 | } | 3318 | } |
3203 | 3319 | ||
3204 | /* PowerPC G2 */ | 3320 | /* PowerPC G2 */ |
@@ -3237,8 +3353,14 @@ static void init_proc_G2 (CPUPPCState *env) | @@ -3237,8 +3353,14 @@ static void init_proc_G2 (CPUPPCState *env) | ||
3237 | gen_high_BATs(env); | 3353 | gen_high_BATs(env); |
3238 | gen_6xx_7xx_soft_tlb(env, 64, 2); | 3354 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3239 | init_excp_G2(env); | 3355 | init_excp_G2(env); |
3356 | + env->dcache_line_size = 32; | ||
3357 | + env->icache_line_size = 32; | ||
3240 | /* Allocate hardware IRQ controller */ | 3358 | /* Allocate hardware IRQ controller */ |
3241 | ppc6xx_irq_init(env); | 3359 | ppc6xx_irq_init(env); |
3360 | +#if !defined(CONFIG_USER_ONLY) | ||
3361 | + /* Hardware reset vector */ | ||
3362 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3363 | +#endif | ||
3242 | } | 3364 | } |
3243 | 3365 | ||
3244 | /* PowerPC G2LE */ | 3366 | /* PowerPC G2LE */ |
@@ -3277,8 +3399,14 @@ static void init_proc_G2LE (CPUPPCState *env) | @@ -3277,8 +3399,14 @@ static void init_proc_G2LE (CPUPPCState *env) | ||
3277 | gen_high_BATs(env); | 3399 | gen_high_BATs(env); |
3278 | gen_6xx_7xx_soft_tlb(env, 64, 2); | 3400 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3279 | init_excp_G2(env); | 3401 | init_excp_G2(env); |
3402 | + env->dcache_line_size = 32; | ||
3403 | + env->icache_line_size = 32; | ||
3280 | /* Allocate hardware IRQ controller */ | 3404 | /* Allocate hardware IRQ controller */ |
3281 | ppc6xx_irq_init(env); | 3405 | ppc6xx_irq_init(env); |
3406 | +#if !defined(CONFIG_USER_ONLY) | ||
3407 | + /* Hardware reset vector */ | ||
3408 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3409 | +#endif | ||
3282 | } | 3410 | } |
3283 | 3411 | ||
3284 | /* PowerPC 604 */ | 3412 | /* PowerPC 604 */ |
@@ -3309,8 +3437,14 @@ static void init_proc_604 (CPUPPCState *env) | @@ -3309,8 +3437,14 @@ static void init_proc_604 (CPUPPCState *env) | ||
3309 | /* Memory management */ | 3437 | /* Memory management */ |
3310 | gen_low_BATs(env); | 3438 | gen_low_BATs(env); |
3311 | init_excp_604(env); | 3439 | init_excp_604(env); |
3440 | + env->dcache_line_size = 32; | ||
3441 | + env->icache_line_size = 32; | ||
3312 | /* Allocate hardware IRQ controller */ | 3442 | /* Allocate hardware IRQ controller */ |
3313 | ppc6xx_irq_init(env); | 3443 | ppc6xx_irq_init(env); |
3444 | +#if !defined(CONFIG_USER_ONLY) | ||
3445 | + /* Hardware reset vector */ | ||
3446 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3447 | +#endif | ||
3314 | } | 3448 | } |
3315 | 3449 | ||
3316 | /* PowerPC 740/750 (aka G3) */ | 3450 | /* PowerPC 740/750 (aka G3) */ |
@@ -3343,8 +3477,14 @@ static void init_proc_7x0 (CPUPPCState *env) | @@ -3343,8 +3477,14 @@ static void init_proc_7x0 (CPUPPCState *env) | ||
3343 | /* Memory management */ | 3477 | /* Memory management */ |
3344 | gen_low_BATs(env); | 3478 | gen_low_BATs(env); |
3345 | init_excp_7x0(env); | 3479 | init_excp_7x0(env); |
3480 | + env->dcache_line_size = 32; | ||
3481 | + env->icache_line_size = 32; | ||
3346 | /* Allocate hardware IRQ controller */ | 3482 | /* Allocate hardware IRQ controller */ |
3347 | ppc6xx_irq_init(env); | 3483 | ppc6xx_irq_init(env); |
3484 | +#if !defined(CONFIG_USER_ONLY) | ||
3485 | + /* Hardware reset vector */ | ||
3486 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3487 | +#endif | ||
3348 | } | 3488 | } |
3349 | 3489 | ||
3350 | /* PowerPC 750FX/GX */ | 3490 | /* PowerPC 750FX/GX */ |
@@ -3384,8 +3524,14 @@ static void init_proc_750fx (CPUPPCState *env) | @@ -3384,8 +3524,14 @@ static void init_proc_750fx (CPUPPCState *env) | ||
3384 | /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */ | 3524 | /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */ |
3385 | gen_high_BATs(env); | 3525 | gen_high_BATs(env); |
3386 | init_excp_750FX(env); | 3526 | init_excp_750FX(env); |
3527 | + env->dcache_line_size = 32; | ||
3528 | + env->icache_line_size = 32; | ||
3387 | /* Allocate hardware IRQ controller */ | 3529 | /* Allocate hardware IRQ controller */ |
3388 | ppc6xx_irq_init(env); | 3530 | ppc6xx_irq_init(env); |
3531 | +#if !defined(CONFIG_USER_ONLY) | ||
3532 | + /* Hardware reset vector */ | ||
3533 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3534 | +#endif | ||
3389 | } | 3535 | } |
3390 | 3536 | ||
3391 | /* PowerPC 745/755 */ | 3537 | /* PowerPC 745/755 */ |
@@ -3433,8 +3579,14 @@ static void init_proc_7x5 (CPUPPCState *env) | @@ -3433,8 +3579,14 @@ static void init_proc_7x5 (CPUPPCState *env) | ||
3433 | gen_low_BATs(env); | 3579 | gen_low_BATs(env); |
3434 | gen_high_BATs(env); | 3580 | gen_high_BATs(env); |
3435 | gen_6xx_7xx_soft_tlb(env, 64, 2); | 3581 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3582 | + env->dcache_line_size = 32; | ||
3583 | + env->icache_line_size = 32; | ||
3436 | /* Allocate hardware IRQ controller */ | 3584 | /* Allocate hardware IRQ controller */ |
3437 | ppc6xx_irq_init(env); | 3585 | ppc6xx_irq_init(env); |
3586 | +#if !defined(CONFIG_USER_ONLY) | ||
3587 | + /* Hardware reset vector */ | ||
3588 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3589 | +#endif | ||
3438 | } | 3590 | } |
3439 | 3591 | ||
3440 | /* PowerPC 7400 (aka G4) */ | 3592 | /* PowerPC 7400 (aka G4) */ |
@@ -3460,8 +3612,14 @@ static void init_proc_7400 (CPUPPCState *env) | @@ -3460,8 +3612,14 @@ static void init_proc_7400 (CPUPPCState *env) | ||
3460 | /* Memory management */ | 3612 | /* Memory management */ |
3461 | gen_low_BATs(env); | 3613 | gen_low_BATs(env); |
3462 | init_excp_7400(env); | 3614 | init_excp_7400(env); |
3615 | + env->dcache_line_size = 32; | ||
3616 | + env->icache_line_size = 32; | ||
3463 | /* Allocate hardware IRQ controller */ | 3617 | /* Allocate hardware IRQ controller */ |
3464 | ppc6xx_irq_init(env); | 3618 | ppc6xx_irq_init(env); |
3619 | +#if !defined(CONFIG_USER_ONLY) | ||
3620 | + /* Hardware reset vector */ | ||
3621 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3622 | +#endif | ||
3465 | } | 3623 | } |
3466 | 3624 | ||
3467 | /* PowerPC 7410 (aka G4) */ | 3625 | /* PowerPC 7410 (aka G4) */ |
@@ -3499,8 +3657,14 @@ static void init_proc_7410 (CPUPPCState *env) | @@ -3499,8 +3657,14 @@ static void init_proc_7410 (CPUPPCState *env) | ||
3499 | /* Memory management */ | 3657 | /* Memory management */ |
3500 | gen_low_BATs(env); | 3658 | gen_low_BATs(env); |
3501 | init_excp_7400(env); | 3659 | init_excp_7400(env); |
3660 | + env->dcache_line_size = 32; | ||
3661 | + env->icache_line_size = 32; | ||
3502 | /* Allocate hardware IRQ controller */ | 3662 | /* Allocate hardware IRQ controller */ |
3503 | ppc6xx_irq_init(env); | 3663 | ppc6xx_irq_init(env); |
3664 | +#if !defined(CONFIG_USER_ONLY) | ||
3665 | + /* Hardware reset vector */ | ||
3666 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3667 | +#endif | ||
3504 | } | 3668 | } |
3505 | 3669 | ||
3506 | /* PowerPC 7440 (aka G4) */ | 3670 | /* PowerPC 7440 (aka G4) */ |
@@ -3564,8 +3728,14 @@ static void init_proc_7440 (CPUPPCState *env) | @@ -3564,8 +3728,14 @@ static void init_proc_7440 (CPUPPCState *env) | ||
3564 | /* Memory management */ | 3728 | /* Memory management */ |
3565 | gen_low_BATs(env); | 3729 | gen_low_BATs(env); |
3566 | gen_74xx_soft_tlb(env, 128, 2); | 3730 | gen_74xx_soft_tlb(env, 128, 2); |
3731 | + env->dcache_line_size = 32; | ||
3732 | + env->icache_line_size = 32; | ||
3567 | /* Allocate hardware IRQ controller */ | 3733 | /* Allocate hardware IRQ controller */ |
3568 | ppc6xx_irq_init(env); | 3734 | ppc6xx_irq_init(env); |
3735 | +#if !defined(CONFIG_USER_ONLY) | ||
3736 | + /* Hardware reset vector */ | ||
3737 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3738 | +#endif | ||
3569 | } | 3739 | } |
3570 | 3740 | ||
3571 | /* PowerPC 7450 (aka G4) */ | 3741 | /* PowerPC 7450 (aka G4) */ |
@@ -3632,8 +3802,14 @@ static void init_proc_7450 (CPUPPCState *env) | @@ -3632,8 +3802,14 @@ static void init_proc_7450 (CPUPPCState *env) | ||
3632 | gen_low_BATs(env); | 3802 | gen_low_BATs(env); |
3633 | gen_74xx_soft_tlb(env, 128, 2); | 3803 | gen_74xx_soft_tlb(env, 128, 2); |
3634 | init_excp_7450(env); | 3804 | init_excp_7450(env); |
3805 | + env->dcache_line_size = 32; | ||
3806 | + env->icache_line_size = 32; | ||
3635 | /* Allocate hardware IRQ controller */ | 3807 | /* Allocate hardware IRQ controller */ |
3636 | ppc6xx_irq_init(env); | 3808 | ppc6xx_irq_init(env); |
3809 | +#if !defined(CONFIG_USER_ONLY) | ||
3810 | + /* Hardware reset vector */ | ||
3811 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3812 | +#endif | ||
3637 | } | 3813 | } |
3638 | 3814 | ||
3639 | /* PowerPC 7445 (aka G4) */ | 3815 | /* PowerPC 7445 (aka G4) */ |
@@ -3732,8 +3908,14 @@ static void init_proc_7445 (CPUPPCState *env) | @@ -3732,8 +3908,14 @@ static void init_proc_7445 (CPUPPCState *env) | ||
3732 | gen_high_BATs(env); | 3908 | gen_high_BATs(env); |
3733 | gen_74xx_soft_tlb(env, 128, 2); | 3909 | gen_74xx_soft_tlb(env, 128, 2); |
3734 | init_excp_7450(env); | 3910 | init_excp_7450(env); |
3911 | + env->dcache_line_size = 32; | ||
3912 | + env->icache_line_size = 32; | ||
3735 | /* Allocate hardware IRQ controller */ | 3913 | /* Allocate hardware IRQ controller */ |
3736 | ppc6xx_irq_init(env); | 3914 | ppc6xx_irq_init(env); |
3915 | +#if !defined(CONFIG_USER_ONLY) | ||
3916 | + /* Hardware reset vector */ | ||
3917 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
3918 | +#endif | ||
3737 | } | 3919 | } |
3738 | 3920 | ||
3739 | /* PowerPC 7455 (aka G4) */ | 3921 | /* PowerPC 7455 (aka G4) */ |
@@ -3834,13 +4016,23 @@ static void init_proc_7455 (CPUPPCState *env) | @@ -3834,13 +4016,23 @@ static void init_proc_7455 (CPUPPCState *env) | ||
3834 | gen_high_BATs(env); | 4016 | gen_high_BATs(env); |
3835 | gen_74xx_soft_tlb(env, 128, 2); | 4017 | gen_74xx_soft_tlb(env, 128, 2); |
3836 | init_excp_7450(env); | 4018 | init_excp_7450(env); |
4019 | + env->dcache_line_size = 32; | ||
4020 | + env->icache_line_size = 32; | ||
3837 | /* Allocate hardware IRQ controller */ | 4021 | /* Allocate hardware IRQ controller */ |
3838 | ppc6xx_irq_init(env); | 4022 | ppc6xx_irq_init(env); |
4023 | +#if !defined(CONFIG_USER_ONLY) | ||
4024 | + /* Hardware reset vector */ | ||
4025 | + env->hreset_vector = 0xFFFFFFFCUL; | ||
4026 | +#endif | ||
3839 | } | 4027 | } |
3840 | 4028 | ||
3841 | #if defined (TARGET_PPC64) | 4029 | #if defined (TARGET_PPC64) |
4030 | +#define POWERPC_INSNS_WORK64 (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT | \ | ||
4031 | + PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ | ||
4032 | + PPC_FLOAT_FSEL | PPC_FLOAT_STFIWX | \ | ||
4033 | + PPC_MEM_TLBSYNC | PPC_CACHE_DCBZT | PPC_MFTB) | ||
3842 | /* PowerPC 970 */ | 4034 | /* PowerPC 970 */ |
3843 | -#define POWERPC_INSNS_970 (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \ | 4035 | +#define POWERPC_INSNS_970 (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT | \ |
3844 | PPC_64B | PPC_ALTIVEC | \ | 4036 | PPC_64B | PPC_ALTIVEC | \ |
3845 | PPC_64_BRIDGE | PPC_SLBI) | 4037 | PPC_64_BRIDGE | PPC_SLBI) |
3846 | #define POWERPC_MSRM_970 (0x900000000204FF36ULL) | 4038 | #define POWERPC_MSRM_970 (0x900000000204FF36ULL) |
@@ -3860,7 +4052,7 @@ static void init_proc_970 (CPUPPCState *env) | @@ -3860,7 +4052,7 @@ static void init_proc_970 (CPUPPCState *env) | ||
3860 | spr_register(env, SPR_HID0, "HID0", | 4052 | spr_register(env, SPR_HID0, "HID0", |
3861 | SPR_NOACCESS, SPR_NOACCESS, | 4053 | SPR_NOACCESS, SPR_NOACCESS, |
3862 | &spr_read_generic, &spr_write_clear, | 4054 | &spr_read_generic, &spr_write_clear, |
3863 | - 0x00000000); | 4055 | + 0x60000000); |
3864 | /* XXX : not implemented */ | 4056 | /* XXX : not implemented */ |
3865 | spr_register(env, SPR_HID1, "HID1", | 4057 | spr_register(env, SPR_HID1, "HID1", |
3866 | SPR_NOACCESS, SPR_NOACCESS, | 4058 | SPR_NOACCESS, SPR_NOACCESS, |
@@ -3878,12 +4070,18 @@ static void init_proc_970 (CPUPPCState *env) | @@ -3878,12 +4070,18 @@ static void init_proc_970 (CPUPPCState *env) | ||
3878 | env->slb_nr = 32; | 4070 | env->slb_nr = 32; |
3879 | #endif | 4071 | #endif |
3880 | init_excp_970(env); | 4072 | init_excp_970(env); |
4073 | + env->dcache_line_size = 128; | ||
4074 | + env->icache_line_size = 128; | ||
3881 | /* Allocate hardware IRQ controller */ | 4075 | /* Allocate hardware IRQ controller */ |
3882 | ppc970_irq_init(env); | 4076 | ppc970_irq_init(env); |
4077 | +#if !defined(CONFIG_USER_ONLY) | ||
4078 | + /* Hardware reset vector */ | ||
4079 | + env->hreset_vector = 0x0000000000000100ULL; | ||
4080 | +#endif | ||
3883 | } | 4081 | } |
3884 | 4082 | ||
3885 | /* PowerPC 970FX (aka G5) */ | 4083 | /* PowerPC 970FX (aka G5) */ |
3886 | -#define POWERPC_INSNS_970FX (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \ | 4084 | +#define POWERPC_INSNS_970FX (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT | \ |
3887 | PPC_64B | PPC_ALTIVEC | \ | 4085 | PPC_64B | PPC_ALTIVEC | \ |
3888 | PPC_64_BRIDGE | PPC_SLBI) | 4086 | PPC_64_BRIDGE | PPC_SLBI) |
3889 | #define POWERPC_MSRM_970FX (0x800000000204FF36ULL) | 4087 | #define POWERPC_MSRM_970FX (0x800000000204FF36ULL) |
@@ -3903,7 +4101,7 @@ static void init_proc_970FX (CPUPPCState *env) | @@ -3903,7 +4101,7 @@ static void init_proc_970FX (CPUPPCState *env) | ||
3903 | spr_register(env, SPR_HID0, "HID0", | 4101 | spr_register(env, SPR_HID0, "HID0", |
3904 | SPR_NOACCESS, SPR_NOACCESS, | 4102 | SPR_NOACCESS, SPR_NOACCESS, |
3905 | &spr_read_generic, &spr_write_clear, | 4103 | &spr_read_generic, &spr_write_clear, |
3906 | - 0x00000000); | 4104 | + 0x60000000); |
3907 | /* XXX : not implemented */ | 4105 | /* XXX : not implemented */ |
3908 | spr_register(env, SPR_HID1, "HID1", | 4106 | spr_register(env, SPR_HID1, "HID1", |
3909 | SPR_NOACCESS, SPR_NOACCESS, | 4107 | SPR_NOACCESS, SPR_NOACCESS, |
@@ -3914,6 +4112,11 @@ static void init_proc_970FX (CPUPPCState *env) | @@ -3914,6 +4112,11 @@ static void init_proc_970FX (CPUPPCState *env) | ||
3914 | SPR_NOACCESS, SPR_NOACCESS, | 4112 | SPR_NOACCESS, SPR_NOACCESS, |
3915 | &spr_read_generic, &spr_write_generic, | 4113 | &spr_read_generic, &spr_write_generic, |
3916 | 0x00000000); | 4114 | 0x00000000); |
4115 | + /* XXX : not implemented */ | ||
4116 | + spr_register(env, SPR_970_HID5, "HID5", | ||
4117 | + SPR_NOACCESS, SPR_NOACCESS, | ||
4118 | + &spr_read_generic, &spr_write_generic, | ||
4119 | + 0x00000000); | ||
3917 | /* Memory management */ | 4120 | /* Memory management */ |
3918 | /* XXX: not correct */ | 4121 | /* XXX: not correct */ |
3919 | gen_low_BATs(env); | 4122 | gen_low_BATs(env); |
@@ -3921,12 +4124,18 @@ static void init_proc_970FX (CPUPPCState *env) | @@ -3921,12 +4124,18 @@ static void init_proc_970FX (CPUPPCState *env) | ||
3921 | env->slb_nr = 32; | 4124 | env->slb_nr = 32; |
3922 | #endif | 4125 | #endif |
3923 | init_excp_970(env); | 4126 | init_excp_970(env); |
4127 | + env->dcache_line_size = 128; | ||
4128 | + env->icache_line_size = 128; | ||
3924 | /* Allocate hardware IRQ controller */ | 4129 | /* Allocate hardware IRQ controller */ |
3925 | ppc970_irq_init(env); | 4130 | ppc970_irq_init(env); |
4131 | +#if !defined(CONFIG_USER_ONLY) | ||
4132 | + /* Hardware reset vector */ | ||
4133 | + env->hreset_vector = 0x0000000000000100ULL; | ||
4134 | +#endif | ||
3926 | } | 4135 | } |
3927 | 4136 | ||
3928 | /* PowerPC 970 GX */ | 4137 | /* PowerPC 970 GX */ |
3929 | -#define POWERPC_INSNS_970GX (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \ | 4138 | +#define POWERPC_INSNS_970GX (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT | \ |
3930 | PPC_64B | PPC_ALTIVEC | \ | 4139 | PPC_64B | PPC_ALTIVEC | \ |
3931 | PPC_64_BRIDGE | PPC_SLBI) | 4140 | PPC_64_BRIDGE | PPC_SLBI) |
3932 | #define POWERPC_MSRM_970GX (0x800000000204FF36ULL) | 4141 | #define POWERPC_MSRM_970GX (0x800000000204FF36ULL) |
@@ -3946,7 +4155,7 @@ static void init_proc_970GX (CPUPPCState *env) | @@ -3946,7 +4155,7 @@ static void init_proc_970GX (CPUPPCState *env) | ||
3946 | spr_register(env, SPR_HID0, "HID0", | 4155 | spr_register(env, SPR_HID0, "HID0", |
3947 | SPR_NOACCESS, SPR_NOACCESS, | 4156 | SPR_NOACCESS, SPR_NOACCESS, |
3948 | &spr_read_generic, &spr_write_clear, | 4157 | &spr_read_generic, &spr_write_clear, |
3949 | - 0x00000000); | 4158 | + 0x60000000); |
3950 | /* XXX : not implemented */ | 4159 | /* XXX : not implemented */ |
3951 | spr_register(env, SPR_HID1, "HID1", | 4160 | spr_register(env, SPR_HID1, "HID1", |
3952 | SPR_NOACCESS, SPR_NOACCESS, | 4161 | SPR_NOACCESS, SPR_NOACCESS, |
@@ -3957,6 +4166,11 @@ static void init_proc_970GX (CPUPPCState *env) | @@ -3957,6 +4166,11 @@ static void init_proc_970GX (CPUPPCState *env) | ||
3957 | SPR_NOACCESS, SPR_NOACCESS, | 4166 | SPR_NOACCESS, SPR_NOACCESS, |
3958 | &spr_read_generic, &spr_write_generic, | 4167 | &spr_read_generic, &spr_write_generic, |
3959 | 0x00000000); | 4168 | 0x00000000); |
4169 | + /* XXX : not implemented */ | ||
4170 | + spr_register(env, SPR_970_HID5, "HID5", | ||
4171 | + SPR_NOACCESS, SPR_NOACCESS, | ||
4172 | + &spr_read_generic, &spr_write_generic, | ||
4173 | + 0x00000000); | ||
3960 | /* Memory management */ | 4174 | /* Memory management */ |
3961 | /* XXX: not correct */ | 4175 | /* XXX: not correct */ |
3962 | gen_low_BATs(env); | 4176 | gen_low_BATs(env); |
@@ -3964,8 +4178,14 @@ static void init_proc_970GX (CPUPPCState *env) | @@ -3964,8 +4178,14 @@ static void init_proc_970GX (CPUPPCState *env) | ||
3964 | env->slb_nr = 32; | 4178 | env->slb_nr = 32; |
3965 | #endif | 4179 | #endif |
3966 | init_excp_970(env); | 4180 | init_excp_970(env); |
4181 | + env->dcache_line_size = 128; | ||
4182 | + env->icache_line_size = 128; | ||
3967 | /* Allocate hardware IRQ controller */ | 4183 | /* Allocate hardware IRQ controller */ |
3968 | ppc970_irq_init(env); | 4184 | ppc970_irq_init(env); |
4185 | +#if !defined(CONFIG_USER_ONLY) | ||
4186 | + /* Hardware reset vector */ | ||
4187 | + env->hreset_vector = 0x0000000000000100ULL; | ||
4188 | +#endif | ||
3969 | } | 4189 | } |
3970 | 4190 | ||
3971 | /* PowerPC 620 */ | 4191 | /* PowerPC 620 */ |
@@ -3994,7 +4214,13 @@ static void init_proc_620 (CPUPPCState *env) | @@ -3994,7 +4214,13 @@ static void init_proc_620 (CPUPPCState *env) | ||
3994 | gen_low_BATs(env); | 4214 | gen_low_BATs(env); |
3995 | gen_high_BATs(env); | 4215 | gen_high_BATs(env); |
3996 | init_excp_620(env); | 4216 | init_excp_620(env); |
4217 | + env->dcache_line_size = 64; | ||
4218 | + env->icache_line_size = 64; | ||
3997 | /* XXX: TODO: initialize internal interrupt controller */ | 4219 | /* XXX: TODO: initialize internal interrupt controller */ |
4220 | +#if !defined(CONFIG_USER_ONLY) | ||
4221 | + /* Hardware reset vector */ | ||
4222 | + env->hreset_vector = 0x0000000000000100ULL; /* ? */ | ||
4223 | +#endif | ||
3998 | } | 4224 | } |
3999 | #endif /* defined (TARGET_PPC64) */ | 4225 | #endif /* defined (TARGET_PPC64) */ |
4000 | 4226 |