Commit 2f462816ac343a804d51e157dad6b5d91426d3e1
1 parent
e494ead5
Implement power-management for all defined PowerPC CPUs.
Fix PowerPC 970MP definition. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3440 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
174 additions
and
30 deletions
target-ppc/helper_regs.h
@@ -82,7 +82,7 @@ static always_inline void hreg_compute_hflags (CPUPPCState *env) | @@ -82,7 +82,7 @@ static always_inline void hreg_compute_hflags (CPUPPCState *env) | ||
82 | 82 | ||
83 | static always_inline int hreg_store_msr (CPUPPCState *env, target_ulong value) | 83 | static always_inline int hreg_store_msr (CPUPPCState *env, target_ulong value) |
84 | { | 84 | { |
85 | - int enter_pm, excp; | 85 | + int excp; |
86 | 86 | ||
87 | excp = 0; | 87 | excp = 0; |
88 | value &= env->msr_mask; | 88 | value &= env->msr_mask; |
@@ -106,30 +106,9 @@ static always_inline int hreg_store_msr (CPUPPCState *env, target_ulong value) | @@ -106,30 +106,9 @@ static always_inline int hreg_store_msr (CPUPPCState *env, target_ulong value) | ||
106 | #endif | 106 | #endif |
107 | env->msr = value; | 107 | env->msr = value; |
108 | hreg_compute_hflags(env); | 108 | hreg_compute_hflags(env); |
109 | - enter_pm = 0; | ||
110 | #if !defined (CONFIG_USER_ONLY) | 109 | #if !defined (CONFIG_USER_ONLY) |
111 | if (unlikely(msr_pow == 1)) { | 110 | if (unlikely(msr_pow == 1)) { |
112 | - switch (env->excp_model) { | ||
113 | - case POWERPC_EXCP_603: | ||
114 | - case POWERPC_EXCP_603E: | ||
115 | - case POWERPC_EXCP_G2: | ||
116 | - /* Don't handle SLEEP mode: we should disable all clocks... | ||
117 | - * No dynamic power-management. | ||
118 | - */ | ||
119 | - if ((env->spr[SPR_HID0] & 0x00C00000) != 0) | ||
120 | - enter_pm = 1; | ||
121 | - break; | ||
122 | - case POWERPC_EXCP_604: | ||
123 | - enter_pm = 1; | ||
124 | - break; | ||
125 | - case POWERPC_EXCP_7x0: | ||
126 | - if ((env->spr[SPR_HID0] & 0x00E00000) != 0) | ||
127 | - enter_pm = 1; | ||
128 | - break; | ||
129 | - default: | ||
130 | - break; | ||
131 | - } | ||
132 | - if (enter_pm) { | 111 | + if ((*env->check_pow)(env)) { |
133 | env->halted = 1; | 112 | env->halted = 1; |
134 | excp = EXCP_HALTED; | 113 | excp = EXCP_HALTED; |
135 | } | 114 | } |
target-ppc/translate_init.c
@@ -42,6 +42,7 @@ struct ppc_def_t { | @@ -42,6 +42,7 @@ struct ppc_def_t { | ||
42 | uint32_t flags; | 42 | uint32_t flags; |
43 | int bfd_mach; | 43 | int bfd_mach; |
44 | void (*init_proc)(CPUPPCState *env); | 44 | void (*init_proc)(CPUPPCState *env); |
45 | + int (*check_pow)(CPUPPCState *env); | ||
45 | }; | 46 | }; |
46 | 47 | ||
47 | /* For user-mode emulation, we don't emulate any IRQ controller */ | 48 | /* For user-mode emulation, we don't emulate any IRQ controller */ |
@@ -2606,6 +2607,26 @@ static void init_excp_970 (CPUPPCState *env) | @@ -2606,6 +2607,26 @@ static void init_excp_970 (CPUPPCState *env) | ||
2606 | #endif | 2607 | #endif |
2607 | 2608 | ||
2608 | /*****************************************************************************/ | 2609 | /*****************************************************************************/ |
2610 | +/* Power management enable checks */ | ||
2611 | +static int check_pow_none (CPUPPCState *env) | ||
2612 | +{ | ||
2613 | + return 0; | ||
2614 | +} | ||
2615 | + | ||
2616 | +static int check_pow_nocheck (CPUPPCState *env) | ||
2617 | +{ | ||
2618 | + return 1; | ||
2619 | +} | ||
2620 | + | ||
2621 | +static int check_pow_hid0 (CPUPPCState *env) | ||
2622 | +{ | ||
2623 | + if (env->spr[SPR_HID0] & 0x00E00000) | ||
2624 | + return 1; | ||
2625 | + | ||
2626 | + return 0; | ||
2627 | +} | ||
2628 | + | ||
2629 | +/*****************************************************************************/ | ||
2609 | /* PowerPC implementations definitions */ | 2630 | /* PowerPC implementations definitions */ |
2610 | 2631 | ||
2611 | /* PowerPC 40x instruction set */ | 2632 | /* PowerPC 40x instruction set */ |
@@ -2621,6 +2642,7 @@ static void init_excp_970 (CPUPPCState *env) | @@ -2621,6 +2642,7 @@ static void init_excp_970 (CPUPPCState *env) | ||
2621 | #define POWERPC_INPUT_401 (PPC_FLAGS_INPUT_401) | 2642 | #define POWERPC_INPUT_401 (PPC_FLAGS_INPUT_401) |
2622 | #define POWERPC_BFDM_401 (bfd_mach_ppc_403) | 2643 | #define POWERPC_BFDM_401 (bfd_mach_ppc_403) |
2623 | #define POWERPC_FLAG_401 (POWERPC_FLAG_CE | POWERPC_FLAG_DE) | 2644 | #define POWERPC_FLAG_401 (POWERPC_FLAG_CE | POWERPC_FLAG_DE) |
2645 | +#define check_pow_401 check_pow_nocheck | ||
2624 | 2646 | ||
2625 | static void init_proc_401 (CPUPPCState *env) | 2647 | static void init_proc_401 (CPUPPCState *env) |
2626 | { | 2648 | { |
@@ -2646,6 +2668,7 @@ static void init_proc_401 (CPUPPCState *env) | @@ -2646,6 +2668,7 @@ static void init_proc_401 (CPUPPCState *env) | ||
2646 | #define POWERPC_INPUT_401x2 (PPC_FLAGS_INPUT_401) | 2668 | #define POWERPC_INPUT_401x2 (PPC_FLAGS_INPUT_401) |
2647 | #define POWERPC_BFDM_401x2 (bfd_mach_ppc_403) | 2669 | #define POWERPC_BFDM_401x2 (bfd_mach_ppc_403) |
2648 | #define POWERPC_FLAG_401x2 (POWERPC_FLAG_CE | POWERPC_FLAG_DE) | 2670 | #define POWERPC_FLAG_401x2 (POWERPC_FLAG_CE | POWERPC_FLAG_DE) |
2671 | +#define check_pow_401x2 check_pow_nocheck | ||
2649 | 2672 | ||
2650 | static void init_proc_401x2 (CPUPPCState *env) | 2673 | static void init_proc_401x2 (CPUPPCState *env) |
2651 | { | 2674 | { |
@@ -2678,6 +2701,7 @@ static void init_proc_401x2 (CPUPPCState *env) | @@ -2678,6 +2701,7 @@ static void init_proc_401x2 (CPUPPCState *env) | ||
2678 | #define POWERPC_INPUT_401x3 (PPC_FLAGS_INPUT_401) | 2701 | #define POWERPC_INPUT_401x3 (PPC_FLAGS_INPUT_401) |
2679 | #define POWERPC_BFDM_401x3 (bfd_mach_ppc_403) | 2702 | #define POWERPC_BFDM_401x3 (bfd_mach_ppc_403) |
2680 | #define POWERPC_FLAG_401x3 (POWERPC_FLAG_CE | POWERPC_FLAG_DE) | 2703 | #define POWERPC_FLAG_401x3 (POWERPC_FLAG_CE | POWERPC_FLAG_DE) |
2704 | +#define check_pow_401x3 check_pow_nocheck | ||
2681 | 2705 | ||
2682 | __attribute__ (( unused )) | 2706 | __attribute__ (( unused )) |
2683 | static void init_proc_401x3 (CPUPPCState *env) | 2707 | static void init_proc_401x3 (CPUPPCState *env) |
@@ -2706,6 +2730,7 @@ static void init_proc_401x3 (CPUPPCState *env) | @@ -2706,6 +2730,7 @@ static void init_proc_401x3 (CPUPPCState *env) | ||
2706 | #define POWERPC_INPUT_IOP480 (PPC_FLAGS_INPUT_401) | 2730 | #define POWERPC_INPUT_IOP480 (PPC_FLAGS_INPUT_401) |
2707 | #define POWERPC_BFDM_IOP480 (bfd_mach_ppc_403) | 2731 | #define POWERPC_BFDM_IOP480 (bfd_mach_ppc_403) |
2708 | #define POWERPC_FLAG_IOP480 (POWERPC_FLAG_CE | POWERPC_FLAG_DE) | 2732 | #define POWERPC_FLAG_IOP480 (POWERPC_FLAG_CE | POWERPC_FLAG_DE) |
2733 | +#define check_pow_IOP480 check_pow_nocheck | ||
2709 | 2734 | ||
2710 | static void init_proc_IOP480 (CPUPPCState *env) | 2735 | static void init_proc_IOP480 (CPUPPCState *env) |
2711 | { | 2736 | { |
@@ -2736,6 +2761,7 @@ static void init_proc_IOP480 (CPUPPCState *env) | @@ -2736,6 +2761,7 @@ static void init_proc_IOP480 (CPUPPCState *env) | ||
2736 | #define POWERPC_INPUT_403 (PPC_FLAGS_INPUT_401) | 2761 | #define POWERPC_INPUT_403 (PPC_FLAGS_INPUT_401) |
2737 | #define POWERPC_BFDM_403 (bfd_mach_ppc_403) | 2762 | #define POWERPC_BFDM_403 (bfd_mach_ppc_403) |
2738 | #define POWERPC_FLAG_403 (POWERPC_FLAG_CE | POWERPC_FLAG_PX) | 2763 | #define POWERPC_FLAG_403 (POWERPC_FLAG_CE | POWERPC_FLAG_PX) |
2764 | +#define check_pow_403 check_pow_nocheck | ||
2739 | 2765 | ||
2740 | static void init_proc_403 (CPUPPCState *env) | 2766 | static void init_proc_403 (CPUPPCState *env) |
2741 | { | 2767 | { |
@@ -2765,6 +2791,7 @@ static void init_proc_403 (CPUPPCState *env) | @@ -2765,6 +2791,7 @@ static void init_proc_403 (CPUPPCState *env) | ||
2765 | #define POWERPC_INPUT_403GCX (PPC_FLAGS_INPUT_401) | 2791 | #define POWERPC_INPUT_403GCX (PPC_FLAGS_INPUT_401) |
2766 | #define POWERPC_BFDM_403GCX (bfd_mach_ppc_403) | 2792 | #define POWERPC_BFDM_403GCX (bfd_mach_ppc_403) |
2767 | #define POWERPC_FLAG_403GCX (POWERPC_FLAG_CE | POWERPC_FLAG_PX) | 2793 | #define POWERPC_FLAG_403GCX (POWERPC_FLAG_CE | POWERPC_FLAG_PX) |
2794 | +#define check_pow_403GCX check_pow_nocheck | ||
2768 | 2795 | ||
2769 | static void init_proc_403GCX (CPUPPCState *env) | 2796 | static void init_proc_403GCX (CPUPPCState *env) |
2770 | { | 2797 | { |
@@ -2810,6 +2837,7 @@ static void init_proc_403GCX (CPUPPCState *env) | @@ -2810,6 +2837,7 @@ static void init_proc_403GCX (CPUPPCState *env) | ||
2810 | #define POWERPC_BFDM_405 (bfd_mach_ppc_403) | 2837 | #define POWERPC_BFDM_405 (bfd_mach_ppc_403) |
2811 | #define POWERPC_FLAG_405 (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ | 2838 | #define POWERPC_FLAG_405 (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ |
2812 | POWERPC_FLAG_DE) | 2839 | POWERPC_FLAG_DE) |
2840 | +#define check_pow_405 check_pow_nocheck | ||
2813 | 2841 | ||
2814 | static void init_proc_405 (CPUPPCState *env) | 2842 | static void init_proc_405 (CPUPPCState *env) |
2815 | { | 2843 | { |
@@ -2853,6 +2881,7 @@ static void init_proc_405 (CPUPPCState *env) | @@ -2853,6 +2881,7 @@ static void init_proc_405 (CPUPPCState *env) | ||
2853 | #define POWERPC_BFDM_440EP (bfd_mach_ppc_403) | 2881 | #define POWERPC_BFDM_440EP (bfd_mach_ppc_403) |
2854 | #define POWERPC_FLAG_440EP (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ | 2882 | #define POWERPC_FLAG_440EP (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ |
2855 | POWERPC_FLAG_DE) | 2883 | POWERPC_FLAG_DE) |
2884 | +#define check_pow_440EP check_pow_nocheck | ||
2856 | 2885 | ||
2857 | static void init_proc_440EP (CPUPPCState *env) | 2886 | static void init_proc_440EP (CPUPPCState *env) |
2858 | { | 2887 | { |
@@ -2902,6 +2931,7 @@ static void init_proc_440EP (CPUPPCState *env) | @@ -2902,6 +2931,7 @@ static void init_proc_440EP (CPUPPCState *env) | ||
2902 | #define POWERPC_BFDM_440GP (bfd_mach_ppc_403) | 2931 | #define POWERPC_BFDM_440GP (bfd_mach_ppc_403) |
2903 | #define POWERPC_FLAG_440GP (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ | 2932 | #define POWERPC_FLAG_440GP (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ |
2904 | POWERPC_FLAG_DE) | 2933 | POWERPC_FLAG_DE) |
2934 | +#define check_pow_440GP check_pow_nocheck | ||
2905 | 2935 | ||
2906 | static void init_proc_440GP (CPUPPCState *env) | 2936 | static void init_proc_440GP (CPUPPCState *env) |
2907 | { | 2937 | { |
@@ -2933,6 +2963,7 @@ static void init_proc_440GP (CPUPPCState *env) | @@ -2933,6 +2963,7 @@ static void init_proc_440GP (CPUPPCState *env) | ||
2933 | #define POWERPC_BFDM_440x4 (bfd_mach_ppc_403) | 2963 | #define POWERPC_BFDM_440x4 (bfd_mach_ppc_403) |
2934 | #define POWERPC_FLAG_440x4 (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ | 2964 | #define POWERPC_FLAG_440x4 (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ |
2935 | POWERPC_FLAG_DE) | 2965 | POWERPC_FLAG_DE) |
2966 | +#define check_pow_440x4 check_pow_nocheck | ||
2936 | 2967 | ||
2937 | __attribute__ (( unused )) | 2968 | __attribute__ (( unused )) |
2938 | static void init_proc_440x4 (CPUPPCState *env) | 2969 | static void init_proc_440x4 (CPUPPCState *env) |
@@ -2965,6 +2996,7 @@ static void init_proc_440x4 (CPUPPCState *env) | @@ -2965,6 +2996,7 @@ static void init_proc_440x4 (CPUPPCState *env) | ||
2965 | #define POWERPC_BFDM_440x5 (bfd_mach_ppc_403) | 2996 | #define POWERPC_BFDM_440x5 (bfd_mach_ppc_403) |
2966 | #define POWERPC_FLAG_440x5 (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ | 2997 | #define POWERPC_FLAG_440x5 (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ |
2967 | POWERPC_FLAG_DE) | 2998 | POWERPC_FLAG_DE) |
2999 | +#define check_pow_440x5 check_pow_nocheck | ||
2968 | 3000 | ||
2969 | static void init_proc_440x5 (CPUPPCState *env) | 3001 | static void init_proc_440x5 (CPUPPCState *env) |
2970 | { | 3002 | { |
@@ -3014,6 +3046,7 @@ static void init_proc_440x5 (CPUPPCState *env) | @@ -3014,6 +3046,7 @@ static void init_proc_440x5 (CPUPPCState *env) | ||
3014 | #define POWERPC_BFDM_460 (bfd_mach_ppc_403) | 3046 | #define POWERPC_BFDM_460 (bfd_mach_ppc_403) |
3015 | #define POWERPC_FLAG_460 (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ | 3047 | #define POWERPC_FLAG_460 (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ |
3016 | POWERPC_FLAG_DE) | 3048 | POWERPC_FLAG_DE) |
3049 | +#define check_pow_460 check_pow_nocheck | ||
3017 | 3050 | ||
3018 | __attribute__ (( unused )) | 3051 | __attribute__ (( unused )) |
3019 | static void init_proc_460 (CPUPPCState *env) | 3052 | static void init_proc_460 (CPUPPCState *env) |
@@ -3072,6 +3105,7 @@ static void init_proc_460 (CPUPPCState *env) | @@ -3072,6 +3105,7 @@ static void init_proc_460 (CPUPPCState *env) | ||
3072 | #define POWERPC_BFDM_460F (bfd_mach_ppc_403) | 3105 | #define POWERPC_BFDM_460F (bfd_mach_ppc_403) |
3073 | #define POWERPC_FLAG_460F (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ | 3106 | #define POWERPC_FLAG_460F (POWERPC_FLAG_CE | POWERPC_FLAG_DWE | \ |
3074 | POWERPC_FLAG_DE) | 3107 | POWERPC_FLAG_DE) |
3108 | +#define check_pow_460F check_pow_nocheck | ||
3075 | 3109 | ||
3076 | __attribute__ (( unused )) | 3110 | __attribute__ (( unused )) |
3077 | static void init_proc_460F (CPUPPCState *env) | 3111 | static void init_proc_460F (CPUPPCState *env) |
@@ -3129,6 +3163,7 @@ static void init_proc_460F (CPUPPCState *env) | @@ -3129,6 +3163,7 @@ static void init_proc_460F (CPUPPCState *env) | ||
3129 | #define POWERPC_INPUT_BookE (PPC_FLAGS_INPUT_BookE) | 3163 | #define POWERPC_INPUT_BookE (PPC_FLAGS_INPUT_BookE) |
3130 | #define POWERPC_BFDM_BookE (bfd_mach_ppc_403) | 3164 | #define POWERPC_BFDM_BookE (bfd_mach_ppc_403) |
3131 | #define POWERPC_FLAG_BookE (POWERPC_FLAG_NONE) | 3165 | #define POWERPC_FLAG_BookE (POWERPC_FLAG_NONE) |
3166 | +#define check_pow_BookE check_pow_nocheck | ||
3132 | 3167 | ||
3133 | __attribute__ (( unused )) | 3168 | __attribute__ (( unused )) |
3134 | static void init_proc_BookE (CPUPPCState *env) | 3169 | static void init_proc_BookE (CPUPPCState *env) |
@@ -3152,6 +3187,7 @@ static void init_proc_BookE (CPUPPCState *env) | @@ -3152,6 +3187,7 @@ static void init_proc_BookE (CPUPPCState *env) | ||
3152 | #define POWERPC_INPUT_e500 (PPC_FLAGS_INPUT_BookE) | 3187 | #define POWERPC_INPUT_e500 (PPC_FLAGS_INPUT_BookE) |
3153 | #define POWERPC_BFDM_e500 (bfd_mach_ppc_403) | 3188 | #define POWERPC_BFDM_e500 (bfd_mach_ppc_403) |
3154 | #define POWERPC_FLAG_e500 (POWERPC_FLAG_SPE) | 3189 | #define POWERPC_FLAG_e500 (POWERPC_FLAG_SPE) |
3190 | +#define check_pow_e500 check_pow_hid0 | ||
3155 | 3191 | ||
3156 | __attribute__ (( unused )) | 3192 | __attribute__ (( unused )) |
3157 | static void init_proc_e500 (CPUPPCState *env) | 3193 | static void init_proc_e500 (CPUPPCState *env) |
@@ -3201,6 +3237,7 @@ static void init_proc_e500 (CPUPPCState *env) | @@ -3201,6 +3237,7 @@ static void init_proc_e500 (CPUPPCState *env) | ||
3201 | #define POWERPC_INPUT_601 (PPC_FLAGS_INPUT_6xx) | 3237 | #define POWERPC_INPUT_601 (PPC_FLAGS_INPUT_6xx) |
3202 | #define POWERPC_BFDM_601 (bfd_mach_ppc_601) | 3238 | #define POWERPC_BFDM_601 (bfd_mach_ppc_601) |
3203 | #define POWERPC_FLAG_601 (POWERPC_FLAG_SE) | 3239 | #define POWERPC_FLAG_601 (POWERPC_FLAG_SE) |
3240 | +#define check_pow_601 check_pow_none | ||
3204 | 3241 | ||
3205 | static void init_proc_601 (CPUPPCState *env) | 3242 | static void init_proc_601 (CPUPPCState *env) |
3206 | { | 3243 | { |
@@ -3257,6 +3294,7 @@ static void init_proc_601 (CPUPPCState *env) | @@ -3257,6 +3294,7 @@ static void init_proc_601 (CPUPPCState *env) | ||
3257 | #define POWERPC_BFDM_602 (bfd_mach_ppc_602) | 3294 | #define POWERPC_BFDM_602 (bfd_mach_ppc_602) |
3258 | #define POWERPC_FLAG_602 (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ | 3295 | #define POWERPC_FLAG_602 (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ |
3259 | POWERPC_FLAG_BE) | 3296 | POWERPC_FLAG_BE) |
3297 | +#define check_pow_602 check_pow_hid0 | ||
3260 | 3298 | ||
3261 | static void init_proc_602 (CPUPPCState *env) | 3299 | static void init_proc_602 (CPUPPCState *env) |
3262 | { | 3300 | { |
@@ -3294,6 +3332,7 @@ static void init_proc_602 (CPUPPCState *env) | @@ -3294,6 +3332,7 @@ static void init_proc_602 (CPUPPCState *env) | ||
3294 | #define POWERPC_BFDM_603 (bfd_mach_ppc_603) | 3332 | #define POWERPC_BFDM_603 (bfd_mach_ppc_603) |
3295 | #define POWERPC_FLAG_603 (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ | 3333 | #define POWERPC_FLAG_603 (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ |
3296 | POWERPC_FLAG_BE) | 3334 | POWERPC_FLAG_BE) |
3335 | +#define check_pow_603 check_pow_hid0 | ||
3297 | 3336 | ||
3298 | static void init_proc_603 (CPUPPCState *env) | 3337 | static void init_proc_603 (CPUPPCState *env) |
3299 | { | 3338 | { |
@@ -3331,6 +3370,7 @@ static void init_proc_603 (CPUPPCState *env) | @@ -3331,6 +3370,7 @@ static void init_proc_603 (CPUPPCState *env) | ||
3331 | #define POWERPC_BFDM_603E (bfd_mach_ppc_ec603e) | 3370 | #define POWERPC_BFDM_603E (bfd_mach_ppc_ec603e) |
3332 | #define POWERPC_FLAG_603E (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ | 3371 | #define POWERPC_FLAG_603E (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ |
3333 | POWERPC_FLAG_BE) | 3372 | POWERPC_FLAG_BE) |
3373 | +#define check_pow_603E check_pow_hid0 | ||
3334 | 3374 | ||
3335 | static void init_proc_603E (CPUPPCState *env) | 3375 | static void init_proc_603E (CPUPPCState *env) |
3336 | { | 3376 | { |
@@ -3373,6 +3413,7 @@ static void init_proc_603E (CPUPPCState *env) | @@ -3373,6 +3413,7 @@ static void init_proc_603E (CPUPPCState *env) | ||
3373 | #define POWERPC_BFDM_G2 (bfd_mach_ppc_ec603e) | 3413 | #define POWERPC_BFDM_G2 (bfd_mach_ppc_ec603e) |
3374 | #define POWERPC_FLAG_G2 (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ | 3414 | #define POWERPC_FLAG_G2 (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ |
3375 | POWERPC_FLAG_BE) | 3415 | POWERPC_FLAG_BE) |
3416 | +#define check_pow_G2 check_pow_hid0 | ||
3376 | 3417 | ||
3377 | static void init_proc_G2 (CPUPPCState *env) | 3418 | static void init_proc_G2 (CPUPPCState *env) |
3378 | { | 3419 | { |
@@ -3417,6 +3458,7 @@ static void init_proc_G2 (CPUPPCState *env) | @@ -3417,6 +3458,7 @@ static void init_proc_G2 (CPUPPCState *env) | ||
3417 | #define POWERPC_BFDM_G2LE (bfd_mach_ppc_ec603e) | 3458 | #define POWERPC_BFDM_G2LE (bfd_mach_ppc_ec603e) |
3418 | #define POWERPC_FLAG_G2LE (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ | 3459 | #define POWERPC_FLAG_G2LE (POWERPC_FLAG_TGPR | POWERPC_FLAG_SE | \ |
3419 | POWERPC_FLAG_BE) | 3460 | POWERPC_FLAG_BE) |
3461 | +#define check_pow_G2LE check_pow_hid0 | ||
3420 | 3462 | ||
3421 | static void init_proc_G2LE (CPUPPCState *env) | 3463 | static void init_proc_G2LE (CPUPPCState *env) |
3422 | { | 3464 | { |
@@ -3461,6 +3503,7 @@ static void init_proc_G2LE (CPUPPCState *env) | @@ -3461,6 +3503,7 @@ static void init_proc_G2LE (CPUPPCState *env) | ||
3461 | #define POWERPC_BFDM_604 (bfd_mach_ppc_604) | 3503 | #define POWERPC_BFDM_604 (bfd_mach_ppc_604) |
3462 | #define POWERPC_FLAG_604 (POWERPC_FLAG_SE | POWERPC_FLAG_BE | \ | 3504 | #define POWERPC_FLAG_604 (POWERPC_FLAG_SE | POWERPC_FLAG_BE | \ |
3463 | POWERPC_FLAG_PMM) | 3505 | POWERPC_FLAG_PMM) |
3506 | +#define check_pow_604 check_pow_nocheck | ||
3464 | 3507 | ||
3465 | static void init_proc_604 (CPUPPCState *env) | 3508 | static void init_proc_604 (CPUPPCState *env) |
3466 | { | 3509 | { |
@@ -3497,6 +3540,7 @@ static void init_proc_604 (CPUPPCState *env) | @@ -3497,6 +3540,7 @@ static void init_proc_604 (CPUPPCState *env) | ||
3497 | #define POWERPC_BFDM_7x0 (bfd_mach_ppc_750) | 3540 | #define POWERPC_BFDM_7x0 (bfd_mach_ppc_750) |
3498 | #define POWERPC_FLAG_7x0 (POWERPC_FLAG_SE | POWERPC_FLAG_BE | \ | 3541 | #define POWERPC_FLAG_7x0 (POWERPC_FLAG_SE | POWERPC_FLAG_BE | \ |
3499 | POWERPC_FLAG_PMM) | 3542 | POWERPC_FLAG_PMM) |
3543 | +#define check_pow_7x0 check_pow_hid0 | ||
3500 | 3544 | ||
3501 | static void init_proc_7x0 (CPUPPCState *env) | 3545 | static void init_proc_7x0 (CPUPPCState *env) |
3502 | { | 3546 | { |
@@ -3535,6 +3579,7 @@ static void init_proc_7x0 (CPUPPCState *env) | @@ -3535,6 +3579,7 @@ static void init_proc_7x0 (CPUPPCState *env) | ||
3535 | #define POWERPC_BFDM_750fx (bfd_mach_ppc_750) | 3579 | #define POWERPC_BFDM_750fx (bfd_mach_ppc_750) |
3536 | #define POWERPC_FLAG_750fx (POWERPC_FLAG_SE | POWERPC_FLAG_BE | \ | 3580 | #define POWERPC_FLAG_750fx (POWERPC_FLAG_SE | POWERPC_FLAG_BE | \ |
3537 | POWERPC_FLAG_PMM) | 3581 | POWERPC_FLAG_PMM) |
3582 | +#define check_pow_750fx check_pow_hid0 | ||
3538 | 3583 | ||
3539 | static void init_proc_750fx (CPUPPCState *env) | 3584 | static void init_proc_750fx (CPUPPCState *env) |
3540 | { | 3585 | { |
@@ -3580,6 +3625,7 @@ static void init_proc_750fx (CPUPPCState *env) | @@ -3580,6 +3625,7 @@ static void init_proc_750fx (CPUPPCState *env) | ||
3580 | #define POWERPC_BFDM_7x5 (bfd_mach_ppc_750) | 3625 | #define POWERPC_BFDM_7x5 (bfd_mach_ppc_750) |
3581 | #define POWERPC_FLAG_7x5 (POWERPC_FLAG_SE | POWERPC_FLAG_BE | \ | 3626 | #define POWERPC_FLAG_7x5 (POWERPC_FLAG_SE | POWERPC_FLAG_BE | \ |
3582 | POWERPC_FLAG_PMM) | 3627 | POWERPC_FLAG_PMM) |
3628 | +#define check_pow_7x5 check_pow_hid0 | ||
3583 | 3629 | ||
3584 | static void init_proc_7x5 (CPUPPCState *env) | 3630 | static void init_proc_7x5 (CPUPPCState *env) |
3585 | { | 3631 | { |
@@ -3640,6 +3686,7 @@ static void init_proc_7x5 (CPUPPCState *env) | @@ -3640,6 +3686,7 @@ static void init_proc_7x5 (CPUPPCState *env) | ||
3640 | #define POWERPC_BFDM_7400 (bfd_mach_ppc_7400) | 3686 | #define POWERPC_BFDM_7400 (bfd_mach_ppc_7400) |
3641 | #define POWERPC_FLAG_7400 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ | 3687 | #define POWERPC_FLAG_7400 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ |
3642 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) | 3688 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) |
3689 | +#define check_pow_7400 check_pow_hid0 | ||
3643 | 3690 | ||
3644 | static void init_proc_7400 (CPUPPCState *env) | 3691 | static void init_proc_7400 (CPUPPCState *env) |
3645 | { | 3692 | { |
@@ -3671,6 +3718,7 @@ static void init_proc_7400 (CPUPPCState *env) | @@ -3671,6 +3718,7 @@ static void init_proc_7400 (CPUPPCState *env) | ||
3671 | #define POWERPC_BFDM_7410 (bfd_mach_ppc_7400) | 3718 | #define POWERPC_BFDM_7410 (bfd_mach_ppc_7400) |
3672 | #define POWERPC_FLAG_7410 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ | 3719 | #define POWERPC_FLAG_7410 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ |
3673 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) | 3720 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) |
3721 | +#define check_pow_7410 check_pow_hid0 | ||
3674 | 3722 | ||
3675 | static void init_proc_7410 (CPUPPCState *env) | 3723 | static void init_proc_7410 (CPUPPCState *env) |
3676 | { | 3724 | { |
@@ -3714,6 +3762,7 @@ static void init_proc_7410 (CPUPPCState *env) | @@ -3714,6 +3762,7 @@ static void init_proc_7410 (CPUPPCState *env) | ||
3714 | #define POWERPC_BFDM_7440 (bfd_mach_ppc_7400) | 3762 | #define POWERPC_BFDM_7440 (bfd_mach_ppc_7400) |
3715 | #define POWERPC_FLAG_7440 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ | 3763 | #define POWERPC_FLAG_7440 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ |
3716 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) | 3764 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) |
3765 | +#define check_pow_7440 check_pow_hid0 | ||
3717 | 3766 | ||
3718 | __attribute__ (( unused )) | 3767 | __attribute__ (( unused )) |
3719 | static void init_proc_7440 (CPUPPCState *env) | 3768 | static void init_proc_7440 (CPUPPCState *env) |
@@ -3784,6 +3833,7 @@ static void init_proc_7440 (CPUPPCState *env) | @@ -3784,6 +3833,7 @@ static void init_proc_7440 (CPUPPCState *env) | ||
3784 | #define POWERPC_BFDM_7450 (bfd_mach_ppc_7400) | 3833 | #define POWERPC_BFDM_7450 (bfd_mach_ppc_7400) |
3785 | #define POWERPC_FLAG_7450 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ | 3834 | #define POWERPC_FLAG_7450 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ |
3786 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) | 3835 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) |
3836 | +#define check_pow_7450 check_pow_hid0 | ||
3787 | 3837 | ||
3788 | __attribute__ (( unused )) | 3838 | __attribute__ (( unused )) |
3789 | static void init_proc_7450 (CPUPPCState *env) | 3839 | static void init_proc_7450 (CPUPPCState *env) |
@@ -3856,6 +3906,7 @@ static void init_proc_7450 (CPUPPCState *env) | @@ -3856,6 +3906,7 @@ static void init_proc_7450 (CPUPPCState *env) | ||
3856 | #define POWERPC_BFDM_7445 (bfd_mach_ppc_7400) | 3906 | #define POWERPC_BFDM_7445 (bfd_mach_ppc_7400) |
3857 | #define POWERPC_FLAG_7445 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ | 3907 | #define POWERPC_FLAG_7445 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ |
3858 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) | 3908 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) |
3909 | +#define check_pow_7445 check_pow_hid0 | ||
3859 | 3910 | ||
3860 | __attribute__ (( unused )) | 3911 | __attribute__ (( unused )) |
3861 | static void init_proc_7445 (CPUPPCState *env) | 3912 | static void init_proc_7445 (CPUPPCState *env) |
@@ -3960,6 +4011,7 @@ static void init_proc_7445 (CPUPPCState *env) | @@ -3960,6 +4011,7 @@ static void init_proc_7445 (CPUPPCState *env) | ||
3960 | #define POWERPC_BFDM_7455 (bfd_mach_ppc_7400) | 4011 | #define POWERPC_BFDM_7455 (bfd_mach_ppc_7400) |
3961 | #define POWERPC_FLAG_7455 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ | 4012 | #define POWERPC_FLAG_7455 (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ |
3962 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) | 4013 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) |
4014 | +#define check_pow_7455 check_pow_hid0 | ||
3963 | 4015 | ||
3964 | __attribute__ (( unused )) | 4016 | __attribute__ (( unused )) |
3965 | static void init_proc_7455 (CPUPPCState *env) | 4017 | static void init_proc_7455 (CPUPPCState *env) |
@@ -4078,6 +4130,14 @@ static void init_proc_7455 (CPUPPCState *env) | @@ -4078,6 +4130,14 @@ static void init_proc_7455 (CPUPPCState *env) | ||
4078 | #define POWERPC970_HID5_INIT 0x00000000 | 4130 | #define POWERPC970_HID5_INIT 0x00000000 |
4079 | #endif | 4131 | #endif |
4080 | 4132 | ||
4133 | +static int check_pow_970 (CPUPPCState *env) | ||
4134 | +{ | ||
4135 | + if (env->spr[SPR_HID0] & 0x00600000) | ||
4136 | + return 1; | ||
4137 | + | ||
4138 | + return 0; | ||
4139 | +} | ||
4140 | + | ||
4081 | static void init_proc_970 (CPUPPCState *env) | 4141 | static void init_proc_970 (CPUPPCState *env) |
4082 | { | 4142 | { |
4083 | gen_spr_ne_601(env); | 4143 | gen_spr_ne_601(env); |
@@ -4147,6 +4207,14 @@ static void init_proc_970 (CPUPPCState *env) | @@ -4147,6 +4207,14 @@ static void init_proc_970 (CPUPPCState *env) | ||
4147 | #define POWERPC_FLAG_970FX (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ | 4207 | #define POWERPC_FLAG_970FX (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ |
4148 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) | 4208 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) |
4149 | 4209 | ||
4210 | +static int check_pow_970FX (CPUPPCState *env) | ||
4211 | +{ | ||
4212 | + if (env->spr[SPR_HID0] & 0x00600000) | ||
4213 | + return 1; | ||
4214 | + | ||
4215 | + return 0; | ||
4216 | +} | ||
4217 | + | ||
4150 | static void init_proc_970FX (CPUPPCState *env) | 4218 | static void init_proc_970FX (CPUPPCState *env) |
4151 | { | 4219 | { |
4152 | gen_spr_ne_601(env); | 4220 | gen_spr_ne_601(env); |
@@ -4216,6 +4284,14 @@ static void init_proc_970FX (CPUPPCState *env) | @@ -4216,6 +4284,14 @@ static void init_proc_970FX (CPUPPCState *env) | ||
4216 | #define POWERPC_FLAG_970GX (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ | 4284 | #define POWERPC_FLAG_970GX (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ |
4217 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) | 4285 | POWERPC_FLAG_BE | POWERPC_FLAG_PMM) |
4218 | 4286 | ||
4287 | +static int check_pow_970GX (CPUPPCState *env) | ||
4288 | +{ | ||
4289 | + if (env->spr[SPR_HID0] & 0x00600000) | ||
4290 | + return 1; | ||
4291 | + | ||
4292 | + return 0; | ||
4293 | +} | ||
4294 | + | ||
4219 | static void init_proc_970GX (CPUPPCState *env) | 4295 | static void init_proc_970GX (CPUPPCState *env) |
4220 | { | 4296 | { |
4221 | gen_spr_ne_601(env); | 4297 | gen_spr_ne_601(env); |
@@ -4273,6 +4349,83 @@ static void init_proc_970GX (CPUPPCState *env) | @@ -4273,6 +4349,83 @@ static void init_proc_970GX (CPUPPCState *env) | ||
4273 | ppc970_irq_init(env); | 4349 | ppc970_irq_init(env); |
4274 | } | 4350 | } |
4275 | 4351 | ||
4352 | +/* PowerPC 970 MP */ | ||
4353 | +#define POWERPC_INSNS_970MP (POWERPC_INSNS_WORK64 | PPC_FLOAT_FSQRT | \ | ||
4354 | + PPC_64B | PPC_ALTIVEC | \ | ||
4355 | + PPC_SEGMENT_64B | PPC_SLBI) | ||
4356 | +#define POWERPC_MSRM_970MP (0x900000000204FF36ULL) | ||
4357 | +#define POWERPC_MMU_970MP (POWERPC_MMU_64B) | ||
4358 | +#define POWERPC_EXCP_970MP (POWERPC_EXCP_970) | ||
4359 | +#define POWERPC_INPUT_970MP (PPC_FLAGS_INPUT_970) | ||
4360 | +#define POWERPC_BFDM_970MP (bfd_mach_ppc64) | ||
4361 | +#define POWERPC_FLAG_970MP (POWERPC_FLAG_VRE | POWERPC_FLAG_SE | \ | ||
4362 | + POWERPC_FLAG_BE | POWERPC_FLAG_PMM) | ||
4363 | + | ||
4364 | +static int check_pow_970MP (CPUPPCState *env) | ||
4365 | +{ | ||
4366 | + if (env->spr[SPR_HID0] & 0x01C00000) | ||
4367 | + return 1; | ||
4368 | + | ||
4369 | + return 0; | ||
4370 | +} | ||
4371 | + | ||
4372 | +static void init_proc_970MP (CPUPPCState *env) | ||
4373 | +{ | ||
4374 | + gen_spr_ne_601(env); | ||
4375 | + gen_spr_7xx(env); | ||
4376 | + /* Time base */ | ||
4377 | + gen_tbl(env); | ||
4378 | + /* Hardware implementation registers */ | ||
4379 | + /* XXX : not implemented */ | ||
4380 | + spr_register(env, SPR_HID0, "HID0", | ||
4381 | + SPR_NOACCESS, SPR_NOACCESS, | ||
4382 | + &spr_read_generic, &spr_write_clear, | ||
4383 | + 0x60000000); | ||
4384 | + /* XXX : not implemented */ | ||
4385 | + spr_register(env, SPR_HID1, "HID1", | ||
4386 | + SPR_NOACCESS, SPR_NOACCESS, | ||
4387 | + &spr_read_generic, &spr_write_generic, | ||
4388 | + 0x00000000); | ||
4389 | + /* XXX : not implemented */ | ||
4390 | + spr_register(env, SPR_750_HID2, "HID2", | ||
4391 | + SPR_NOACCESS, SPR_NOACCESS, | ||
4392 | + &spr_read_generic, &spr_write_generic, | ||
4393 | + 0x00000000); | ||
4394 | + /* XXX : not implemented */ | ||
4395 | + spr_register(env, SPR_970_HID5, "HID5", | ||
4396 | + SPR_NOACCESS, SPR_NOACCESS, | ||
4397 | + &spr_read_generic, &spr_write_generic, | ||
4398 | + POWERPC970_HID5_INIT); | ||
4399 | + /* Memory management */ | ||
4400 | + /* XXX: not correct */ | ||
4401 | + gen_low_BATs(env); | ||
4402 | + /* XXX : not implemented */ | ||
4403 | + spr_register(env, SPR_MMUCFG, "MMUCFG", | ||
4404 | + SPR_NOACCESS, SPR_NOACCESS, | ||
4405 | + &spr_read_generic, SPR_NOACCESS, | ||
4406 | + 0x00000000); /* TOFIX */ | ||
4407 | + /* XXX : not implemented */ | ||
4408 | + spr_register(env, SPR_MMUCSR0, "MMUCSR0", | ||
4409 | + SPR_NOACCESS, SPR_NOACCESS, | ||
4410 | + &spr_read_generic, &spr_write_generic, | ||
4411 | + 0x00000000); /* TOFIX */ | ||
4412 | + spr_register(env, SPR_HIOR, "SPR_HIOR", | ||
4413 | + SPR_NOACCESS, SPR_NOACCESS, | ||
4414 | + &spr_read_generic, &spr_write_generic, | ||
4415 | + 0xFFF00000); /* XXX: This is a hack */ | ||
4416 | +#if !defined(CONFIG_USER_ONLY) | ||
4417 | + env->excp_prefix = 0xFFF00000; | ||
4418 | +#endif | ||
4419 | +#if !defined(CONFIG_USER_ONLY) | ||
4420 | + env->slb_nr = 32; | ||
4421 | +#endif | ||
4422 | + init_excp_970(env); | ||
4423 | + env->dcache_line_size = 128; | ||
4424 | + env->icache_line_size = 128; | ||
4425 | + /* Allocate hardware IRQ controller */ | ||
4426 | + ppc970_irq_init(env); | ||
4427 | +} | ||
4428 | + | ||
4276 | /* PowerPC 620 */ | 4429 | /* PowerPC 620 */ |
4277 | #define POWERPC_INSNS_620 (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \ | 4430 | #define POWERPC_INSNS_620 (POWERPC_INSNS_WORKS | PPC_FLOAT_FSQRT | \ |
4278 | PPC_64B | PPC_SLBI) | 4431 | PPC_64B | PPC_SLBI) |
@@ -4282,6 +4435,7 @@ static void init_proc_970GX (CPUPPCState *env) | @@ -4282,6 +4435,7 @@ static void init_proc_970GX (CPUPPCState *env) | ||
4282 | #define POWERPC_INPUT_620 (PPC_FLAGS_INPUT_970) | 4435 | #define POWERPC_INPUT_620 (PPC_FLAGS_INPUT_970) |
4283 | #define POWERPC_BFDM_620 (bfd_mach_ppc64) | 4436 | #define POWERPC_BFDM_620 (bfd_mach_ppc64) |
4284 | #define POWERPC_FLAG_620 (POWERPC_FLAG_SE | POWERPC_FLAG_BE) | 4437 | #define POWERPC_FLAG_620 (POWERPC_FLAG_SE | POWERPC_FLAG_BE) |
4438 | +#define check_pow_620 check_pow_nocheck /* Check this */ | ||
4285 | 4439 | ||
4286 | __attribute__ (( unused )) | 4440 | __attribute__ (( unused )) |
4287 | static void init_proc_620 (CPUPPCState *env) | 4441 | static void init_proc_620 (CPUPPCState *env) |
@@ -4313,9 +4467,10 @@ static void init_proc_620 (CPUPPCState *env) | @@ -4313,9 +4467,10 @@ static void init_proc_620 (CPUPPCState *env) | ||
4313 | #define POWERPC_MMU_PPC32 POWERPC_MMU_604 | 4467 | #define POWERPC_MMU_PPC32 POWERPC_MMU_604 |
4314 | #define POWERPC_EXCP_PPC32 POWERPC_EXCP_604 | 4468 | #define POWERPC_EXCP_PPC32 POWERPC_EXCP_604 |
4315 | #define POWERPC_INPUT_PPC32 POWERPC_INPUT_604 | 4469 | #define POWERPC_INPUT_PPC32 POWERPC_INPUT_604 |
4316 | -#define init_proc_PPC32 init_proc_604 | ||
4317 | #define POWERPC_BFDM_PPC32 POWERPC_BFDM_604 | 4470 | #define POWERPC_BFDM_PPC32 POWERPC_BFDM_604 |
4318 | #define POWERPC_FLAG_PPC32 POWERPC_FLAG_604 | 4471 | #define POWERPC_FLAG_PPC32 POWERPC_FLAG_604 |
4472 | +#define check_pow_PPC32 check_pow_604 | ||
4473 | +#define init_proc_PPC32 init_proc_604 | ||
4319 | 4474 | ||
4320 | /* Default 64 bits PowerPC target will be 970 FX */ | 4475 | /* Default 64 bits PowerPC target will be 970 FX */ |
4321 | #define CPU_POWERPC_PPC64 CPU_POWERPC_970FX | 4476 | #define CPU_POWERPC_PPC64 CPU_POWERPC_970FX |
@@ -4324,9 +4479,10 @@ static void init_proc_620 (CPUPPCState *env) | @@ -4324,9 +4479,10 @@ static void init_proc_620 (CPUPPCState *env) | ||
4324 | #define POWERPC_MMU_PPC64 POWERPC_MMU_970FX | 4479 | #define POWERPC_MMU_PPC64 POWERPC_MMU_970FX |
4325 | #define POWERPC_EXCP_PPC64 POWERPC_EXCP_970FX | 4480 | #define POWERPC_EXCP_PPC64 POWERPC_EXCP_970FX |
4326 | #define POWERPC_INPUT_PPC64 POWERPC_INPUT_970FX | 4481 | #define POWERPC_INPUT_PPC64 POWERPC_INPUT_970FX |
4327 | -#define init_proc_PPC64 init_proc_970FX | ||
4328 | #define POWERPC_BFDM_PPC64 POWERPC_BFDM_970FX | 4482 | #define POWERPC_BFDM_PPC64 POWERPC_BFDM_970FX |
4329 | #define POWERPC_FLAG_PPC64 POWERPC_FLAG_970FX | 4483 | #define POWERPC_FLAG_PPC64 POWERPC_FLAG_970FX |
4484 | +#define check_pow_PPC64 check_pow_970FX | ||
4485 | +#define init_proc_PPC64 init_proc_970FX | ||
4330 | 4486 | ||
4331 | /* Default PowerPC target will be PowerPC 32 */ | 4487 | /* Default PowerPC target will be PowerPC 32 */ |
4332 | #if defined (TARGET_PPC64) && 0 // XXX: TODO | 4488 | #if defined (TARGET_PPC64) && 0 // XXX: TODO |
@@ -4336,9 +4492,10 @@ static void init_proc_620 (CPUPPCState *env) | @@ -4336,9 +4492,10 @@ static void init_proc_620 (CPUPPCState *env) | ||
4336 | #define POWERPC_MMU_DEFAULT POWERPC_MMU_PPC64 | 4492 | #define POWERPC_MMU_DEFAULT POWERPC_MMU_PPC64 |
4337 | #define POWERPC_EXCP_DEFAULT POWERPC_EXCP_PPC64 | 4493 | #define POWERPC_EXCP_DEFAULT POWERPC_EXCP_PPC64 |
4338 | #define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC64 | 4494 | #define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC64 |
4339 | -#define init_proc_DEFAULT init_proc_PPC64 | ||
4340 | #define POWERPC_BFDM_DEFAULT POWERPC_BFDM_PPC64 | 4495 | #define POWERPC_BFDM_DEFAULT POWERPC_BFDM_PPC64 |
4341 | #define POWERPC_FLAG_DEFAULT POWERPC_FLAG_PPC64 | 4496 | #define POWERPC_FLAG_DEFAULT POWERPC_FLAG_PPC64 |
4497 | +#define check_pow_DEFAULT check_pow_PPC64 | ||
4498 | +#define init_proc_DEFAULT init_proc_PPC64 | ||
4342 | #else | 4499 | #else |
4343 | #define CPU_POWERPC_DEFAULT CPU_POWERPC_PPC32 | 4500 | #define CPU_POWERPC_DEFAULT CPU_POWERPC_PPC32 |
4344 | #define POWERPC_INSNS_DEFAULT POWERPC_INSNS_PPC32 | 4501 | #define POWERPC_INSNS_DEFAULT POWERPC_INSNS_PPC32 |
@@ -4346,9 +4503,10 @@ static void init_proc_620 (CPUPPCState *env) | @@ -4346,9 +4503,10 @@ static void init_proc_620 (CPUPPCState *env) | ||
4346 | #define POWERPC_MMU_DEFAULT POWERPC_MMU_PPC32 | 4503 | #define POWERPC_MMU_DEFAULT POWERPC_MMU_PPC32 |
4347 | #define POWERPC_EXCP_DEFAULT POWERPC_EXCP_PPC32 | 4504 | #define POWERPC_EXCP_DEFAULT POWERPC_EXCP_PPC32 |
4348 | #define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC32 | 4505 | #define POWERPC_INPUT_DEFAULT POWERPC_INPUT_PPC32 |
4349 | -#define init_proc_DEFAULT init_proc_PPC32 | ||
4350 | #define POWERPC_BFDM_DEFAULT POWERPC_BFDM_PPC32 | 4506 | #define POWERPC_BFDM_DEFAULT POWERPC_BFDM_PPC32 |
4351 | #define POWERPC_FLAG_DEFAULT POWERPC_FLAG_PPC32 | 4507 | #define POWERPC_FLAG_DEFAULT POWERPC_FLAG_PPC32 |
4508 | +#define check_pow_DEFAULT check_pow_PPC32 | ||
4509 | +#define init_proc_DEFAULT init_proc_PPC32 | ||
4352 | #endif | 4510 | #endif |
4353 | 4511 | ||
4354 | /*****************************************************************************/ | 4512 | /*****************************************************************************/ |
@@ -4848,6 +5006,7 @@ enum { | @@ -4848,6 +5006,7 @@ enum { | ||
4848 | .bfd_mach = glue(POWERPC_BFDM_,_type), \ | 5006 | .bfd_mach = glue(POWERPC_BFDM_,_type), \ |
4849 | .flags = glue(POWERPC_FLAG_,_type), \ | 5007 | .flags = glue(POWERPC_FLAG_,_type), \ |
4850 | .init_proc = &glue(init_proc_,_type), \ | 5008 | .init_proc = &glue(init_proc_,_type), \ |
5009 | + .check_pow = &glue(check_pow_,_type), \ | ||
4851 | } | 5010 | } |
4852 | 5011 | ||
4853 | static ppc_def_t ppc_defs[] = { | 5012 | static ppc_def_t ppc_defs[] = { |
@@ -5671,11 +5830,11 @@ static ppc_def_t ppc_defs[] = { | @@ -5671,11 +5830,11 @@ static ppc_def_t ppc_defs[] = { | ||
5671 | /* PowerPC 970GX (G5) */ | 5830 | /* PowerPC 970GX (G5) */ |
5672 | POWERPC_DEF("970gx", CPU_POWERPC_970GX, 0xFFFFFFFF, 970GX), | 5831 | POWERPC_DEF("970gx", CPU_POWERPC_970GX, 0xFFFFFFFF, 970GX), |
5673 | /* PowerPC 970MP */ | 5832 | /* PowerPC 970MP */ |
5674 | - POWERPC_DEF("970mp", CPU_POWERPC_970MP, 0xFFFFFFFF, 970), | 5833 | + POWERPC_DEF("970mp", CPU_POWERPC_970MP, 0xFFFFFFFF, 970MP), |
5675 | /* PowerPC 970MP v1.0 */ | 5834 | /* PowerPC 970MP v1.0 */ |
5676 | - POWERPC_DEF("970mp1.0", CPU_POWERPC_970MP_v10, 0xFFFFFFFF, 970), | 5835 | + POWERPC_DEF("970mp1.0", CPU_POWERPC_970MP_v10, 0xFFFFFFFF, 970MP), |
5677 | /* PowerPC 970MP v1.1 */ | 5836 | /* PowerPC 970MP v1.1 */ |
5678 | - POWERPC_DEF("970mp1.1", CPU_POWERPC_970MP_v11, 0xFFFFFFFF, 970), | 5837 | + POWERPC_DEF("970mp1.1", CPU_POWERPC_970MP_v11, 0xFFFFFFFF, 970MP), |
5679 | #if defined (TODO) | 5838 | #if defined (TODO) |
5680 | /* PowerPC Cell */ | 5839 | /* PowerPC Cell */ |
5681 | POWERPC_DEF("Cell", CPU_POWERPC_CELL, 0xFFFFFFFF, 970), | 5840 | POWERPC_DEF("Cell", CPU_POWERPC_CELL, 0xFFFFFFFF, 970), |
@@ -5884,6 +6043,11 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | @@ -5884,6 +6043,11 @@ static void init_ppc_proc (CPUPPCState *env, ppc_def_t *def) | ||
5884 | " Attempt Qemu to crash very soon !\n"); | 6043 | " Attempt Qemu to crash very soon !\n"); |
5885 | } | 6044 | } |
5886 | #endif | 6045 | #endif |
6046 | + if (env->check_pow == NULL) { | ||
6047 | + fprintf(stderr, "WARNING: no power management check handler " | ||
6048 | + "registered.\n" | ||
6049 | + " Attempt Qemu to crash very soon !\n"); | ||
6050 | + } | ||
5887 | } | 6051 | } |
5888 | 6052 | ||
5889 | #if defined(PPC_DUMP_CPU) | 6053 | #if defined(PPC_DUMP_CPU) |
@@ -6186,6 +6350,7 @@ int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def) | @@ -6186,6 +6350,7 @@ int cpu_ppc_register (CPUPPCState *env, ppc_def_t *def) | ||
6186 | env->bus_model = def->bus_model; | 6350 | env->bus_model = def->bus_model; |
6187 | env->flags = def->flags; | 6351 | env->flags = def->flags; |
6188 | env->bfd_mach = def->bfd_mach; | 6352 | env->bfd_mach = def->bfd_mach; |
6353 | + env->check_pow = def->check_pow; | ||
6189 | if (create_ppc_opcodes(env, def) < 0) | 6354 | if (create_ppc_opcodes(env, def) < 0) |
6190 | return -1; | 6355 | return -1; |
6191 | init_ppc_proc(env, def); | 6356 | init_ppc_proc(env, def); |