Commit c19148bd8f5c2800265372d3554035efde1c5517
1 parent
e7d05e6f
Make MAXTL dynamic, bounds check tl when indexing
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4942 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
56 additions
and
51 deletions
target-sparc/cpu.h
... | ... | @@ -252,13 +252,15 @@ typedef struct CPUSPARCState { |
252 | 252 | float128 qt0, qt1; |
253 | 253 | float_status fp_status; |
254 | 254 | #if defined(TARGET_SPARC64) |
255 | -#define MAXTL 4 | |
255 | +#define MAXTL_MAX 8 | |
256 | +#define MAXTL_MASK (MAXTL_MAX - 1) | |
256 | 257 | trap_state *tsptr; |
257 | - trap_state ts[MAXTL]; | |
258 | + trap_state ts[MAXTL_MAX]; | |
258 | 259 | uint32_t xcc; /* Extended integer condition codes */ |
259 | 260 | uint32_t asi; |
260 | 261 | uint32_t pstate; |
261 | 262 | uint32_t tl; |
263 | + uint32_t maxtl; | |
262 | 264 | uint32_t cansave, canrestore, otherwin, wstate, cleanwin; |
263 | 265 | uint64_t agregs[8]; /* alternate general registers */ |
264 | 266 | uint64_t bgregs[8]; /* backup for normal global registers */ |
... | ... | @@ -270,7 +272,7 @@ typedef struct CPUSPARCState { |
270 | 272 | uint64_t gsr; |
271 | 273 | uint32_t gl; // UA2005 |
272 | 274 | /* UA 2005 hyperprivileged registers */ |
273 | - uint64_t hpstate, htstate[MAXTL], hintp, htba, hver, hstick_cmpr, ssr; | |
275 | + uint64_t hpstate, htstate[MAXTL_MAX], hintp, htba, hver, hstick_cmpr, ssr; | |
274 | 276 | void *hstick; // UA 2005 |
275 | 277 | #endif |
276 | 278 | uint32_t features; | ... | ... |
target-sparc/helper.c
... | ... | @@ -48,6 +48,7 @@ struct sparc_def_t { |
48 | 48 | uint32_t mmu_trcr_mask; |
49 | 49 | uint32_t features; |
50 | 50 | uint32_t nwindows; |
51 | + uint32_t maxtl; | |
51 | 52 | }; |
52 | 53 | |
53 | 54 | static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model); |
... | ... | @@ -738,20 +739,20 @@ void do_interrupt(CPUState *env) |
738 | 739 | } |
739 | 740 | #endif |
740 | 741 | #if !defined(CONFIG_USER_ONLY) |
741 | - if (env->tl == MAXTL) { | |
742 | - cpu_abort(env, "Trap 0x%04x while trap level is MAXTL, Error state", | |
743 | - env->exception_index); | |
742 | + if (env->tl >= env->maxtl) { | |
743 | + cpu_abort(env, "Trap 0x%04x while trap level (%d) >= MAXTL (%d)," | |
744 | + " Error state", env->exception_index, env->tl, env->maxtl); | |
744 | 745 | return; |
745 | 746 | } |
746 | 747 | #endif |
747 | - if (env->tl < MAXTL - 1) { | |
748 | + if (env->tl < env->maxtl - 1) { | |
748 | 749 | env->tl++; |
749 | 750 | } else { |
750 | 751 | env->pstate |= PS_RED; |
751 | - if (env->tl != MAXTL) | |
752 | + if (env->tl < env->maxtl) | |
752 | 753 | env->tl++; |
753 | 754 | } |
754 | - env->tsptr = &env->ts[env->tl]; | |
755 | + env->tsptr = &env->ts[env->tl & MAXTL_MASK]; | |
755 | 756 | env->tsptr->tstate = ((uint64_t)GET_CCR(env) << 32) | |
756 | 757 | ((env->asi & 0xff) << 24) | ((env->pstate & 0xf3f) << 8) | |
757 | 758 | GET_CWP64(env); |
... | ... | @@ -918,7 +919,7 @@ void cpu_reset(CPUSPARCState *env) |
918 | 919 | env->pstate = PS_PRIV; |
919 | 920 | env->hpstate = HS_PRIV; |
920 | 921 | env->pc = 0x1fff0000020ULL; // XXX should be different for system_reset |
921 | - env->tsptr = &env->ts[env->tl]; | |
922 | + env->tsptr = &env->ts[env->tl & MAXTL_MASK]; | |
922 | 923 | #else |
923 | 924 | env->pc = 0; |
924 | 925 | env->mmuregs[0] &= ~(MMU_E | MMU_NF); |
... | ... | @@ -950,6 +951,8 @@ static int cpu_sparc_register(CPUSPARCState *env, const char *cpu_model) |
950 | 951 | cpu_sparc_set_id(env, 0); |
951 | 952 | #else |
952 | 953 | env->mmu_version = def->mmu_version; |
954 | + env->maxtl = def->maxtl; | |
955 | + env->version |= def->maxtl << 8; | |
953 | 956 | env->version |= def->nwindows - 1; |
954 | 957 | #endif |
955 | 958 | return 0; |
... | ... | @@ -991,159 +994,159 @@ static const sparc_def_t sparc_defs[] = { |
991 | 994 | #ifdef TARGET_SPARC64 |
992 | 995 | { |
993 | 996 | .name = "Fujitsu Sparc64", |
994 | - .iu_version = ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24) | |
995 | - | (MAXTL << 8)), | |
997 | + .iu_version = ((0x04ULL << 48) | (0x02ULL << 32) | (0ULL << 24)), | |
996 | 998 | .fpu_version = 0x00000000, |
997 | 999 | .mmu_version = mmu_us_12, |
998 | 1000 | .nwindows = 4, |
1001 | + .maxtl = 4, | |
999 | 1002 | .features = CPU_DEFAULT_FEATURES, |
1000 | 1003 | }, |
1001 | 1004 | { |
1002 | 1005 | .name = "Fujitsu Sparc64 III", |
1003 | - .iu_version = ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24) | |
1004 | - | (MAXTL << 8)), | |
1006 | + .iu_version = ((0x04ULL << 48) | (0x03ULL << 32) | (0ULL << 24)), | |
1005 | 1007 | .fpu_version = 0x00000000, |
1006 | 1008 | .mmu_version = mmu_us_12, |
1007 | 1009 | .nwindows = 5, |
1010 | + .maxtl = 4, | |
1008 | 1011 | .features = CPU_DEFAULT_FEATURES, |
1009 | 1012 | }, |
1010 | 1013 | { |
1011 | 1014 | .name = "Fujitsu Sparc64 IV", |
1012 | - .iu_version = ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24) | |
1013 | - | (MAXTL << 8)), | |
1015 | + .iu_version = ((0x04ULL << 48) | (0x04ULL << 32) | (0ULL << 24)), | |
1014 | 1016 | .fpu_version = 0x00000000, |
1015 | 1017 | .mmu_version = mmu_us_12, |
1016 | 1018 | .nwindows = 8, |
1019 | + .maxtl = 5, | |
1017 | 1020 | .features = CPU_DEFAULT_FEATURES, |
1018 | 1021 | }, |
1019 | 1022 | { |
1020 | 1023 | .name = "Fujitsu Sparc64 V", |
1021 | - .iu_version = ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24) | |
1022 | - | (MAXTL << 8)), | |
1024 | + .iu_version = ((0x04ULL << 48) | (0x05ULL << 32) | (0x51ULL << 24)), | |
1023 | 1025 | .fpu_version = 0x00000000, |
1024 | 1026 | .mmu_version = mmu_us_12, |
1025 | 1027 | .nwindows = 8, |
1028 | + .maxtl = 5, | |
1026 | 1029 | .features = CPU_DEFAULT_FEATURES, |
1027 | 1030 | }, |
1028 | 1031 | { |
1029 | 1032 | .name = "TI UltraSparc I", |
1030 | - .iu_version = ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24) | |
1031 | - | (MAXTL << 8)), | |
1033 | + .iu_version = ((0x17ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)), | |
1032 | 1034 | .fpu_version = 0x00000000, |
1033 | 1035 | .mmu_version = mmu_us_12, |
1034 | 1036 | .nwindows = 8, |
1037 | + .maxtl = 5, | |
1035 | 1038 | .features = CPU_DEFAULT_FEATURES, |
1036 | 1039 | }, |
1037 | 1040 | { |
1038 | 1041 | .name = "TI UltraSparc II", |
1039 | - .iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24) | |
1040 | - | (MAXTL << 8)), | |
1042 | + .iu_version = ((0x17ULL << 48) | (0x11ULL << 32) | (0x20ULL << 24)), | |
1041 | 1043 | .fpu_version = 0x00000000, |
1042 | 1044 | .mmu_version = mmu_us_12, |
1043 | 1045 | .nwindows = 8, |
1046 | + .maxtl = 5, | |
1044 | 1047 | .features = CPU_DEFAULT_FEATURES, |
1045 | 1048 | }, |
1046 | 1049 | { |
1047 | 1050 | .name = "TI UltraSparc IIi", |
1048 | - .iu_version = ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24) | |
1049 | - | (MAXTL << 8)), | |
1051 | + .iu_version = ((0x17ULL << 48) | (0x12ULL << 32) | (0x91ULL << 24)), | |
1050 | 1052 | .fpu_version = 0x00000000, |
1051 | 1053 | .mmu_version = mmu_us_12, |
1052 | 1054 | .nwindows = 8, |
1055 | + .maxtl = 5, | |
1053 | 1056 | .features = CPU_DEFAULT_FEATURES, |
1054 | 1057 | }, |
1055 | 1058 | { |
1056 | 1059 | .name = "TI UltraSparc IIe", |
1057 | - .iu_version = ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24) | |
1058 | - | (MAXTL << 8)), | |
1060 | + .iu_version = ((0x17ULL << 48) | (0x13ULL << 32) | (0x14ULL << 24)), | |
1059 | 1061 | .fpu_version = 0x00000000, |
1060 | 1062 | .mmu_version = mmu_us_12, |
1061 | 1063 | .nwindows = 8, |
1064 | + .maxtl = 5, | |
1062 | 1065 | .features = CPU_DEFAULT_FEATURES, |
1063 | 1066 | }, |
1064 | 1067 | { |
1065 | 1068 | .name = "Sun UltraSparc III", |
1066 | - .iu_version = ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24) | |
1067 | - | (MAXTL << 8)), | |
1069 | + .iu_version = ((0x3eULL << 48) | (0x14ULL << 32) | (0x34ULL << 24)), | |
1068 | 1070 | .fpu_version = 0x00000000, |
1069 | 1071 | .mmu_version = mmu_us_12, |
1070 | 1072 | .nwindows = 8, |
1073 | + .maxtl = 5, | |
1071 | 1074 | .features = CPU_DEFAULT_FEATURES, |
1072 | 1075 | }, |
1073 | 1076 | { |
1074 | 1077 | .name = "Sun UltraSparc III Cu", |
1075 | - .iu_version = ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24) | |
1076 | - | (MAXTL << 8)), | |
1078 | + .iu_version = ((0x3eULL << 48) | (0x15ULL << 32) | (0x41ULL << 24)), | |
1077 | 1079 | .fpu_version = 0x00000000, |
1078 | 1080 | .mmu_version = mmu_us_3, |
1079 | 1081 | .nwindows = 8, |
1082 | + .maxtl = 5, | |
1080 | 1083 | .features = CPU_DEFAULT_FEATURES, |
1081 | 1084 | }, |
1082 | 1085 | { |
1083 | 1086 | .name = "Sun UltraSparc IIIi", |
1084 | - .iu_version = ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24) | |
1085 | - | (MAXTL << 8)), | |
1087 | + .iu_version = ((0x3eULL << 48) | (0x16ULL << 32) | (0x34ULL << 24)), | |
1086 | 1088 | .fpu_version = 0x00000000, |
1087 | 1089 | .mmu_version = mmu_us_12, |
1088 | 1090 | .nwindows = 8, |
1091 | + .maxtl = 5, | |
1089 | 1092 | .features = CPU_DEFAULT_FEATURES, |
1090 | 1093 | }, |
1091 | 1094 | { |
1092 | 1095 | .name = "Sun UltraSparc IV", |
1093 | - .iu_version = ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24) | |
1094 | - | (MAXTL << 8)), | |
1096 | + .iu_version = ((0x3eULL << 48) | (0x18ULL << 32) | (0x31ULL << 24)), | |
1095 | 1097 | .fpu_version = 0x00000000, |
1096 | 1098 | .mmu_version = mmu_us_4, |
1097 | 1099 | .nwindows = 8, |
1100 | + .maxtl = 5, | |
1098 | 1101 | .features = CPU_DEFAULT_FEATURES, |
1099 | 1102 | }, |
1100 | 1103 | { |
1101 | 1104 | .name = "Sun UltraSparc IV+", |
1102 | - .iu_version = ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24) | |
1103 | - | (MAXTL << 8)), | |
1105 | + .iu_version = ((0x3eULL << 48) | (0x19ULL << 32) | (0x22ULL << 24)), | |
1104 | 1106 | .fpu_version = 0x00000000, |
1105 | 1107 | .mmu_version = mmu_us_12, |
1106 | 1108 | .nwindows = 8, |
1109 | + .maxtl = 5, | |
1107 | 1110 | .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_CMT, |
1108 | 1111 | }, |
1109 | 1112 | { |
1110 | 1113 | .name = "Sun UltraSparc IIIi+", |
1111 | - .iu_version = ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24) | |
1112 | - | (MAXTL << 8)), | |
1114 | + .iu_version = ((0x3eULL << 48) | (0x22ULL << 32) | (0ULL << 24)), | |
1113 | 1115 | .fpu_version = 0x00000000, |
1114 | 1116 | .mmu_version = mmu_us_3, |
1115 | 1117 | .nwindows = 8, |
1118 | + .maxtl = 5, | |
1116 | 1119 | .features = CPU_DEFAULT_FEATURES, |
1117 | 1120 | }, |
1118 | 1121 | { |
1119 | 1122 | .name = "Sun UltraSparc T1", |
1120 | 1123 | // defined in sparc_ifu_fdp.v and ctu.h |
1121 | - .iu_version = ((0x3eULL << 48) | (0x23ULL << 32) | (0x02ULL << 24) | |
1122 | - | (MAXTL << 8)), | |
1124 | + .iu_version = ((0x3eULL << 48) | (0x23ULL << 32) | (0x02ULL << 24)), | |
1123 | 1125 | .fpu_version = 0x00000000, |
1124 | 1126 | .mmu_version = mmu_sun4v, |
1125 | 1127 | .nwindows = 8, |
1128 | + .maxtl = 6, | |
1126 | 1129 | .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT |
1127 | 1130 | | CPU_FEATURE_GL, |
1128 | 1131 | }, |
1129 | 1132 | { |
1130 | 1133 | .name = "Sun UltraSparc T2", |
1131 | 1134 | // defined in tlu_asi_ctl.v and n2_revid_cust.v |
1132 | - .iu_version = ((0x3eULL << 48) | (0x24ULL << 32) | (0x02ULL << 24) | |
1133 | - | (MAXTL << 8)), | |
1135 | + .iu_version = ((0x3eULL << 48) | (0x24ULL << 32) | (0x02ULL << 24)), | |
1134 | 1136 | .fpu_version = 0x00000000, |
1135 | 1137 | .mmu_version = mmu_sun4v, |
1136 | 1138 | .nwindows = 8, |
1139 | + .maxtl = 6, | |
1137 | 1140 | .features = CPU_DEFAULT_FEATURES | CPU_FEATURE_HYPV | CPU_FEATURE_CMT |
1138 | 1141 | | CPU_FEATURE_GL, |
1139 | 1142 | }, |
1140 | 1143 | { |
1141 | 1144 | .name = "NEC UltraSparc I", |
1142 | - .iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24) | |
1143 | - | (MAXTL << 8)), | |
1145 | + .iu_version = ((0x22ULL << 48) | (0x10ULL << 32) | (0x40ULL << 24)), | |
1144 | 1146 | .fpu_version = 0x00000000, |
1145 | 1147 | .mmu_version = mmu_us_12, |
1146 | 1148 | .nwindows = 8, |
1149 | + .maxtl = 5, | |
1147 | 1150 | .features = CPU_DEFAULT_FEATURES, |
1148 | 1151 | }, |
1149 | 1152 | #else | ... | ... |
target-sparc/machine.c
... | ... | @@ -72,7 +72,7 @@ void cpu_save(QEMUFile *f, void *opaque) |
72 | 72 | qemu_put_be64s(f, &env->dtlb_tte[i]); |
73 | 73 | } |
74 | 74 | qemu_put_be32s(f, &env->mmu_version); |
75 | - for (i = 0; i < MAXTL; i++) { | |
75 | + for (i = 0; i < MAXTL_MAX; i++) { | |
76 | 76 | qemu_put_be64s(f, &env->ts[i].tpc); |
77 | 77 | qemu_put_be64s(f, &env->ts[i].tnpc); |
78 | 78 | qemu_put_be64s(f, &env->ts[i].tstate); |
... | ... | @@ -103,7 +103,7 @@ void cpu_save(QEMUFile *f, void *opaque) |
103 | 103 | qemu_put_be64s(f, &env->gsr); |
104 | 104 | qemu_put_be32s(f, &env->gl); |
105 | 105 | qemu_put_be64s(f, &env->hpstate); |
106 | - for (i = 0; i < MAXTL; i++) | |
106 | + for (i = 0; i < MAXTL_MAX; i++) | |
107 | 107 | qemu_put_be64s(f, &env->htstate[i]); |
108 | 108 | qemu_put_be64s(f, &env->hintp); |
109 | 109 | qemu_put_be64s(f, &env->htba); |
... | ... | @@ -165,7 +165,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) |
165 | 165 | qemu_get_be64s(f, &env->dtlb_tte[i]); |
166 | 166 | } |
167 | 167 | qemu_get_be32s(f, &env->mmu_version); |
168 | - for (i = 0; i < MAXTL; i++) { | |
168 | + for (i = 0; i < MAXTL_MAX; i++) { | |
169 | 169 | qemu_get_be64s(f, &env->ts[i].tpc); |
170 | 170 | qemu_get_be64s(f, &env->ts[i].tnpc); |
171 | 171 | qemu_get_be64s(f, &env->ts[i].tstate); |
... | ... | @@ -175,7 +175,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) |
175 | 175 | qemu_get_be32s(f, &env->asi); |
176 | 176 | qemu_get_be32s(f, &env->pstate); |
177 | 177 | qemu_get_be32s(f, &env->tl); |
178 | - env->tsptr = &env->ts[env->tl]; | |
178 | + env->tsptr = &env->ts[env->tl & MAXTL_MASK]; | |
179 | 179 | qemu_get_be32s(f, &env->cansave); |
180 | 180 | qemu_get_be32s(f, &env->canrestore); |
181 | 181 | qemu_get_be32s(f, &env->otherwin); |
... | ... | @@ -197,7 +197,7 @@ int cpu_load(QEMUFile *f, void *opaque, int version_id) |
197 | 197 | qemu_get_be64s(f, &env->gsr); |
198 | 198 | qemu_get_be32s(f, &env->gl); |
199 | 199 | qemu_get_be64s(f, &env->hpstate); |
200 | - for (i = 0; i < MAXTL; i++) | |
200 | + for (i = 0; i < MAXTL_MAX; i++) | |
201 | 201 | qemu_get_be64s(f, &env->htstate[i]); |
202 | 202 | qemu_get_be64s(f, &env->hintp); |
203 | 203 | qemu_get_be64s(f, &env->htba); | ... | ... |
target-sparc/op_helper.c
... | ... | @@ -2742,7 +2742,7 @@ void helper_done(void) |
2742 | 2742 | change_pstate((env->tsptr->tstate >> 8) & 0xf3f); |
2743 | 2743 | PUT_CWP64(env, env->tsptr->tstate & 0xff); |
2744 | 2744 | env->tl--; |
2745 | - env->tsptr = &env->ts[env->tl]; | |
2745 | + env->tsptr = &env->ts[env->tl & MAXTL_MASK]; | |
2746 | 2746 | } |
2747 | 2747 | |
2748 | 2748 | void helper_retry(void) |
... | ... | @@ -2754,7 +2754,7 @@ void helper_retry(void) |
2754 | 2754 | change_pstate((env->tsptr->tstate >> 8) & 0xf3f); |
2755 | 2755 | PUT_CWP64(env, env->tsptr->tstate & 0xff); |
2756 | 2756 | env->tl--; |
2757 | - env->tsptr = &env->ts[env->tl]; | |
2757 | + env->tsptr = &env->ts[env->tl & MAXTL_MASK]; | |
2758 | 2758 | } |
2759 | 2759 | #endif |
2760 | 2760 | ... | ... |