Revision d63001d1

b/target-ppc/cpu.h
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 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 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 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)
b/target-ppc/op_helper.c
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 */
b/target-ppc/op_helper.h
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 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
b/target-ppc/op_helper_mem.h
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 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

  
b/target-ppc/op_mem.h
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 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 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 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 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
b/target-ppc/translate.c
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 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 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 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;
b/target-ppc/translate_init.c
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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

  

Also available in: Unified diff