Revision 237c0af0 target-ppc/translate_init.c
b/target-ppc/translate_init.c | ||
---|---|---|
23 | 23 |
* inside "#if defined(TODO) ... #endif" statements to make tests easier. |
24 | 24 |
*/ |
25 | 25 |
|
26 |
#include "dis-asm.h" |
|
27 |
|
|
26 | 28 |
//#define PPC_DUMP_CPU |
27 | 29 |
//#define PPC_DEBUG_SPR |
28 | 30 |
//#define PPC_DEBUG_IRQ |
... | ... | |
37 | 39 |
uint8_t excp_model; |
38 | 40 |
uint8_t bus_model; |
39 | 41 |
uint8_t pad; |
42 |
int bfd_mach; |
|
40 | 43 |
void (*init_proc)(CPUPPCState *env); |
41 | 44 |
}; |
42 | 45 |
|
... | ... | |
2163 | 2166 |
#define POWERPC_MMU_401 (POWERPC_MMU_REAL_4xx) |
2164 | 2167 |
#define POWERPC_EXCP_401 (POWERPC_EXCP_40x) |
2165 | 2168 |
#define POWERPC_INPUT_401 (PPC_FLAGS_INPUT_401) |
2169 |
#define POWERPC_BFDM_401 (bfd_mach_ppc_403) |
|
2166 | 2170 |
|
2167 | 2171 |
static void init_proc_401 (CPUPPCState *env) |
2168 | 2172 |
{ |
... | ... | |
2192 | 2196 |
#define POWERPC_MMU_401x2 (POWERPC_MMU_SOFT_4xx_Z) |
2193 | 2197 |
#define POWERPC_EXCP_401x2 (POWERPC_EXCP_40x) |
2194 | 2198 |
#define POWERPC_INPUT_401x2 (PPC_FLAGS_INPUT_401) |
2199 |
#define POWERPC_BFDM_401x2 (bfd_mach_ppc_403) |
|
2195 | 2200 |
|
2196 | 2201 |
static void init_proc_401x2 (CPUPPCState *env) |
2197 | 2202 |
{ |
... | ... | |
2227 | 2232 |
#define POWERPC_MMU_401x3 (POWERPC_MMU_SOFT_4xx_Z) |
2228 | 2233 |
#define POWERPC_EXCP_401x3 (POWERPC_EXCP_40x) |
2229 | 2234 |
#define POWERPC_INPUT_401x3 (PPC_FLAGS_INPUT_401) |
2235 |
#define POWERPC_BFDM_401x3 (bfd_mach_ppc_403) |
|
2230 | 2236 |
|
2231 | 2237 |
static void init_proc_401x2 (CPUPPCState *env) |
2232 | 2238 |
{ |
... | ... | |
2243 | 2249 |
#define POWERPC_MMU_IOP480 (POWERPC_MMU_SOFT_4xx_Z) |
2244 | 2250 |
#define POWERPC_EXCP_IOP480 (POWERPC_EXCP_40x) |
2245 | 2251 |
#define POWERPC_INPUT_IOP480 (PPC_FLAGS_INPUT_401) |
2252 |
#define POWERPC_BFDM_IOP480 (bfd_mach_ppc_403) |
|
2246 | 2253 |
|
2247 | 2254 |
static void init_proc_IOP480 (CPUPPCState *env) |
2248 | 2255 |
{ |
... | ... | |
2276 | 2283 |
#define POWERPC_MMU_403 (POWERPC_MMU_REAL_4xx) |
2277 | 2284 |
#define POWERPC_EXCP_403 (POWERPC_EXCP_40x) |
2278 | 2285 |
#define POWERPC_INPUT_403 (PPC_FLAGS_INPUT_401) |
2286 |
#define POWERPC_BFDM_403 (bfd_mach_ppc_403) |
|
2279 | 2287 |
|
2280 | 2288 |
static void init_proc_403 (CPUPPCState *env) |
2281 | 2289 |
{ |
... | ... | |
2295 | 2303 |
#define POWERPC_MMU_403GCX (POWERPC_MMU_SOFT_4xx_Z) |
2296 | 2304 |
#define POWERPC_EXCP_403GCX (POWERPC_EXCP_40x) |
2297 | 2305 |
#define POWERPC_INPUT_403GCX (PPC_FLAGS_INPUT_401) |
2306 |
#define POWERPC_BFDM_403GCX (bfd_mach_ppc_403) |
|
2298 | 2307 |
|
2299 | 2308 |
static void init_proc_403GCX (CPUPPCState *env) |
2300 | 2309 |
{ |
... | ... | |
2330 | 2339 |
#define POWERPC_MMU_405 (POWERPC_MMU_SOFT_4xx) |
2331 | 2340 |
#define POWERPC_EXCP_405 (POWERPC_EXCP_40x) |
2332 | 2341 |
#define POWERPC_INPUT_405 (PPC_FLAGS_INPUT_405) |
2342 |
#define POWERPC_BFDM_405 (bfd_mach_ppc_403) |
|
2333 | 2343 |
|
2334 | 2344 |
static void init_proc_405 (CPUPPCState *env) |
2335 | 2345 |
{ |
... | ... | |
2364 | 2374 |
#define POWERPC_MMU_440EP (POWERPC_MMU_BOOKE) |
2365 | 2375 |
#define POWERPC_EXCP_440EP (POWERPC_EXCP_BOOKE) |
2366 | 2376 |
#define POWERPC_INPUT_440EP (PPC_FLAGS_INPUT_BookE) |
2377 |
#define POWERPC_BFDM_440EP (bfd_mach_ppc_403) |
|
2367 | 2378 |
|
2368 | 2379 |
static void init_proc_440EP (CPUPPCState *env) |
2369 | 2380 |
{ |
... | ... | |
2403 | 2414 |
#define POWERPC_MMU_440GP (POWERPC_MMU_BOOKE) |
2404 | 2415 |
#define POWERPC_EXCP_440GP (POWERPC_EXCP_BOOKE) |
2405 | 2416 |
#define POWERPC_INPUT_440GP (PPC_FLAGS_INPUT_BookE) |
2417 |
#define POWERPC_BFDM_440GP (bfd_mach_ppc_403) |
|
2406 | 2418 |
|
2407 | 2419 |
static void init_proc_440GP (CPUPPCState *env) |
2408 | 2420 |
{ |
... | ... | |
2427 | 2439 |
#define POWERPC_MMU_440x4 (POWERPC_MMU_BOOKE) |
2428 | 2440 |
#define POWERPC_EXCP_440x4 (POWERPC_EXCP_BOOKE) |
2429 | 2441 |
#define POWERPC_INPUT_440x4 (PPC_FLAGS_INPUT_BookE) |
2442 |
#define POWERPC_BFDM_440x4 (bfd_mach_ppc_403) |
|
2430 | 2443 |
|
2431 | 2444 |
static void init_proc_440x4 (CPUPPCState *env) |
2432 | 2445 |
{ |
... | ... | |
2451 | 2464 |
#define POWERPC_MMU_440x5 (POWERPC_MMU_BOOKE) |
2452 | 2465 |
#define POWERPC_EXCP_440x5 (POWERPC_EXCP_BOOKE) |
2453 | 2466 |
#define POWERPC_INPUT_440x5 (PPC_FLAGS_INPUT_BookE) |
2467 |
#define POWERPC_BFDM_440x5 (bfd_mach_ppc_403) |
|
2454 | 2468 |
|
2455 | 2469 |
static void init_proc_440x5 (CPUPPCState *env) |
2456 | 2470 |
{ |
... | ... | |
2491 | 2505 |
#define POWERPC_MMU_460 (POWERPC_MMU_BOOKE) |
2492 | 2506 |
#define POWERPC_EXCP_460 (POWERPC_EXCP_BOOKE) |
2493 | 2507 |
#define POWERPC_INPUT_460 (PPC_FLAGS_INPUT_BookE) |
2508 |
#define POWERPC_BFDM_460 (bfd_mach_ppc_403) |
|
2494 | 2509 |
|
2495 | 2510 |
static void init_proc_460 (CPUPPCState *env) |
2496 | 2511 |
{ |
... | ... | |
2510 | 2525 |
#define POWERPC_MMU_460F (POWERPC_MMU_BOOKE) |
2511 | 2526 |
#define POWERPC_EXCP_460F (POWERPC_EXCP_BOOKE) |
2512 | 2527 |
#define POWERPC_INPUT_460F (PPC_FLAGS_INPUT_BookE) |
2528 |
#define POWERPC_BFDM_460F (bfd_mach_ppc_403) |
|
2513 | 2529 |
|
2514 | 2530 |
static void init_proc_460 (CPUPPCState *env) |
2515 | 2531 |
{ |
... | ... | |
2558 | 2574 |
#define POWERPC_MMU_BookE (POWERPC_MMU_BOOKE) |
2559 | 2575 |
#define POWERPC_EXCP_BookE (POWERPC_EXCP_BOOKE) |
2560 | 2576 |
#define POWERPC_INPUT_BookE (PPC_FLAGS_INPUT_BookE) |
2577 |
#define POWERPC_BFDM_BookE (bfd_mach_ppc_403) |
|
2561 | 2578 |
|
2562 | 2579 |
static void init_proc_BookE (CPUPPCState *env) |
2563 | 2580 |
{ |
... | ... | |
2581 | 2598 |
#define POWERPC_MMU_e500 (POWERPC_MMU_SOFT_4xx) |
2582 | 2599 |
#define POWERPC_EXCP_e500 (POWERPC_EXCP_40x) |
2583 | 2600 |
#define POWERPC_INPUT_e500 (PPC_FLAGS_INPUT_BookE) |
2601 |
#define POWERPC_BFDM_e500 (bfd_mach_ppc_403) |
|
2584 | 2602 |
|
2585 | 2603 |
static void init_proc_e500 (CPUPPCState *env) |
2586 | 2604 |
{ |
... | ... | |
2623 | 2641 |
//#define POWERPC_MMU_601 (POWERPC_MMU_601) |
2624 | 2642 |
//#define POWERPC_EXCP_601 (POWERPC_EXCP_601) |
2625 | 2643 |
#define POWERPC_INPUT_601 (PPC_FLAGS_INPUT_6xx) |
2644 |
#define POWERPC_BFDM_601 (bfd_mach_ppc_601) |
|
2626 | 2645 |
|
2627 | 2646 |
static void init_proc_601 (CPUPPCState *env) |
2628 | 2647 |
{ |
... | ... | |
2671 | 2690 |
#define POWERPC_MMU_602 (POWERPC_MMU_SOFT_6xx) |
2672 | 2691 |
//#define POWERPC_EXCP_602 (POWERPC_EXCP_602) |
2673 | 2692 |
#define POWERPC_INPUT_602 (PPC_FLAGS_INPUT_6xx) |
2693 |
#define POWERPC_BFDM_602 (bfd_mach_ppc_602) |
|
2674 | 2694 |
|
2675 | 2695 |
static void init_proc_602 (CPUPPCState *env) |
2676 | 2696 |
{ |
... | ... | |
2702 | 2722 |
#define POWERPC_MMU_603 (POWERPC_MMU_SOFT_6xx) |
2703 | 2723 |
//#define POWERPC_EXCP_603 (POWERPC_EXCP_603) |
2704 | 2724 |
#define POWERPC_INPUT_603 (PPC_FLAGS_INPUT_6xx) |
2725 |
#define POWERPC_BFDM_603 (bfd_mach_ppc_603) |
|
2705 | 2726 |
|
2706 | 2727 |
static void init_proc_603 (CPUPPCState *env) |
2707 | 2728 |
{ |
... | ... | |
2733 | 2754 |
#define POWERPC_MMU_603E (POWERPC_MMU_SOFT_6xx) |
2734 | 2755 |
//#define POWERPC_EXCP_603E (POWERPC_EXCP_603E) |
2735 | 2756 |
#define POWERPC_INPUT_603E (PPC_FLAGS_INPUT_6xx) |
2757 |
#define POWERPC_BFDM_603E (bfd_mach_ppc_ec603e) |
|
2736 | 2758 |
|
2737 | 2759 |
static void init_proc_603E (CPUPPCState *env) |
2738 | 2760 |
{ |
... | ... | |
2769 | 2791 |
#define POWERPC_MMU_G2 (POWERPC_MMU_SOFT_6xx) |
2770 | 2792 |
//#define POWERPC_EXCP_G2 (POWERPC_EXCP_G2) |
2771 | 2793 |
#define POWERPC_INPUT_G2 (PPC_FLAGS_INPUT_6xx) |
2794 |
#define POWERPC_BFDM_G2 (bfd_mach_ppc_ec603e) |
|
2772 | 2795 |
|
2773 | 2796 |
static void init_proc_G2 (CPUPPCState *env) |
2774 | 2797 |
{ |
... | ... | |
2807 | 2830 |
#define POWERPC_MMU_G2LE (POWERPC_MMU_SOFT_6xx) |
2808 | 2831 |
#define POWERPC_EXCP_G2LE (POWERPC_EXCP_G2) |
2809 | 2832 |
#define POWERPC_INPUT_G2LE (PPC_FLAGS_INPUT_6xx) |
2833 |
#define POWERPC_BFDM_G2LE (bfd_mach_ppc_ec603e) |
|
2810 | 2834 |
|
2811 | 2835 |
static void init_proc_G2LE (CPUPPCState *env) |
2812 | 2836 |
{ |
... | ... | |
2845 | 2869 |
#define POWERPC_MMU_604 (POWERPC_MMU_32B) |
2846 | 2870 |
//#define POWERPC_EXCP_604 (POWERPC_EXCP_604) |
2847 | 2871 |
#define POWERPC_INPUT_604 (PPC_FLAGS_INPUT_6xx) |
2872 |
#define POWERPC_BFDM_604 (bfd_mach_ppc_604) |
|
2848 | 2873 |
|
2849 | 2874 |
static void init_proc_604 (CPUPPCState *env) |
2850 | 2875 |
{ |
... | ... | |
2875 | 2900 |
#define POWERPC_MMU_7x0 (POWERPC_MMU_32B) |
2876 | 2901 |
//#define POWERPC_EXCP_7x0 (POWERPC_EXCP_7x0) |
2877 | 2902 |
#define POWERPC_INPUT_7x0 (PPC_FLAGS_INPUT_6xx) |
2903 |
#define POWERPC_BFDM_7x0 (bfd_mach_ppc_750) |
|
2878 | 2904 |
|
2879 | 2905 |
static void init_proc_7x0 (CPUPPCState *env) |
2880 | 2906 |
{ |
... | ... | |
2907 | 2933 |
#define POWERPC_MMU_750fx (POWERPC_MMU_32B) |
2908 | 2934 |
#define POWERPC_EXCP_750fx (POWERPC_EXCP_7x0) |
2909 | 2935 |
#define POWERPC_INPUT_750fx (PPC_FLAGS_INPUT_6xx) |
2936 |
#define POWERPC_BFDM_750fx (bfd_mach_ppc_750) |
|
2910 | 2937 |
|
2911 | 2938 |
static void init_proc_750fx (CPUPPCState *env) |
2912 | 2939 |
{ |
... | ... | |
2946 | 2973 |
#define POWERPC_MMU_7x5 (POWERPC_MMU_SOFT_6xx) |
2947 | 2974 |
//#define POWERPC_EXCP_7x5 (POWERPC_EXCP_7x5) |
2948 | 2975 |
#define POWERPC_INPUT_7x5 (PPC_FLAGS_INPUT_6xx) |
2976 |
#define POWERPC_BFDM_7x5 (bfd_mach_ppc_750) |
|
2949 | 2977 |
|
2950 | 2978 |
static void init_proc_7x5 (CPUPPCState *env) |
2951 | 2979 |
{ |
... | ... | |
2996 | 3024 |
#define POWERPC_MMU_7400 (POWERPC_MMU_32B) |
2997 | 3025 |
#define POWERPC_EXCP_7400 (POWERPC_EXCP_74xx) |
2998 | 3026 |
#define POWERPC_INPUT_7400 (PPC_FLAGS_INPUT_6xx) |
3027 |
#define POWERPC_BFDM_7400 (bfd_mach_ppc_7400) |
|
2999 | 3028 |
|
3000 | 3029 |
static void init_proc_7400 (CPUPPCState *env) |
3001 | 3030 |
{ |
... | ... | |
3021 | 3050 |
#define POWERPC_MMU_7410 (POWERPC_MMU_32B) |
3022 | 3051 |
#define POWERPC_EXCP_7410 (POWERPC_EXCP_74xx) |
3023 | 3052 |
#define POWERPC_INPUT_7410 (PPC_FLAGS_INPUT_6xx) |
3053 |
#define POWERPC_BFDM_7410 (bfd_mach_ppc_7400) |
|
3024 | 3054 |
|
3025 | 3055 |
static void init_proc_7410 (CPUPPCState *env) |
3026 | 3056 |
{ |
... | ... | |
3059 | 3089 |
#define POWERPC_MMU_7440 (POWERPC_MMU_SOFT_74xx) |
3060 | 3090 |
#define POWERPC_EXCP_7440 (POWERPC_EXCP_74xx) |
3061 | 3091 |
#define POWERPC_INPUT_7440 (PPC_FLAGS_INPUT_6xx) |
3092 |
#define POWERPC_BFDM_7440 (bfd_mach_ppc_7400) |
|
3062 | 3093 |
|
3063 | 3094 |
static void init_proc_7440 (CPUPPCState *env) |
3064 | 3095 |
{ |
... | ... | |
3120 | 3151 |
#define POWERPC_MMU_7450 (POWERPC_MMU_SOFT_74xx) |
3121 | 3152 |
#define POWERPC_EXCP_7450 (POWERPC_EXCP_74xx) |
3122 | 3153 |
#define POWERPC_INPUT_7450 (PPC_FLAGS_INPUT_6xx) |
3154 |
#define POWERPC_BFDM_7450 (bfd_mach_ppc_7400) |
|
3123 | 3155 |
|
3124 | 3156 |
static void init_proc_7450 (CPUPPCState *env) |
3125 | 3157 |
{ |
... | ... | |
3183 | 3215 |
#define POWERPC_MMU_7445 (POWERPC_MMU_SOFT_74xx) |
3184 | 3216 |
#define POWERPC_EXCP_7445 (POWERPC_EXCP_74xx) |
3185 | 3217 |
#define POWERPC_INPUT_7445 (PPC_FLAGS_INPUT_6xx) |
3218 |
#define POWERPC_BFDM_7445 (bfd_mach_ppc_7400) |
|
3186 | 3219 |
|
3187 | 3220 |
static void init_proc_7445 (CPUPPCState *env) |
3188 | 3221 |
{ |
... | ... | |
3278 | 3311 |
#define POWERPC_MMU_7455 (POWERPC_MMU_SOFT_74xx) |
3279 | 3312 |
#define POWERPC_EXCP_7455 (POWERPC_EXCP_74xx) |
3280 | 3313 |
#define POWERPC_INPUT_7455 (PPC_FLAGS_INPUT_6xx) |
3314 |
#define POWERPC_BFDM_7455 (bfd_mach_ppc_7400) |
|
3281 | 3315 |
|
3282 | 3316 |
static void init_proc_7455 (CPUPPCState *env) |
3283 | 3317 |
{ |
... | ... | |
3375 | 3409 |
#define POWERPC_MMU_970 (POWERPC_MMU_64BRIDGE) |
3376 | 3410 |
//#define POWERPC_EXCP_970 (POWERPC_EXCP_970) |
3377 | 3411 |
#define POWERPC_INPUT_970 (PPC_FLAGS_INPUT_970) |
3412 |
#define POWERPC_BFDM_970 (bfd_mach_ppc64) |
|
3378 | 3413 |
|
3379 | 3414 |
static void init_proc_970 (CPUPPCState *env) |
3380 | 3415 |
{ |
... | ... | |
3416 | 3451 |
#define POWERPC_MMU_970FX (POWERPC_MMU_64BRIDGE) |
3417 | 3452 |
#define POWERPC_EXCP_970FX (POWERPC_EXCP_970) |
3418 | 3453 |
#define POWERPC_INPUT_970FX (PPC_FLAGS_INPUT_970) |
3454 |
#define POWERPC_BFDM_970FX (bfd_mach_ppc64) |
|
3419 | 3455 |
|
3420 | 3456 |
static void init_proc_970FX (CPUPPCState *env) |
3421 | 3457 |
{ |
... | ... | |
3457 | 3493 |
#define POWERPC_MMU_970GX (POWERPC_MMU_64BRIDGE) |
3458 | 3494 |
#define POWERPC_EXCP_970GX (POWERPC_EXCP_970) |
3459 | 3495 |
#define POWERPC_INPUT_970GX (PPC_FLAGS_INPUT_970) |
3496 |
#define POWERPC_BFDM_970GX (bfd_mach_ppc64) |
|
3460 | 3497 |
|
3461 | 3498 |
static void init_proc_970GX (CPUPPCState *env) |
3462 | 3499 |
{ |
... | ... | |
3498 | 3535 |
#define POWERPC_MMU_620 (POWERPC_MMU_64B) |
3499 | 3536 |
#define POWERPC_EXCP_620 (POWERPC_EXCP_970) |
3500 | 3537 |
#define POWERPC_INPUT_620 (PPC_FLAGS_INPUT_970) |
3538 |
#define POWERPC_BFDM_620 (bfd_mach_ppc64) |
|
3501 | 3539 |
|
3502 | 3540 |
static void init_proc_620 (CPUPPCState *env) |
3503 | 3541 |
{ |
... | ... | |
3527 | 3565 |
#define POWERPC_EXCP_PPC32 POWERPC_EXCP_604 |
3528 | 3566 |
#define POWERPC_INPUT_PPC32 POWERPC_INPUT_604 |
3529 | 3567 |
#define init_proc_PPC32 init_proc_604 |
3568 |
#define POWERPC_BFDM_PPC32 POWERPC_BFDM_604 |
|
3530 | 3569 |
|
3531 | 3570 |
/* Default 64 bits PowerPC target will be 970 FX */ |
3532 | 3571 |
#define CPU_POWERPC_PPC64 CPU_POWERPC_970FX |
... | ... | |
3536 | 3575 |
#define POWERPC_EXCP_PPC64 POWERPC_EXCP_970FX |
3537 | 3576 |
#define POWERPC_INPUT_PPC64 POWERPC_INPUT_970FX |
3538 | 3577 |
#define init_proc_PPC64 init_proc_970FX |
3578 |
#define POWERPC_BFDM_PPC64 POWERPC_BFDM_970FX |
|
3539 | 3579 |
|
3540 | 3580 |
/* Default PowerPC target will be PowerPC 32 */ |
3541 | 3581 |
#if defined (TARGET_PPC64) && 0 // XXX: TODO |
... | ... | |
3546 | 3586 |
#define POWERPC_EXCP_DEFAULT POWERPC_EXCP_PPC64 |
3547 | 3587 |
#define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC64 |
3548 | 3588 |
#define init_proc_DEFAULT init_proc_PPC64 |
3589 |
#define POWERPC_BFDM_DEFAULT POWERPC_BFDM_PPC64 |
|
3549 | 3590 |
#else |
3550 | 3591 |
#define CPU_POWERPC_DEFAULT CPU_POWERPC_PPC32 |
3551 | 3592 |
#define POWERPC_INSNS_DEFAULT POWERPC_INSNS_PPC32 |
... | ... | |
3554 | 3595 |
#define POWERPC_EXCP_DEFAULT POWERPC_EXCP_PPC32 |
3555 | 3596 |
#define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC32 |
3556 | 3597 |
#define init_proc_DEFAULT init_proc_PPC32 |
3598 |
#define POWERPC_BFDM_DEFAULT POWERPC_BFDM_PPC32 |
|
3557 | 3599 |
#endif |
3558 | 3600 |
|
3559 | 3601 |
/*****************************************************************************/ |
... | ... | |
4048 | 4090 |
.mmu_model = glue(POWERPC_MMU_,_type), \ |
4049 | 4091 |
.excp_model = glue(POWERPC_EXCP_,_type), \ |
4050 | 4092 |
.bus_model = glue(POWERPC_INPUT_,_type), \ |
4093 |
.bfd_mach = glue(POWERPC_BFDM_,_type), \ |
|
4051 | 4094 |
.init_proc = &glue(init_proc_,_type), \ |
4052 | 4095 |
} |
4053 | 4096 |
|
... | ... | |
5332 | 5375 |
env->mmu_model = def->mmu_model; |
5333 | 5376 |
env->excp_model = def->excp_model; |
5334 | 5377 |
env->bus_model = def->bus_model; |
5378 |
env->bfd_mach = def->bfd_mach; |
|
5335 | 5379 |
if (create_ppc_opcodes(env, def) < 0) |
5336 | 5380 |
return -1; |
5337 | 5381 |
init_ppc_proc(env, def); |
Also available in: Unified diff