Commit 3953d7868768c179440e8302e536b436171205cc
1 parent
1698b741
Move mips CPU specific initialization to translate_init.c.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2522 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
61 additions
and
40 deletions
target-mips/mips-defs.h
| @@ -15,43 +15,6 @@ | @@ -15,43 +15,6 @@ | ||
| 15 | #define MIPS_USES_R4K_TLB | 15 | #define MIPS_USES_R4K_TLB |
| 16 | #define MIPS_TLB_NB 16 | 16 | #define MIPS_TLB_NB 16 |
| 17 | #define MIPS_TLB_MAX 128 | 17 | #define MIPS_TLB_MAX 128 |
| 18 | -/* Define a implementation number of 1. | ||
| 19 | - * Define a major version 1, minor version 0. | ||
| 20 | - */ | ||
| 21 | -#define MIPS_FCR0 ((0 << 16) | (1 << 8) | (1 << 4) | 0) | ||
| 22 | - /* Have config1, is MIPS32R1, uses TLB, no virtual icache, | ||
| 23 | - uncached coherency */ | ||
| 24 | -#define MIPS_CONFIG0_1 \ | ||
| 25 | - ((1 << CP0C0_M) | (0x0 << CP0C0_K23) | (0x0 << CP0C0_KU) | \ | ||
| 26 | - (0x0 << CP0C0_AT) | (0x0 << CP0C0_AR) | (0x1 << CP0C0_MT) | \ | ||
| 27 | - (0x2 << CP0C0_K0)) | ||
| 28 | -#ifdef TARGET_WORDS_BIGENDIAN | ||
| 29 | -#define MIPS_CONFIG0 (MIPS_CONFIG0_1 | (1 << CP0C0_BE)) | ||
| 30 | -#else | ||
| 31 | -#define MIPS_CONFIG0 MIPS_CONFIG0_1 | ||
| 32 | -#endif | ||
| 33 | -/* Have config2, 16 TLB entries, 64 sets Icache, 16 bytes Icache line, | ||
| 34 | - 2-way Icache, 64 sets Dcache, 16 bytes Dcache line, 2-way Dcache, | ||
| 35 | - no coprocessor2 attached, no MDMX support attached, | ||
| 36 | - no performance counters, watch registers present, | ||
| 37 | - no code compression, EJTAG present, no FPU */ | ||
| 38 | -#define MIPS_CONFIG1 \ | ||
| 39 | -((1 << CP0C1_M) | ((MIPS_TLB_NB - 1) << CP0C1_MMU) | \ | ||
| 40 | - (0x0 << CP0C1_IS) | (0x3 << CP0C1_IL) | (0x1 << CP0C1_IA) | \ | ||
| 41 | - (0x0 << CP0C1_DS) | (0x3 << CP0C1_DL) | (0x1 << CP0C1_DA) | \ | ||
| 42 | - (0 << CP0C1_C2) | (0 << CP0C1_MD) | (0 << CP0C1_PC) | \ | ||
| 43 | - (1 << CP0C1_WR) | (0 << CP0C1_CA) | (1 << CP0C1_EP) | \ | ||
| 44 | - (0 << CP0C1_FP)) | ||
| 45 | -/* Have config3, no tertiary/secondary caches implemented */ | ||
| 46 | -#define MIPS_CONFIG2 \ | ||
| 47 | -((1 << CP0C2_M)) | ||
| 48 | -/* No config4, no DSP ASE, no large physaddr, | ||
| 49 | - no external interrupt controller, no vectored interupts, | ||
| 50 | - no 1kb pages, no MT ASE, no SmartMIPS ASE, no trace logic */ | ||
| 51 | -#define MIPS_CONFIG3 \ | ||
| 52 | -((0 << CP0C3_M) | (0 << CP0C3_DSPP) | (0 << CP0C3_LPA) | \ | ||
| 53 | - (0 << CP0C3_VEIC) | (0 << CP0C3_VInt) | (0 << CP0C3_SP) | \ | ||
| 54 | - (0 << CP0C3_MT) | (0 << CP0C3_SM) | (0 << CP0C3_TL)) | ||
| 55 | 18 | ||
| 56 | #ifdef MIPS_HAS_MIPS64 | 19 | #ifdef MIPS_HAS_MIPS64 |
| 57 | #define TARGET_LONG_BITS 64 | 20 | #define TARGET_LONG_BITS 64 |
target-mips/translate.c
| @@ -5292,8 +5292,6 @@ void cpu_reset (CPUMIPSState *env) | @@ -5292,8 +5292,6 @@ void cpu_reset (CPUMIPSState *env) | ||
| 5292 | env->CP0_Wired = 0; | 5292 | env->CP0_Wired = 0; |
| 5293 | /* SMP not implemented */ | 5293 | /* SMP not implemented */ |
| 5294 | env->CP0_EBase = 0x80000000; | 5294 | env->CP0_EBase = 0x80000000; |
| 5295 | - env->CP0_Config2 = MIPS_CONFIG2; | ||
| 5296 | - env->CP0_Config3 = MIPS_CONFIG3; | ||
| 5297 | env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL); | 5295 | env->CP0_Status = (1 << CP0St_BEV) | (1 << CP0St_ERL); |
| 5298 | env->CP0_WatchLo = 0; | 5296 | env->CP0_WatchLo = 0; |
| 5299 | env->hflags = MIPS_HFLAG_ERL; | 5297 | env->hflags = MIPS_HFLAG_ERL; |
| @@ -5305,7 +5303,6 @@ void cpu_reset (CPUMIPSState *env) | @@ -5305,7 +5303,6 @@ void cpu_reset (CPUMIPSState *env) | ||
| 5305 | env->hflags |= MIPS_HFLAG_UM; | 5303 | env->hflags |= MIPS_HFLAG_UM; |
| 5306 | env->user_mode_only = 1; | 5304 | env->user_mode_only = 1; |
| 5307 | #endif | 5305 | #endif |
| 5308 | - env->fcr0 = MIPS_FCR0; | ||
| 5309 | /* XXX some guesswork here, values are CPU specific */ | 5306 | /* XXX some guesswork here, values are CPU specific */ |
| 5310 | env->SYNCI_Step = 16; | 5307 | env->SYNCI_Step = 16; |
| 5311 | env->CCRes = 2; | 5308 | env->CCRes = 2; |
target-mips/translate_init.c
| @@ -19,11 +19,53 @@ | @@ -19,11 +19,53 @@ | ||
| 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| 22 | +/* CPU / CPU family specific config register values. */ | ||
| 23 | + | ||
| 24 | +/* Have config1, is MIPS32R1, uses TLB, no virtual icache, | ||
| 25 | + uncached coherency */ | ||
| 26 | +#define MIPS_CONFIG0 \ | ||
| 27 | + ((1 << CP0C0_M) | (0x0 << CP0C0_K23) | (0x0 << CP0C0_KU) | \ | ||
| 28 | + (0x0 << CP0C0_AT) | (0x0 << CP0C0_AR) | (0x1 << CP0C0_MT) | \ | ||
| 29 | + (0x2 << CP0C0_K0)) | ||
| 30 | + | ||
| 31 | +/* Have config2, 16 TLB entries, 64 sets Icache, 16 bytes Icache line, | ||
| 32 | + 2-way Icache, 64 sets Dcache, 16 bytes Dcache line, 2-way Dcache, | ||
| 33 | + no coprocessor2 attached, no MDMX support attached, | ||
| 34 | + no performance counters, watch registers present, | ||
| 35 | + no code compression, EJTAG present, no FPU */ | ||
| 36 | +#define MIPS_CONFIG1 \ | ||
| 37 | +((1 << CP0C1_M) | ((MIPS_TLB_NB - 1) << CP0C1_MMU) | \ | ||
| 38 | + (0x0 << CP0C1_IS) | (0x3 << CP0C1_IL) | (0x1 << CP0C1_IA) | \ | ||
| 39 | + (0x0 << CP0C1_DS) | (0x3 << CP0C1_DL) | (0x1 << CP0C1_DA) | \ | ||
| 40 | + (0 << CP0C1_C2) | (0 << CP0C1_MD) | (0 << CP0C1_PC) | \ | ||
| 41 | + (1 << CP0C1_WR) | (0 << CP0C1_CA) | (1 << CP0C1_EP) | \ | ||
| 42 | + (0 << CP0C1_FP)) | ||
| 43 | + | ||
| 44 | +/* Have config3, no tertiary/secondary caches implemented */ | ||
| 45 | +#define MIPS_CONFIG2 \ | ||
| 46 | +((1 << CP0C2_M)) | ||
| 47 | + | ||
| 48 | +/* No config4, no DSP ASE, no large physaddr, | ||
| 49 | + no external interrupt controller, no vectored interupts, | ||
| 50 | + no 1kb pages, no MT ASE, no SmartMIPS ASE, no trace logic */ | ||
| 51 | +#define MIPS_CONFIG3 \ | ||
| 52 | +((0 << CP0C3_M) | (0 << CP0C3_DSPP) | (0 << CP0C3_LPA) | \ | ||
| 53 | + (0 << CP0C3_VEIC) | (0 << CP0C3_VInt) | (0 << CP0C3_SP) | \ | ||
| 54 | + (0 << CP0C3_MT) | (0 << CP0C3_SM) | (0 << CP0C3_TL)) | ||
| 55 | + | ||
| 56 | +/* Define a implementation number of 1. | ||
| 57 | + Define a major version 1, minor version 0. */ | ||
| 58 | +#define MIPS_FCR0 ((0 << 16) | (1 << 8) | (1 << 4) | 0) | ||
| 59 | + | ||
| 60 | + | ||
| 22 | struct mips_def_t { | 61 | struct mips_def_t { |
| 23 | const unsigned char *name; | 62 | const unsigned char *name; |
| 24 | int32_t CP0_PRid; | 63 | int32_t CP0_PRid; |
| 25 | int32_t CP0_Config0; | 64 | int32_t CP0_Config0; |
| 26 | int32_t CP0_Config1; | 65 | int32_t CP0_Config1; |
| 66 | + int32_t CP0_Config2; | ||
| 67 | + int32_t CP0_Config3; | ||
| 68 | + int32_t CP1_fcr0; | ||
| 27 | }; | 69 | }; |
| 28 | 70 | ||
| 29 | /*****************************************************************************/ | 71 | /*****************************************************************************/ |
| @@ -36,18 +78,27 @@ static mips_def_t mips_defs[] = | @@ -36,18 +78,27 @@ static mips_def_t mips_defs[] = | ||
| 36 | .CP0_PRid = 0x00018000, | 78 | .CP0_PRid = 0x00018000, |
| 37 | .CP0_Config0 = MIPS_CONFIG0, | 79 | .CP0_Config0 = MIPS_CONFIG0, |
| 38 | .CP0_Config1 = MIPS_CONFIG1, | 80 | .CP0_Config1 = MIPS_CONFIG1, |
| 81 | + .CP0_Config2 = MIPS_CONFIG2, | ||
| 82 | + .CP0_Config3 = MIPS_CONFIG3, | ||
| 83 | + .CP1_fcr0 = MIPS_FCR0, | ||
| 39 | }, | 84 | }, |
| 40 | { | 85 | { |
| 41 | .name = "4KEc", | 86 | .name = "4KEc", |
| 42 | .CP0_PRid = 0x00018400, | 87 | .CP0_PRid = 0x00018400, |
| 43 | .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR), | 88 | .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR), |
| 44 | .CP0_Config1 = MIPS_CONFIG1, | 89 | .CP0_Config1 = MIPS_CONFIG1, |
| 90 | + .CP0_Config2 = MIPS_CONFIG2, | ||
| 91 | + .CP0_Config3 = MIPS_CONFIG3, | ||
| 92 | + .CP1_fcr0 = MIPS_FCR0, | ||
| 45 | }, | 93 | }, |
| 46 | { | 94 | { |
| 47 | .name = "24Kf", | 95 | .name = "24Kf", |
| 48 | .CP0_PRid = 0x00019300, | 96 | .CP0_PRid = 0x00019300, |
| 49 | .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR), | 97 | .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR), |
| 50 | .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP), | 98 | .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP), |
| 99 | + .CP0_Config2 = MIPS_CONFIG2, | ||
| 100 | + .CP0_Config3 = MIPS_CONFIG3, | ||
| 101 | + .CP1_fcr0 = MIPS_FCR0, | ||
| 51 | }, | 102 | }, |
| 52 | #else | 103 | #else |
| 53 | { | 104 | { |
| @@ -55,6 +106,9 @@ static mips_def_t mips_defs[] = | @@ -55,6 +106,9 @@ static mips_def_t mips_defs[] = | ||
| 55 | .CP0_PRid = 0x00000400, | 106 | .CP0_PRid = 0x00000400, |
| 56 | .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT), | 107 | .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT), |
| 57 | .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP), | 108 | .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP), |
| 109 | + .CP0_Config2 = MIPS_CONFIG2, | ||
| 110 | + .CP0_Config3 = MIPS_CONFIG3, | ||
| 111 | + .CP1_fcr0 = MIPS_FCR0, | ||
| 58 | }, | 112 | }, |
| 59 | #endif | 113 | #endif |
| 60 | }; | 114 | }; |
| @@ -91,7 +145,14 @@ int cpu_mips_register (CPUMIPSState *env, mips_def_t *def) | @@ -91,7 +145,14 @@ int cpu_mips_register (CPUMIPSState *env, mips_def_t *def) | ||
| 91 | if (!def) | 145 | if (!def) |
| 92 | cpu_abort(env, "Unable to find MIPS CPU definition\n"); | 146 | cpu_abort(env, "Unable to find MIPS CPU definition\n"); |
| 93 | env->CP0_PRid = def->CP0_PRid; | 147 | env->CP0_PRid = def->CP0_PRid; |
| 148 | +#ifdef TARGET_WORDS_BIGENDIAN | ||
| 149 | + env->CP0_Config0 = def->CP0_Config0 | (1 << CP0C0_BE); | ||
| 150 | +#else | ||
| 94 | env->CP0_Config0 = def->CP0_Config0; | 151 | env->CP0_Config0 = def->CP0_Config0; |
| 152 | +#endif | ||
| 95 | env->CP0_Config1 = def->CP0_Config1; | 153 | env->CP0_Config1 = def->CP0_Config1; |
| 154 | + env->CP0_Config2 = def->CP0_Config2; | ||
| 155 | + env->CP0_Config3 = def->CP0_Config3; | ||
| 156 | + env->fcr0 = def->CP1_fcr0; | ||
| 96 | return 0; | 157 | return 0; |
| 97 | } | 158 | } |