Revision 111bfab3
b/cpu-exec.c | ||
---|---|---|
364 | 364 |
cs_base = env->npc; |
365 | 365 |
pc = env->pc; |
366 | 366 |
#elif defined(TARGET_PPC) |
367 |
flags = (msr_pr << MSR_PR) | (msr_fp << MSR_FP) | (msr_se << MSR_SE); |
|
367 |
flags = (msr_pr << MSR_PR) | (msr_fp << MSR_FP) | |
|
368 |
(msr_se << MSR_SE) | (msr_le << MSR_LE); |
|
368 | 369 |
cs_base = 0; |
369 | 370 |
pc = env->nip; |
370 | 371 |
#else |
b/disas.c | ||
---|---|---|
141 | 141 |
#elif defined(TARGET_SPARC) |
142 | 142 |
print_insn = print_insn_sparc; |
143 | 143 |
#elif defined(TARGET_PPC) |
144 |
if (cpu_single_env->msr[MSR_LE]) |
|
145 |
disasm_info.endian = BFD_ENDIAN_LITTLE; |
|
144 | 146 |
print_insn = print_insn_ppc; |
145 | 147 |
#else |
146 | 148 |
fprintf(out, "0x" TARGET_FMT_lx |
b/target-ppc/op_helper_mem.h | ||
---|---|---|
40 | 40 |
} |
41 | 41 |
} |
42 | 42 |
|
43 |
void glue(do_lsw_le, MEMSUFFIX) (int dst) |
|
44 |
{ |
|
45 |
uint32_t tmp; |
|
46 |
int sh; |
|
47 |
|
|
48 |
if (loglevel > 0) { |
|
49 |
fprintf(logfile, "%s: addr=0x%08x count=%d reg=%d\n", |
|
50 |
__func__, T0, T1, dst); |
|
51 |
} |
|
52 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
|
53 |
tmp = glue(ldl, MEMSUFFIX)(T0); |
|
54 |
ugpr(dst++) = ((tmp & 0xFF000000) >> 24) | ((tmp & 0x00FF0000) >> 8) | |
|
55 |
((tmp & 0x0000FF00) << 8) | ((tmp & 0x000000FF) << 24); |
|
56 |
if (dst == 32) |
|
57 |
dst = 0; |
|
58 |
} |
|
59 |
if (T1 > 0) { |
|
60 |
tmp = 0; |
|
61 |
for (sh = 0; T1 > 0; T1--, T0++, sh += 8) { |
|
62 |
tmp |= glue(ldub, MEMSUFFIX)(T0) << sh; |
|
63 |
} |
|
64 |
ugpr(dst) = tmp; |
|
65 |
} |
|
66 |
} |
|
67 |
|
|
68 |
void glue(do_stsw_le, MEMSUFFIX) (int src) |
|
69 |
{ |
|
70 |
uint32_t tmp; |
|
71 |
int sh; |
|
72 |
|
|
73 |
if (loglevel > 0) { |
|
74 |
fprintf(logfile, "%s: addr=0x%08x count=%d reg=%d\n", |
|
75 |
__func__, T0, T1, src); |
|
76 |
} |
|
77 |
for (; T1 > 3; T1 -= 4, T0 += 4) { |
|
78 |
tmp = ((ugpr(src++) & 0xFF000000) >> 24); |
|
79 |
tmp |= ((ugpr(src++) & 0x00FF0000) >> 8); |
|
80 |
tmp |= ((ugpr(src++) & 0x0000FF00) << 8); |
|
81 |
tmp |= ((ugpr(src++) & 0x000000FF) << 24); |
|
82 |
glue(stl, MEMSUFFIX)(T0, tmp); |
|
83 |
if (src == 32) |
|
84 |
src = 0; |
|
85 |
} |
|
86 |
if (T1 > 0) { |
|
87 |
for (sh = 0; T1 > 0; T1--, T0++, sh += 8) |
|
88 |
glue(stb, MEMSUFFIX)(T0, (ugpr(src) >> sh) & 0xFF); |
|
89 |
} |
|
90 |
} |
|
91 |
|
|
43 | 92 |
#undef MEMSUFFIX |
b/target-ppc/op_mem.h | ||
---|---|---|
8 | 8 |
return ((tmp & 0xFF00) >> 8) | ((tmp & 0x00FF) << 8); |
9 | 9 |
} |
10 | 10 |
|
11 |
static inline int32_t glue(ld16rs, MEMSUFFIX) (target_ulong EA) |
|
12 |
{ |
|
13 |
int16_t tmp = glue(lduw, MEMSUFFIX)(EA); |
|
14 |
return ((tmp & 0xFF00) >> 8) | ((tmp & 0x00FF) << 8); |
|
15 |
} |
|
16 |
|
|
11 | 17 |
static inline uint32_t glue(ld32r, MEMSUFFIX) (target_ulong EA) |
12 | 18 |
{ |
13 | 19 |
uint32_t tmp = glue(ldl, MEMSUFFIX)(EA); |
... | ... | |
48 | 54 |
PPC_LD_OP(hz, lduw); |
49 | 55 |
PPC_LD_OP(wz, ldl); |
50 | 56 |
|
57 |
PPC_LD_OP(ha_le, ld16rs); |
|
58 |
PPC_LD_OP(hz_le, ld16r); |
|
59 |
PPC_LD_OP(wz_le, ld32r); |
|
60 |
|
|
51 | 61 |
/*** Integer store ***/ |
52 | 62 |
PPC_ST_OP(b, stb); |
53 | 63 |
PPC_ST_OP(h, stw); |
54 | 64 |
PPC_ST_OP(w, stl); |
55 | 65 |
|
66 |
PPC_ST_OP(h_le, st16r); |
|
67 |
PPC_ST_OP(w_le, st32r); |
|
68 |
|
|
56 | 69 |
/*** Integer load and store with byte reverse ***/ |
57 | 70 |
PPC_LD_OP(hbr, ld16r); |
58 | 71 |
PPC_LD_OP(wbr, ld32r); |
59 | 72 |
PPC_ST_OP(hbr, st16r); |
60 | 73 |
PPC_ST_OP(wbr, st32r); |
61 | 74 |
|
75 |
PPC_LD_OP(hbr_le, lduw); |
|
76 |
PPC_LD_OP(wbr_le, ldl); |
|
77 |
PPC_ST_OP(hbr_le, stw); |
|
78 |
PPC_ST_OP(wbr_le, stl); |
|
79 |
|
|
62 | 80 |
/*** Integer load and store multiple ***/ |
63 | 81 |
PPC_OP(glue(lmw, MEMSUFFIX)) |
64 | 82 |
{ |
... | ... | |
80 | 98 |
RETURN(); |
81 | 99 |
} |
82 | 100 |
|
101 |
PPC_OP(glue(lmw_le, MEMSUFFIX)) |
|
102 |
{ |
|
103 |
int dst = PARAM(1); |
|
104 |
|
|
105 |
for (; dst < 32; dst++, T0 += 4) { |
|
106 |
ugpr(dst) = glue(ld32r, MEMSUFFIX)(T0); |
|
107 |
} |
|
108 |
RETURN(); |
|
109 |
} |
|
110 |
|
|
111 |
PPC_OP(glue(stmw_le, MEMSUFFIX)) |
|
112 |
{ |
|
113 |
int src = PARAM(1); |
|
114 |
|
|
115 |
for (; src < 32; src++, T0 += 4) { |
|
116 |
glue(st32r, MEMSUFFIX)(T0, ugpr(src)); |
|
117 |
} |
|
118 |
RETURN(); |
|
119 |
} |
|
120 |
|
|
83 | 121 |
/*** Integer load and store strings ***/ |
84 | 122 |
PPC_OP(glue(lswi, MEMSUFFIX)) |
85 | 123 |
{ |
... | ... | |
87 | 125 |
RETURN(); |
88 | 126 |
} |
89 | 127 |
|
128 |
void glue(do_lsw_le, MEMSUFFIX) (int dst); |
|
129 |
PPC_OP(glue(lswi_le, MEMSUFFIX)) |
|
130 |
{ |
|
131 |
glue(do_lsw_le, MEMSUFFIX)(PARAM(1)); |
|
132 |
RETURN(); |
|
133 |
} |
|
134 |
|
|
90 | 135 |
/* PPC32 specification says we must generate an exception if |
91 | 136 |
* rA is in the range of registers to be loaded. |
92 | 137 |
* In an other hand, IBM says this is valid, but rA won't be loaded. |
... | ... | |
105 | 150 |
RETURN(); |
106 | 151 |
} |
107 | 152 |
|
153 |
PPC_OP(glue(lswx_le, MEMSUFFIX)) |
|
154 |
{ |
|
155 |
if (T1 > 0) { |
|
156 |
if ((PARAM(1) < PARAM(2) && (PARAM(1) + T1) > PARAM(2)) || |
|
157 |
(PARAM(1) < PARAM(3) && (PARAM(1) + T1) > PARAM(3))) { |
|
158 |
do_raise_exception_err(EXCP_PROGRAM, EXCP_INVAL | EXCP_INVAL_LSWX); |
|
159 |
} else { |
|
160 |
glue(do_lsw_le, MEMSUFFIX)(PARAM(1)); |
|
161 |
} |
|
162 |
} |
|
163 |
RETURN(); |
|
164 |
} |
|
165 |
|
|
108 | 166 |
PPC_OP(glue(stsw, MEMSUFFIX)) |
109 | 167 |
{ |
110 | 168 |
glue(do_stsw, MEMSUFFIX)(PARAM(1)); |
111 | 169 |
RETURN(); |
112 | 170 |
} |
113 | 171 |
|
172 |
void glue(do_stsw_le, MEMSUFFIX) (int src); |
|
173 |
PPC_OP(glue(stsw_le, MEMSUFFIX)) |
|
174 |
{ |
|
175 |
glue(do_stsw_le, MEMSUFFIX)(PARAM(1)); |
|
176 |
RETURN(); |
|
177 |
} |
|
178 |
|
|
114 | 179 |
/*** Floating-point store ***/ |
115 | 180 |
#define PPC_STF_OP(name, op) \ |
116 | 181 |
PPC_OP(glue(glue(st, name), MEMSUFFIX)) \ |
... | ... | |
122 | 187 |
PPC_STF_OP(fd, stfq); |
123 | 188 |
PPC_STF_OP(fs, stfl); |
124 | 189 |
|
190 |
static inline void glue(stfqr, MEMSUFFIX) (target_ulong EA, double d) |
|
191 |
{ |
|
192 |
union { |
|
193 |
double d; |
|
194 |
uint64_t u; |
|
195 |
} u; |
|
196 |
|
|
197 |
u.d = d; |
|
198 |
u.u = ((u.u & 0xFF00000000000000ULL) >> 56) | |
|
199 |
((u.u & 0x00FF000000000000ULL) >> 40) | |
|
200 |
((u.u & 0x0000FF0000000000ULL) >> 24) | |
|
201 |
((u.u & 0x000000FF00000000ULL) >> 8) | |
|
202 |
((u.u & 0x00000000FF000000ULL) << 8) | |
|
203 |
((u.u & 0x0000000000FF0000ULL) << 24) | |
|
204 |
((u.u & 0x000000000000FF00ULL) << 40) | |
|
205 |
((u.u & 0x00000000000000FFULL) << 56); |
|
206 |
glue(stfq, MEMSUFFIX)(EA, u.d); |
|
207 |
} |
|
208 |
|
|
209 |
static inline void glue(stflr, MEMSUFFIX) (target_ulong EA, float f) |
|
210 |
{ |
|
211 |
union { |
|
212 |
float f; |
|
213 |
uint32_t u; |
|
214 |
} u; |
|
215 |
|
|
216 |
u.f = f; |
|
217 |
u.u = ((u.u & 0xFF000000UL) >> 24) | |
|
218 |
((u.u & 0x00FF0000ULL) >> 8) | |
|
219 |
((u.u & 0x0000FF00UL) << 8) | |
|
220 |
((u.u & 0x000000FFULL) << 24); |
|
221 |
glue(stfl, MEMSUFFIX)(EA, u.f); |
|
222 |
} |
|
223 |
|
|
224 |
PPC_STF_OP(fd_le, stfqr); |
|
225 |
PPC_STF_OP(fs_le, stflr); |
|
226 |
|
|
125 | 227 |
/*** Floating-point load ***/ |
126 | 228 |
#define PPC_LDF_OP(name, op) \ |
127 | 229 |
PPC_OP(glue(glue(l, name), MEMSUFFIX)) \ |
... | ... | |
133 | 235 |
PPC_LDF_OP(fd, ldfq); |
134 | 236 |
PPC_LDF_OP(fs, ldfl); |
135 | 237 |
|
238 |
static inline double glue(ldfqr, MEMSUFFIX) (target_ulong EA) |
|
239 |
{ |
|
240 |
union { |
|
241 |
double d; |
|
242 |
uint64_t u; |
|
243 |
} u; |
|
244 |
|
|
245 |
u.d = glue(ldfq, MEMSUFFIX)(EA); |
|
246 |
u.u = ((u.u & 0xFF00000000000000ULL) >> 56) | |
|
247 |
((u.u & 0x00FF000000000000ULL) >> 40) | |
|
248 |
((u.u & 0x0000FF0000000000ULL) >> 24) | |
|
249 |
((u.u & 0x000000FF00000000ULL) >> 8) | |
|
250 |
((u.u & 0x00000000FF000000ULL) << 8) | |
|
251 |
((u.u & 0x0000000000FF0000ULL) << 24) | |
|
252 |
((u.u & 0x000000000000FF00ULL) << 40) | |
|
253 |
((u.u & 0x00000000000000FFULL) << 56); |
|
254 |
|
|
255 |
return u.d; |
|
256 |
} |
|
257 |
|
|
258 |
static inline float glue(ldflr, MEMSUFFIX) (target_ulong EA) |
|
259 |
{ |
|
260 |
union { |
|
261 |
float f; |
|
262 |
uint32_t u; |
|
263 |
} u; |
|
264 |
|
|
265 |
u.f = glue(ldfl, MEMSUFFIX)(EA); |
|
266 |
u.u = ((u.u & 0xFF000000UL) >> 24) | |
|
267 |
((u.u & 0x00FF0000ULL) >> 8) | |
|
268 |
((u.u & 0x0000FF00UL) << 8) | |
|
269 |
((u.u & 0x000000FFULL) << 24); |
|
270 |
|
|
271 |
return u.f; |
|
272 |
} |
|
273 |
|
|
274 |
PPC_LDF_OP(fd_le, ldfqr); |
|
275 |
PPC_LDF_OP(fs_le, ldflr); |
|
276 |
|
|
136 | 277 |
/* Load and set reservation */ |
137 | 278 |
PPC_OP(glue(lwarx, MEMSUFFIX)) |
138 | 279 |
{ |
... | ... | |
145 | 286 |
RETURN(); |
146 | 287 |
} |
147 | 288 |
|
289 |
PPC_OP(glue(lwarx_le, MEMSUFFIX)) |
|
290 |
{ |
|
291 |
if (T0 & 0x03) { |
|
292 |
do_raise_exception(EXCP_ALIGN); |
|
293 |
} else { |
|
294 |
T1 = glue(ld32r, MEMSUFFIX)(T0); |
|
295 |
regs->reserve = T0; |
|
296 |
} |
|
297 |
RETURN(); |
|
298 |
} |
|
299 |
|
|
148 | 300 |
/* Store with reservation */ |
149 | 301 |
PPC_OP(glue(stwcx, MEMSUFFIX)) |
150 | 302 |
{ |
... | ... | |
162 | 314 |
RETURN(); |
163 | 315 |
} |
164 | 316 |
|
317 |
PPC_OP(glue(stwcx_le, MEMSUFFIX)) |
|
318 |
{ |
|
319 |
if (T0 & 0x03) { |
|
320 |
do_raise_exception(EXCP_ALIGN); |
|
321 |
} else { |
|
322 |
if (regs->reserve != T0) { |
|
323 |
env->crf[0] = xer_ov; |
|
324 |
} else { |
|
325 |
glue(st32r, MEMSUFFIX)(T0, T1); |
|
326 |
env->crf[0] = xer_ov | 0x02; |
|
327 |
} |
|
328 |
} |
|
329 |
regs->reserve = 0; |
|
330 |
RETURN(); |
|
331 |
} |
|
332 |
|
|
165 | 333 |
PPC_OP(glue(dcbz, MEMSUFFIX)) |
166 | 334 |
{ |
167 | 335 |
glue(stl, MEMSUFFIX)(T0 + 0x00, 0); |
... | ... | |
188 | 356 |
RETURN(); |
189 | 357 |
} |
190 | 358 |
|
359 |
PPC_OP(glue(eciwx_le, MEMSUFFIX)) |
|
360 |
{ |
|
361 |
T1 = glue(ld32r, MEMSUFFIX)(T0); |
|
362 |
RETURN(); |
|
363 |
} |
|
364 |
|
|
365 |
PPC_OP(glue(ecowx_le, MEMSUFFIX)) |
|
366 |
{ |
|
367 |
glue(st32r, MEMSUFFIX)(T0, T1); |
|
368 |
RETURN(); |
|
369 |
} |
|
370 |
|
|
191 | 371 |
#undef MEMSUFFIX |
b/target-ppc/translate.c | ||
---|---|---|
1046 | 1046 |
} |
1047 | 1047 |
|
1048 | 1048 |
/*** Integer load ***/ |
1049 |
#define op_ldst(name) (*gen_op_##name[ctx->mem_idx])() |
|
1049 | 1050 |
#if defined(CONFIG_USER_ONLY) |
1050 |
#define op_ldst(name) gen_op_##name##_raw() |
|
1051 |
#define OP_LD_TABLE(width) |
|
1052 |
#define OP_ST_TABLE(width) |
|
1051 |
#define OP_LD_TABLE(width) \ |
|
1052 |
static GenOpFunc *gen_op_l##width[] = { \ |
|
1053 |
&gen_op_l##width##_raw, \ |
|
1054 |
&gen_op_l##width##_le_raw, \ |
|
1055 |
}; |
|
1056 |
#define OP_ST_TABLE(width) \ |
|
1057 |
static GenOpFunc *gen_op_st##width[] = { \ |
|
1058 |
&gen_op_st##width##_raw, \ |
|
1059 |
&gen_op_st##width##_le_raw, \ |
|
1060 |
}; |
|
1061 |
/* Byte access routine are endian safe */ |
|
1062 |
#define gen_op_stb_le_raw gen_op_stb_raw |
|
1063 |
#define gen_op_lbz_le_raw gen_op_lbz_raw |
|
1053 | 1064 |
#else |
1054 |
#define op_ldst(name) (*gen_op_##name[ctx->mem_idx])() |
|
1055 | 1065 |
#define OP_LD_TABLE(width) \ |
1056 | 1066 |
static GenOpFunc *gen_op_l##width[] = { \ |
1057 | 1067 |
&gen_op_l##width##_user, \ |
1068 |
&gen_op_l##width##_le_user, \ |
|
1058 | 1069 |
&gen_op_l##width##_kernel, \ |
1059 |
} |
|
1070 |
&gen_op_l##width##_le_kernel, \ |
|
1071 |
}; |
|
1060 | 1072 |
#define OP_ST_TABLE(width) \ |
1061 | 1073 |
static GenOpFunc *gen_op_st##width[] = { \ |
1062 | 1074 |
&gen_op_st##width##_user, \ |
1075 |
&gen_op_st##width##_le_user, \ |
|
1063 | 1076 |
&gen_op_st##width##_kernel, \ |
1064 |
} |
|
1077 |
&gen_op_st##width##_le_kernel, \ |
|
1078 |
}; |
|
1079 |
/* Byte access routine are endian safe */ |
|
1080 |
#define gen_op_stb_le_user gen_op_stb_user |
|
1081 |
#define gen_op_lbz_le_user gen_op_lbz_user |
|
1082 |
#define gen_op_stb_le_kernel gen_op_stb_kernel |
|
1083 |
#define gen_op_lbz_le_kernel gen_op_lbz_kernel |
|
1065 | 1084 |
#endif |
1066 | 1085 |
|
1067 | 1086 |
#define GEN_LD(width, opc) \ |
... | ... | |
1232 | 1251 |
GEN_STX(wbr, 0x16, 0x14); |
1233 | 1252 |
|
1234 | 1253 |
/*** Integer load and store multiple ***/ |
1254 |
#define op_ldstm(name, reg) (*gen_op_##name[ctx->mem_idx])(reg) |
|
1235 | 1255 |
#if defined(CONFIG_USER_ONLY) |
1236 |
#define op_ldstm(name, reg) gen_op_##name##_raw(reg) |
|
1256 |
static GenOpFunc1 *gen_op_lmw[] = { |
|
1257 |
&gen_op_lmw_raw, |
|
1258 |
&gen_op_lmw_le_raw, |
|
1259 |
}; |
|
1260 |
static GenOpFunc1 *gen_op_stmw[] = { |
|
1261 |
&gen_op_stmw_raw, |
|
1262 |
&gen_op_stmw_le_raw, |
|
1263 |
}; |
|
1237 | 1264 |
#else |
1238 |
#define op_ldstm(name, reg) (*gen_op_##name[ctx->mem_idx])(reg) |
|
1239 | 1265 |
static GenOpFunc1 *gen_op_lmw[] = { |
1240 | 1266 |
&gen_op_lmw_user, |
1267 |
&gen_op_lmw_le_user, |
|
1241 | 1268 |
&gen_op_lmw_kernel, |
1269 |
&gen_op_lmw_le_kernel, |
|
1242 | 1270 |
}; |
1243 | 1271 |
static GenOpFunc1 *gen_op_stmw[] = { |
1244 | 1272 |
&gen_op_stmw_user, |
1273 |
&gen_op_stmw_le_user, |
|
1245 | 1274 |
&gen_op_stmw_kernel, |
1275 |
&gen_op_stmw_le_kernel, |
|
1246 | 1276 |
}; |
1247 | 1277 |
#endif |
1248 | 1278 |
|
... | ... | |
1277 | 1307 |
} |
1278 | 1308 |
|
1279 | 1309 |
/*** Integer load and store strings ***/ |
1280 |
#if defined(CONFIG_USER_ONLY) |
|
1281 |
#define op_ldsts(name, start) gen_op_##name##_raw(start) |
|
1282 |
#define op_ldstsx(name, rd, ra, rb) gen_op_##name##_raw(rd, ra, rb) |
|
1283 |
#else |
|
1284 | 1310 |
#define op_ldsts(name, start) (*gen_op_##name[ctx->mem_idx])(start) |
1285 | 1311 |
#define op_ldstsx(name, rd, ra, rb) (*gen_op_##name[ctx->mem_idx])(rd, ra, rb) |
1312 |
#if defined(CONFIG_USER_ONLY) |
|
1313 |
static GenOpFunc1 *gen_op_lswi[] = { |
|
1314 |
&gen_op_lswi_raw, |
|
1315 |
&gen_op_lswi_le_raw, |
|
1316 |
}; |
|
1317 |
static GenOpFunc3 *gen_op_lswx[] = { |
|
1318 |
&gen_op_lswx_raw, |
|
1319 |
&gen_op_lswx_le_raw, |
|
1320 |
}; |
|
1321 |
static GenOpFunc1 *gen_op_stsw[] = { |
|
1322 |
&gen_op_stsw_raw, |
|
1323 |
&gen_op_stsw_le_raw, |
|
1324 |
}; |
|
1325 |
#else |
|
1286 | 1326 |
static GenOpFunc1 *gen_op_lswi[] = { |
1287 | 1327 |
&gen_op_lswi_user, |
1328 |
&gen_op_lswi_le_user, |
|
1288 | 1329 |
&gen_op_lswi_kernel, |
1330 |
&gen_op_lswi_le_kernel, |
|
1289 | 1331 |
}; |
1290 | 1332 |
static GenOpFunc3 *gen_op_lswx[] = { |
1291 | 1333 |
&gen_op_lswx_user, |
1334 |
&gen_op_lswx_le_user, |
|
1292 | 1335 |
&gen_op_lswx_kernel, |
1336 |
&gen_op_lswx_le_kernel, |
|
1293 | 1337 |
}; |
1294 | 1338 |
static GenOpFunc1 *gen_op_stsw[] = { |
1295 | 1339 |
&gen_op_stsw_user, |
1340 |
&gen_op_stsw_le_user, |
|
1296 | 1341 |
&gen_op_stsw_kernel, |
1342 |
&gen_op_stsw_le_kernel, |
|
1297 | 1343 |
}; |
1298 | 1344 |
#endif |
1299 | 1345 |
|
... | ... | |
1389 | 1435 |
{ |
1390 | 1436 |
} |
1391 | 1437 |
|
1392 |
/* lwarx */ |
|
1438 |
#define op_lwarx() (*gen_op_lwarx[ctx->mem_idx])() |
|
1439 |
#define op_stwcx() (*gen_op_stwcx[ctx->mem_idx])() |
|
1393 | 1440 |
#if defined(CONFIG_USER_ONLY) |
1394 |
#define op_lwarx() gen_op_lwarx_raw() |
|
1395 |
#define op_stwcx() gen_op_stwcx_raw() |
|
1441 |
static GenOpFunc *gen_op_lwarx[] = { |
|
1442 |
&gen_op_lwarx_raw, |
|
1443 |
&gen_op_lwarx_le_raw, |
|
1444 |
}; |
|
1445 |
static GenOpFunc *gen_op_stwcx[] = { |
|
1446 |
&gen_op_stwcx_raw, |
|
1447 |
&gen_op_stwcx_le_raw, |
|
1448 |
}; |
|
1396 | 1449 |
#else |
1397 |
#define op_lwarx() (*gen_op_lwarx[ctx->mem_idx])() |
|
1398 | 1450 |
static GenOpFunc *gen_op_lwarx[] = { |
1399 | 1451 |
&gen_op_lwarx_user, |
1452 |
&gen_op_lwarx_le_user, |
|
1400 | 1453 |
&gen_op_lwarx_kernel, |
1454 |
&gen_op_lwarx_le_kernel, |
|
1401 | 1455 |
}; |
1402 |
#define op_stwcx() (*gen_op_stwcx[ctx->mem_idx])() |
|
1403 | 1456 |
static GenOpFunc *gen_op_stwcx[] = { |
1404 | 1457 |
&gen_op_stwcx_user, |
1458 |
&gen_op_stwcx_le_user, |
|
1405 | 1459 |
&gen_op_stwcx_kernel, |
1460 |
&gen_op_stwcx_le_kernel, |
|
1406 | 1461 |
}; |
1407 | 1462 |
#endif |
1408 | 1463 |
|
1464 |
/* lwarx */ |
|
1409 | 1465 |
GEN_HANDLER(lwarx, 0x1F, 0x14, 0xFF, 0x00000001, PPC_RES) |
1410 | 1466 |
{ |
1411 | 1467 |
if (rA(ctx->opcode) == 0) { |
... | ... | |
2498 | 2554 |
|
2499 | 2555 |
/*** External control ***/ |
2500 | 2556 |
/* Optional: */ |
2501 |
/* eciwx */ |
|
2502 |
#if defined(CONFIG_USER_ONLY) |
|
2503 |
#define op_eciwx() gen_op_eciwx_raw() |
|
2504 |
#define op_ecowx() gen_op_ecowx_raw() |
|
2505 |
#else |
|
2506 | 2557 |
#define op_eciwx() (*gen_op_eciwx[ctx->mem_idx])() |
2507 | 2558 |
#define op_ecowx() (*gen_op_ecowx[ctx->mem_idx])() |
2559 |
#if defined(CONFIG_USER_ONLY) |
|
2560 |
static GenOpFunc *gen_op_eciwx[] = { |
|
2561 |
&gen_op_eciwx_raw, |
|
2562 |
&gen_op_eciwx_le_raw, |
|
2563 |
}; |
|
2564 |
static GenOpFunc *gen_op_ecowx[] = { |
|
2565 |
&gen_op_ecowx_raw, |
|
2566 |
&gen_op_ecowx_le_raw, |
|
2567 |
}; |
|
2568 |
#else |
|
2508 | 2569 |
static GenOpFunc *gen_op_eciwx[] = { |
2509 | 2570 |
&gen_op_eciwx_user, |
2571 |
&gen_op_eciwx_le_user, |
|
2510 | 2572 |
&gen_op_eciwx_kernel, |
2573 |
&gen_op_eciwx_le_kernel, |
|
2511 | 2574 |
}; |
2512 | 2575 |
static GenOpFunc *gen_op_ecowx[] = { |
2513 | 2576 |
&gen_op_ecowx_user, |
2577 |
&gen_op_ecowx_le_user, |
|
2514 | 2578 |
&gen_op_ecowx_kernel, |
2579 |
&gen_op_ecowx_le_kernel, |
|
2515 | 2580 |
}; |
2516 | 2581 |
#endif |
2517 | 2582 |
|
2583 |
/* eciwx */ |
|
2518 | 2584 |
GEN_HANDLER(eciwx, 0x1F, 0x16, 0x0D, 0x00000001, PPC_EXTERN) |
2519 | 2585 |
{ |
2520 | 2586 |
/* Should check EAR[E] & alignment ! */ |
... | ... | |
3143 | 3209 |
ctx.tb = tb; |
3144 | 3210 |
ctx.exception = EXCP_NONE; |
3145 | 3211 |
#if defined(CONFIG_USER_ONLY) |
3146 |
ctx.mem_idx = 0;
|
|
3212 |
ctx.mem_idx = msr_le;
|
|
3147 | 3213 |
#else |
3148 | 3214 |
ctx.supervisor = 1 - msr_pr; |
3149 |
ctx.mem_idx = 1 - msr_pr;
|
|
3215 |
ctx.mem_idx = ((1 - msr_pr) << 1) | msr_le;
|
|
3150 | 3216 |
#endif |
3151 | 3217 |
ctx.fpu_enabled = msr_fp; |
3152 | 3218 |
#if defined (DO_SINGLE_STEP) |
... | ... | |
3173 | 3239 |
} |
3174 | 3240 |
#endif |
3175 | 3241 |
ctx.opcode = ldl_code(ctx.nip); |
3242 |
if (msr_le) { |
|
3243 |
ctx.opcode = ((ctx.opcode & 0xFF000000) >> 24) | |
|
3244 |
((ctx.opcode & 0x00FF0000) >> 8) | |
|
3245 |
((ctx.opcode & 0x0000FF00) << 8) | |
|
3246 |
((ctx.opcode & 0x000000FF) << 24); |
|
3247 |
} |
|
3176 | 3248 |
#if defined PPC_DEBUG_DISAS |
3177 | 3249 |
if (loglevel & CPU_LOG_TB_IN_ASM) { |
3178 |
fprintf(logfile, "translate opcode %08x (%02x %02x %02x)\n", |
|
3250 |
fprintf(logfile, "translate opcode %08x (%02x %02x %02x) (%s)\n",
|
|
3179 | 3251 |
ctx.opcode, opc1(ctx.opcode), opc2(ctx.opcode), |
3180 |
opc3(ctx.opcode)); |
|
3252 |
opc3(ctx.opcode), msr_le ? "little" : "big");
|
|
3181 | 3253 |
} |
3182 | 3254 |
#endif |
3183 | 3255 |
ctx.nip += 4; |
Also available in: Unified diff