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 | 82 | #define ELF_MACHINE EM_PPC |
83 | 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 | 86 | /* MMU model */ |
93 | 87 | enum { |
... | ... | @@ -521,6 +515,9 @@ struct CPUPPCState { |
521 | 515 | /* 403 dedicated access protection registers */ |
522 | 516 | target_ulong pb[4]; |
523 | 517 | |
518 | + int dcache_line_size; | |
519 | + int icache_line_size; | |
520 | + | |
524 | 521 | /* Those resources are used during exception processing */ |
525 | 522 | /* CPU model definition */ |
526 | 523 | target_ulong msr_mask; |
... | ... | @@ -546,6 +543,7 @@ struct CPUPPCState { |
546 | 543 | target_ulong excp_prefix; |
547 | 544 | target_ulong ivor_mask; |
548 | 545 | target_ulong ivpr_mask; |
546 | + target_ulong hreset_vector; | |
549 | 547 | #endif |
550 | 548 | |
551 | 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 | 1050 | #define SPR_601_HID5 (0x3F5) |
1053 | 1051 | #define SPR_40x_DAC1 (0x3F6) |
1054 | 1052 | #define SPR_MSSCR0 (0x3F6) |
1053 | +#define SPR_970_HID5 (0x3F6) | |
1055 | 1054 | #define SPR_MSSSR0 (0x3F7) |
1056 | 1055 | #define SPR_DABRX (0x3F7) |
1057 | 1056 | #define SPR_40x_DAC2 (0x3F7) | ... | ... |
target-ppc/op_helper.c
... | ... | @@ -1061,21 +1061,21 @@ void do_POWER_clcs (void) |
1061 | 1061 | switch (T0) { |
1062 | 1062 | case 0x0CUL: |
1063 | 1063 | /* Instruction cache line size */ |
1064 | - T0 = ICACHE_LINE_SIZE; | |
1064 | + T0 = env->icache_line_size; | |
1065 | 1065 | break; |
1066 | 1066 | case 0x0DUL: |
1067 | 1067 | /* Data cache line size */ |
1068 | - T0 = DCACHE_LINE_SIZE; | |
1068 | + T0 = env->dcache_line_size; | |
1069 | 1069 | break; |
1070 | 1070 | case 0x0EUL: |
1071 | 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 | 1074 | break; |
1075 | 1075 | case 0x0FUL: |
1076 | 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 | 1079 | break; |
1080 | 1080 | default: |
1081 | 1081 | /* Undefined */ | ... | ... |
target-ppc/op_helper.h
... | ... | @@ -30,6 +30,7 @@ void glue(do_lmw_le, MEMSUFFIX) (int dst); |
30 | 30 | void glue(do_stmw, MEMSUFFIX) (int src); |
31 | 31 | void glue(do_stmw_le, MEMSUFFIX) (int src); |
32 | 32 | void glue(do_icbi, MEMSUFFIX) (void); |
33 | +void glue(do_dcbz, MEMSUFFIX) (void); | |
33 | 34 | void glue(do_POWER_lscbx, MEMSUFFIX) (int dest, int ra, int rb); |
34 | 35 | void glue(do_POWER2_lfq, MEMSUFFIX) (void); |
35 | 36 | void glue(do_POWER2_lfq_le, MEMSUFFIX) (void); |
... | ... | @@ -46,6 +47,7 @@ void glue(do_lmw_le_64, MEMSUFFIX) (int dst); |
46 | 47 | void glue(do_stmw_64, MEMSUFFIX) (int src); |
47 | 48 | void glue(do_stmw_le_64, MEMSUFFIX) (int src); |
48 | 49 | void glue(do_icbi_64, MEMSUFFIX) (void); |
50 | +void glue(do_dcbz_64, MEMSUFFIX) (void); | |
49 | 51 | #endif |
50 | 52 | |
51 | 53 | #else | ... | ... |
target-ppc/op_helper_mem.h
... | ... | @@ -252,8 +252,9 @@ void glue(do_icbi, MEMSUFFIX) (void) |
252 | 252 | * do the load "by hand". |
253 | 253 | */ |
254 | 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 | 260 | #if defined(TARGET_PPC64) |
... | ... | @@ -266,8 +267,101 @@ void glue(do_icbi_64, MEMSUFFIX) (void) |
266 | 267 | * do the load "by hand". |
267 | 268 | */ |
268 | 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 | 366 | #endif |
273 | 367 | ... | ... |
target-ppc/op_mem.h
... | ... | @@ -787,7 +787,20 @@ void OPPROTO glue(op_stdcx_le_64, MEMSUFFIX) (void) |
787 | 787 | } |
788 | 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 | 805 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x00), 0); |
793 | 806 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x04), 0); |
... | ... | @@ -797,8 +810,6 @@ void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) |
797 | 810 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x14), 0); |
798 | 811 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x18), 0); |
799 | 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 | 813 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x20UL), 0); |
803 | 814 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x24UL), 0); |
804 | 815 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x28UL), 0); |
... | ... | @@ -807,12 +818,67 @@ void OPPROTO glue(op_dcbz, MEMSUFFIX) (void) |
807 | 818 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x34UL), 0); |
808 | 819 | glue(stl, MEMSUFFIX)((uint32_t)(T0 + 0x38UL), 0); |
809 | 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 | 864 | RETURN(); |
812 | 865 | } |
813 | 866 | |
814 | 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 | 883 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x00), 0); |
818 | 884 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x04), 0); |
... | ... | @@ -822,8 +888,6 @@ void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) |
822 | 888 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x14), 0); |
823 | 889 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x18), 0); |
824 | 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 | 891 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x20UL), 0); |
828 | 892 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x24UL), 0); |
829 | 893 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x28UL), 0); |
... | ... | @@ -832,7 +896,49 @@ void OPPROTO glue(op_dcbz_64, MEMSUFFIX) (void) |
832 | 896 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x34UL), 0); |
833 | 897 | glue(stl, MEMSUFFIX)((uint64_t)(T0 + 0x38UL), 0); |
834 | 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 | 942 | RETURN(); |
837 | 943 | } |
838 | 944 | #endif | ... | ... |
target-ppc/translate.c
... | ... | @@ -169,6 +169,7 @@ typedef struct DisasContext { |
169 | 169 | #endif |
170 | 170 | ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */ |
171 | 171 | int singlestep_enabled; |
172 | + int dcache_line_size; | |
172 | 173 | } DisasContext; |
173 | 174 | |
174 | 175 | struct opc_handler_t { |
... | ... | @@ -482,6 +483,10 @@ enum { |
482 | 483 | PPC_WAIT = 0x0000100000000000ULL, |
483 | 484 | /* New 64 bits extensions (PowerPC 2.0x) */ |
484 | 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 | 3628 | } |
3624 | 3629 | |
3625 | 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 | 3632 | #if defined(CONFIG_USER_ONLY) |
3628 | 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 | 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 | 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 | 3668 | #else |
3638 | 3669 | #if defined(TARGET_PPC64) |
3639 | 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 | 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 | 3734 | #endif |
3735 | + }, | |
3655 | 3736 | }; |
3656 | 3737 | #else |
3657 | 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 | 3765 | #endif |
3665 | 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 | 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 | 3803 | gen_op_check_reservation(); |
3672 | 3804 | } |
3673 | 3805 | |
... | ... | @@ -6341,6 +6473,7 @@ static inline int gen_intermediate_code_internal (CPUState *env, |
6341 | 6473 | #else |
6342 | 6474 | ctx.mem_idx = (supervisor << 1) | msr_le; |
6343 | 6475 | #endif |
6476 | + ctx.dcache_line_size = env->dcache_line_size; | |
6344 | 6477 | ctx.fpu_enabled = msr_fp; |
6345 | 6478 | #if defined(TARGET_PPCEMB) |
6346 | 6479 | ctx.spe_enabled = msr_spe; | ... | ... |
target-ppc/translate_init.c
... | ... | @@ -2542,7 +2542,7 @@ static void init_excp_970 (CPUPPCState *env) |
2542 | 2542 | /* PowerPC implementations definitions */ |
2543 | 2543 | |
2544 | 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 | 2547 | /* PowerPC 401 */ |
2548 | 2548 | #define POWERPC_INSNS_401 (POWERPC_INSNS_EMB | \ |
... | ... | @@ -2560,8 +2560,14 @@ static void init_proc_401 (CPUPPCState *env) |
2560 | 2560 | gen_spr_401_403(env); |
2561 | 2561 | gen_spr_401(env); |
2562 | 2562 | init_excp_4xx_real(env); |
2563 | + env->dcache_line_size = 32; | |
2564 | + env->icache_line_size = 32; | |
2563 | 2565 | /* Allocate hardware IRQ controller */ |
2564 | 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 | 2573 | /* PowerPC 401x2 */ |
... | ... | @@ -2587,8 +2593,14 @@ static void init_proc_401x2 (CPUPPCState *env) |
2587 | 2593 | env->nb_ways = 1; |
2588 | 2594 | env->id_tlbs = 0; |
2589 | 2595 | init_excp_4xx_softmmu(env); |
2596 | + env->dcache_line_size = 32; | |
2597 | + env->icache_line_size = 32; | |
2590 | 2598 | /* Allocate hardware IRQ controller */ |
2591 | 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 | 2606 | /* PowerPC 401x3 */ |
... | ... | @@ -2612,8 +2624,14 @@ static void init_proc_401x3 (CPUPPCState *env) |
2612 | 2624 | gen_spr_401x2(env); |
2613 | 2625 | gen_spr_compress(env); |
2614 | 2626 | init_excp_4xx_softmmu(env); |
2627 | + env->dcache_line_size = 32; | |
2628 | + env->icache_line_size = 32; | |
2615 | 2629 | /* Allocate hardware IRQ controller */ |
2616 | 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 | 2637 | /* IOP480 */ |
... | ... | @@ -2639,8 +2657,14 @@ static void init_proc_IOP480 (CPUPPCState *env) |
2639 | 2657 | env->nb_ways = 1; |
2640 | 2658 | env->id_tlbs = 0; |
2641 | 2659 | init_excp_4xx_softmmu(env); |
2660 | + env->dcache_line_size = 32; | |
2661 | + env->icache_line_size = 32; | |
2642 | 2662 | /* Allocate hardware IRQ controller */ |
2643 | 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 | 2670 | /* PowerPC 403 */ |
... | ... | @@ -2661,8 +2685,14 @@ static void init_proc_403 (CPUPPCState *env) |
2661 | 2685 | gen_spr_403(env); |
2662 | 2686 | gen_spr_403_real(env); |
2663 | 2687 | init_excp_4xx_real(env); |
2688 | + env->dcache_line_size = 32; | |
2689 | + env->icache_line_size = 32; | |
2664 | 2690 | /* Allocate hardware IRQ controller */ |
2665 | 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 | 2698 | /* PowerPC 403 GCX */ |
... | ... | @@ -2699,8 +2729,14 @@ static void init_proc_403GCX (CPUPPCState *env) |
2699 | 2729 | env->nb_ways = 1; |
2700 | 2730 | env->id_tlbs = 0; |
2701 | 2731 | init_excp_4xx_softmmu(env); |
2732 | + env->dcache_line_size = 32; | |
2733 | + env->icache_line_size = 32; | |
2702 | 2734 | /* Allocate hardware IRQ controller */ |
2703 | 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 | 2742 | /* PowerPC 405 */ |
... | ... | @@ -2737,8 +2773,14 @@ static void init_proc_405 (CPUPPCState *env) |
2737 | 2773 | env->nb_ways = 1; |
2738 | 2774 | env->id_tlbs = 0; |
2739 | 2775 | init_excp_4xx_softmmu(env); |
2776 | + env->dcache_line_size = 32; | |
2777 | + env->icache_line_size = 32; | |
2740 | 2778 | /* Allocate hardware IRQ controller */ |
2741 | 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 | 2786 | /* PowerPC 440 EP */ |
... | ... | @@ -2781,7 +2823,13 @@ static void init_proc_440EP (CPUPPCState *env) |
2781 | 2823 | env->nb_ways = 1; |
2782 | 2824 | env->id_tlbs = 0; |
2783 | 2825 | init_excp_BookE(env); |
2826 | + env->dcache_line_size = 32; | |
2827 | + env->icache_line_size = 32; | |
2784 | 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 | 2835 | /* PowerPC 440 GP */ |
... | ... | @@ -2806,7 +2854,13 @@ static void init_proc_440GP (CPUPPCState *env) |
2806 | 2854 | env->nb_ways = 1; |
2807 | 2855 | env->id_tlbs = 0; |
2808 | 2856 | init_excp_BookE(env); |
2857 | + env->dcache_line_size = 32; | |
2858 | + env->icache_line_size = 32; | |
2809 | 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 | 2866 | /* PowerPC 440x4 */ |
... | ... | @@ -2832,7 +2886,13 @@ static void init_proc_440x4 (CPUPPCState *env) |
2832 | 2886 | env->nb_ways = 1; |
2833 | 2887 | env->id_tlbs = 0; |
2834 | 2888 | init_excp_BookE(env); |
2889 | + env->dcache_line_size = 32; | |
2890 | + env->icache_line_size = 32; | |
2835 | 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 | 2898 | /* PowerPC 440x5 */ |
... | ... | @@ -2875,7 +2935,13 @@ static void init_proc_440x5 (CPUPPCState *env) |
2875 | 2935 | env->nb_ways = 1; |
2876 | 2936 | env->id_tlbs = 0; |
2877 | 2937 | init_excp_BookE(env); |
2938 | + env->dcache_line_size = 32; | |
2939 | + env->icache_line_size = 32; | |
2878 | 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 | 2947 | /* PowerPC 460 (guessed) */ |
... | ... | @@ -2924,7 +2990,13 @@ static void init_proc_460 (CPUPPCState *env) |
2924 | 2990 | env->nb_ways = 1; |
2925 | 2991 | env->id_tlbs = 0; |
2926 | 2992 | init_excp_BookE(env); |
2993 | + env->dcache_line_size = 32; | |
2994 | + env->icache_line_size = 32; | |
2927 | 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 | 3002 | /* PowerPC 460F (guessed) */ |
... | ... | @@ -2976,7 +3048,13 @@ static void init_proc_460F (CPUPPCState *env) |
2976 | 3048 | env->nb_ways = 1; |
2977 | 3049 | env->id_tlbs = 0; |
2978 | 3050 | init_excp_BookE(env); |
3051 | + env->dcache_line_size = 32; | |
3052 | + env->icache_line_size = 32; | |
2979 | 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 | 3060 | /* Generic BookE PowerPC */ |
... | ... | @@ -2997,6 +3075,12 @@ __attribute__ (( unused )) |
2997 | 3075 | static void init_proc_BookE (CPUPPCState *env) |
2998 | 3076 | { |
2999 | 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 | 3086 | /* e200 core */ |
... | ... | @@ -3025,7 +3109,13 @@ static void init_proc_e500 (CPUPPCState *env) |
3025 | 3109 | env->nb_ways = 1; |
3026 | 3110 | env->id_tlbs = 0; |
3027 | 3111 | init_excp_BookE(env); |
3112 | + env->dcache_line_size = 32; | |
3113 | + env->icache_line_size = 32; | |
3028 | 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 | 3121 | /* e600 core */ |
... | ... | @@ -3038,7 +3128,7 @@ static void init_proc_e500 (CPUPPCState *env) |
3038 | 3128 | #define POWERPC_INSNS_WORKS (POWERPC_INSNS_6xx | PPC_FLOAT_FSQRT | \ |
3039 | 3129 | PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ |
3040 | 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 | 3133 | /* POWER : same as 601, without mfmsr, mfsr */ |
3044 | 3134 | #if defined(TODO) |
... | ... | @@ -3048,7 +3138,8 @@ static void init_proc_e500 (CPUPPCState *env) |
3048 | 3138 | #endif /* TODO */ |
3049 | 3139 | |
3050 | 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 | 3143 | #define POWERPC_MSRM_601 (0x000000000000FE70ULL) |
3053 | 3144 | //#define POWERPC_MMU_601 (POWERPC_MMU_601) |
3054 | 3145 | //#define POWERPC_EXCP_601 (POWERPC_EXCP_601) |
... | ... | @@ -3091,14 +3182,21 @@ static void init_proc_601 (CPUPPCState *env) |
3091 | 3182 | env->id_tlbs = 0; |
3092 | 3183 | env->id_tlbs = 0; |
3093 | 3184 | init_excp_601(env); |
3185 | + env->dcache_line_size = 64; | |
3186 | + env->icache_line_size = 64; | |
3094 | 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 | 3194 | /* PowerPC 602 */ |
3098 | 3195 | #define POWERPC_INSNS_602 (POWERPC_INSNS_6xx | PPC_MFTB | \ |
3099 | 3196 | PPC_FLOAT_FRES | PPC_FLOAT_FRSQRTE | \ |
3100 | 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 | 3200 | #define POWERPC_MSRM_602 (0x000000000033FF73ULL) |
3103 | 3201 | #define POWERPC_MMU_602 (POWERPC_MMU_SOFT_6xx) |
3104 | 3202 | //#define POWERPC_EXCP_602 (POWERPC_EXCP_602) |
... | ... | @@ -3126,8 +3224,14 @@ static void init_proc_602 (CPUPPCState *env) |
3126 | 3224 | gen_low_BATs(env); |
3127 | 3225 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3128 | 3226 | init_excp_602(env); |
3227 | + env->dcache_line_size = 32; | |
3228 | + env->icache_line_size = 32; | |
3129 | 3229 | /* Allocate hardware IRQ controller */ |
3130 | 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 | 3237 | /* PowerPC 603 */ |
... | ... | @@ -3159,8 +3263,14 @@ static void init_proc_603 (CPUPPCState *env) |
3159 | 3263 | gen_low_BATs(env); |
3160 | 3264 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3161 | 3265 | init_excp_603(env); |
3266 | + env->dcache_line_size = 32; | |
3267 | + env->icache_line_size = 32; | |
3162 | 3268 | /* Allocate hardware IRQ controller */ |
3163 | 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 | 3276 | /* PowerPC 603e */ |
... | ... | @@ -3197,8 +3307,14 @@ static void init_proc_603E (CPUPPCState *env) |
3197 | 3307 | gen_low_BATs(env); |
3198 | 3308 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3199 | 3309 | init_excp_603(env); |
3310 | + env->dcache_line_size = 32; | |
3311 | + env->icache_line_size = 32; | |
3200 | 3312 | /* Allocate hardware IRQ controller */ |
3201 | 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 | 3320 | /* PowerPC G2 */ |
... | ... | @@ -3237,8 +3353,14 @@ static void init_proc_G2 (CPUPPCState *env) |
3237 | 3353 | gen_high_BATs(env); |
3238 | 3354 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3239 | 3355 | init_excp_G2(env); |
3356 | + env->dcache_line_size = 32; | |
3357 | + env->icache_line_size = 32; | |
3240 | 3358 | /* Allocate hardware IRQ controller */ |
3241 | 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 | 3366 | /* PowerPC G2LE */ |
... | ... | @@ -3277,8 +3399,14 @@ static void init_proc_G2LE (CPUPPCState *env) |
3277 | 3399 | gen_high_BATs(env); |
3278 | 3400 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3279 | 3401 | init_excp_G2(env); |
3402 | + env->dcache_line_size = 32; | |
3403 | + env->icache_line_size = 32; | |
3280 | 3404 | /* Allocate hardware IRQ controller */ |
3281 | 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 | 3412 | /* PowerPC 604 */ |
... | ... | @@ -3309,8 +3437,14 @@ static void init_proc_604 (CPUPPCState *env) |
3309 | 3437 | /* Memory management */ |
3310 | 3438 | gen_low_BATs(env); |
3311 | 3439 | init_excp_604(env); |
3440 | + env->dcache_line_size = 32; | |
3441 | + env->icache_line_size = 32; | |
3312 | 3442 | /* Allocate hardware IRQ controller */ |
3313 | 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 | 3450 | /* PowerPC 740/750 (aka G3) */ |
... | ... | @@ -3343,8 +3477,14 @@ static void init_proc_7x0 (CPUPPCState *env) |
3343 | 3477 | /* Memory management */ |
3344 | 3478 | gen_low_BATs(env); |
3345 | 3479 | init_excp_7x0(env); |
3480 | + env->dcache_line_size = 32; | |
3481 | + env->icache_line_size = 32; | |
3346 | 3482 | /* Allocate hardware IRQ controller */ |
3347 | 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 | 3490 | /* PowerPC 750FX/GX */ |
... | ... | @@ -3384,8 +3524,14 @@ static void init_proc_750fx (CPUPPCState *env) |
3384 | 3524 | /* PowerPC 750fx & 750gx has 8 DBATs and 8 IBATs */ |
3385 | 3525 | gen_high_BATs(env); |
3386 | 3526 | init_excp_750FX(env); |
3527 | + env->dcache_line_size = 32; | |
3528 | + env->icache_line_size = 32; | |
3387 | 3529 | /* Allocate hardware IRQ controller */ |
3388 | 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 | 3537 | /* PowerPC 745/755 */ |
... | ... | @@ -3433,8 +3579,14 @@ static void init_proc_7x5 (CPUPPCState *env) |
3433 | 3579 | gen_low_BATs(env); |
3434 | 3580 | gen_high_BATs(env); |
3435 | 3581 | gen_6xx_7xx_soft_tlb(env, 64, 2); |
3582 | + env->dcache_line_size = 32; | |
3583 | + env->icache_line_size = 32; | |
3436 | 3584 | /* Allocate hardware IRQ controller */ |
3437 | 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 | 3592 | /* PowerPC 7400 (aka G4) */ |
... | ... | @@ -3460,8 +3612,14 @@ static void init_proc_7400 (CPUPPCState *env) |
3460 | 3612 | /* Memory management */ |
3461 | 3613 | gen_low_BATs(env); |
3462 | 3614 | init_excp_7400(env); |
3615 | + env->dcache_line_size = 32; | |
3616 | + env->icache_line_size = 32; | |
3463 | 3617 | /* Allocate hardware IRQ controller */ |
3464 | 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 | 3625 | /* PowerPC 7410 (aka G4) */ |
... | ... | @@ -3499,8 +3657,14 @@ static void init_proc_7410 (CPUPPCState *env) |
3499 | 3657 | /* Memory management */ |
3500 | 3658 | gen_low_BATs(env); |
3501 | 3659 | init_excp_7400(env); |
3660 | + env->dcache_line_size = 32; | |
3661 | + env->icache_line_size = 32; | |
3502 | 3662 | /* Allocate hardware IRQ controller */ |
3503 | 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 | 3670 | /* PowerPC 7440 (aka G4) */ |
... | ... | @@ -3564,8 +3728,14 @@ static void init_proc_7440 (CPUPPCState *env) |
3564 | 3728 | /* Memory management */ |
3565 | 3729 | gen_low_BATs(env); |
3566 | 3730 | gen_74xx_soft_tlb(env, 128, 2); |
3731 | + env->dcache_line_size = 32; | |
3732 | + env->icache_line_size = 32; | |
3567 | 3733 | /* Allocate hardware IRQ controller */ |
3568 | 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 | 3741 | /* PowerPC 7450 (aka G4) */ |
... | ... | @@ -3632,8 +3802,14 @@ static void init_proc_7450 (CPUPPCState *env) |
3632 | 3802 | gen_low_BATs(env); |
3633 | 3803 | gen_74xx_soft_tlb(env, 128, 2); |
3634 | 3804 | init_excp_7450(env); |
3805 | + env->dcache_line_size = 32; | |
3806 | + env->icache_line_size = 32; | |
3635 | 3807 | /* Allocate hardware IRQ controller */ |
3636 | 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 | 3815 | /* PowerPC 7445 (aka G4) */ |
... | ... | @@ -3732,8 +3908,14 @@ static void init_proc_7445 (CPUPPCState *env) |
3732 | 3908 | gen_high_BATs(env); |
3733 | 3909 | gen_74xx_soft_tlb(env, 128, 2); |
3734 | 3910 | init_excp_7450(env); |
3911 | + env->dcache_line_size = 32; | |
3912 | + env->icache_line_size = 32; | |
3735 | 3913 | /* Allocate hardware IRQ controller */ |
3736 | 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 | 3921 | /* PowerPC 7455 (aka G4) */ |
... | ... | @@ -3834,13 +4016,23 @@ static void init_proc_7455 (CPUPPCState *env) |
3834 | 4016 | gen_high_BATs(env); |
3835 | 4017 | gen_74xx_soft_tlb(env, 128, 2); |
3836 | 4018 | init_excp_7450(env); |
4019 | + env->dcache_line_size = 32; | |
4020 | + env->icache_line_size = 32; | |
3837 | 4021 | /* Allocate hardware IRQ controller */ |
3838 | 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 | 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 | 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 | 4036 | PPC_64B | PPC_ALTIVEC | \ |
3845 | 4037 | PPC_64_BRIDGE | PPC_SLBI) |
3846 | 4038 | #define POWERPC_MSRM_970 (0x900000000204FF36ULL) |
... | ... | @@ -3860,7 +4052,7 @@ static void init_proc_970 (CPUPPCState *env) |
3860 | 4052 | spr_register(env, SPR_HID0, "HID0", |
3861 | 4053 | SPR_NOACCESS, SPR_NOACCESS, |
3862 | 4054 | &spr_read_generic, &spr_write_clear, |
3863 | - 0x00000000); | |
4055 | + 0x60000000); | |
3864 | 4056 | /* XXX : not implemented */ |
3865 | 4057 | spr_register(env, SPR_HID1, "HID1", |
3866 | 4058 | SPR_NOACCESS, SPR_NOACCESS, |
... | ... | @@ -3878,12 +4070,18 @@ static void init_proc_970 (CPUPPCState *env) |
3878 | 4070 | env->slb_nr = 32; |
3879 | 4071 | #endif |
3880 | 4072 | init_excp_970(env); |
4073 | + env->dcache_line_size = 128; | |
4074 | + env->icache_line_size = 128; | |
3881 | 4075 | /* Allocate hardware IRQ controller */ |
3882 | 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 | 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 | 4085 | PPC_64B | PPC_ALTIVEC | \ |
3888 | 4086 | PPC_64_BRIDGE | PPC_SLBI) |
3889 | 4087 | #define POWERPC_MSRM_970FX (0x800000000204FF36ULL) |
... | ... | @@ -3903,7 +4101,7 @@ static void init_proc_970FX (CPUPPCState *env) |
3903 | 4101 | spr_register(env, SPR_HID0, "HID0", |
3904 | 4102 | SPR_NOACCESS, SPR_NOACCESS, |
3905 | 4103 | &spr_read_generic, &spr_write_clear, |
3906 | - 0x00000000); | |
4104 | + 0x60000000); | |
3907 | 4105 | /* XXX : not implemented */ |
3908 | 4106 | spr_register(env, SPR_HID1, "HID1", |
3909 | 4107 | SPR_NOACCESS, SPR_NOACCESS, |
... | ... | @@ -3914,6 +4112,11 @@ static void init_proc_970FX (CPUPPCState *env) |
3914 | 4112 | SPR_NOACCESS, SPR_NOACCESS, |
3915 | 4113 | &spr_read_generic, &spr_write_generic, |
3916 | 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 | 4120 | /* Memory management */ |
3918 | 4121 | /* XXX: not correct */ |
3919 | 4122 | gen_low_BATs(env); |
... | ... | @@ -3921,12 +4124,18 @@ static void init_proc_970FX (CPUPPCState *env) |
3921 | 4124 | env->slb_nr = 32; |
3922 | 4125 | #endif |
3923 | 4126 | init_excp_970(env); |
4127 | + env->dcache_line_size = 128; | |
4128 | + env->icache_line_size = 128; | |
3924 | 4129 | /* Allocate hardware IRQ controller */ |
3925 | 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 | 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 | 4139 | PPC_64B | PPC_ALTIVEC | \ |
3931 | 4140 | PPC_64_BRIDGE | PPC_SLBI) |
3932 | 4141 | #define POWERPC_MSRM_970GX (0x800000000204FF36ULL) |
... | ... | @@ -3946,7 +4155,7 @@ static void init_proc_970GX (CPUPPCState *env) |
3946 | 4155 | spr_register(env, SPR_HID0, "HID0", |
3947 | 4156 | SPR_NOACCESS, SPR_NOACCESS, |
3948 | 4157 | &spr_read_generic, &spr_write_clear, |
3949 | - 0x00000000); | |
4158 | + 0x60000000); | |
3950 | 4159 | /* XXX : not implemented */ |
3951 | 4160 | spr_register(env, SPR_HID1, "HID1", |
3952 | 4161 | SPR_NOACCESS, SPR_NOACCESS, |
... | ... | @@ -3957,6 +4166,11 @@ static void init_proc_970GX (CPUPPCState *env) |
3957 | 4166 | SPR_NOACCESS, SPR_NOACCESS, |
3958 | 4167 | &spr_read_generic, &spr_write_generic, |
3959 | 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 | 4174 | /* Memory management */ |
3961 | 4175 | /* XXX: not correct */ |
3962 | 4176 | gen_low_BATs(env); |
... | ... | @@ -3964,8 +4178,14 @@ static void init_proc_970GX (CPUPPCState *env) |
3964 | 4178 | env->slb_nr = 32; |
3965 | 4179 | #endif |
3966 | 4180 | init_excp_970(env); |
4181 | + env->dcache_line_size = 128; | |
4182 | + env->icache_line_size = 128; | |
3967 | 4183 | /* Allocate hardware IRQ controller */ |
3968 | 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 | 4191 | /* PowerPC 620 */ |
... | ... | @@ -3994,7 +4214,13 @@ static void init_proc_620 (CPUPPCState *env) |
3994 | 4214 | gen_low_BATs(env); |
3995 | 4215 | gen_high_BATs(env); |
3996 | 4216 | init_excp_620(env); |
4217 | + env->dcache_line_size = 64; | |
4218 | + env->icache_line_size = 64; | |
3997 | 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 | 4225 | #endif /* defined (TARGET_PPC64) */ |
4000 | 4226 | ... | ... |