Revision a541f297 gdbstub.c
b/gdbstub.c | ||
---|---|---|
220 | 220 |
} |
221 | 221 |
|
222 | 222 |
#elif defined (TARGET_PPC) |
223 |
static void to_le32(uint8_t *p, int v)
|
|
223 |
static void to_le32(uint32_t *buf, uint32_t v)
|
|
224 | 224 |
{ |
225 |
uint8_t *p = (uint8_t *)buf; |
|
225 | 226 |
p[3] = v; |
226 | 227 |
p[2] = v >> 8; |
227 | 228 |
p[1] = v >> 16; |
228 | 229 |
p[0] = v >> 24; |
229 | 230 |
} |
230 | 231 |
|
232 |
static uint32_t from_le32 (uint32_t *buf) |
|
233 |
{ |
|
234 |
uint8_t *p = (uint8_t *)buf; |
|
235 |
|
|
236 |
return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24); |
|
237 |
} |
|
238 |
|
|
231 | 239 |
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf) |
232 | 240 |
{ |
233 |
uint32_t tmp; |
|
241 |
uint32_t *registers = (uint32_t *)mem_buf, tmp;
|
|
234 | 242 |
int i; |
235 | 243 |
|
236 | 244 |
/* fill in gprs */ |
237 |
for(i = 0; i < 8; i++) {
|
|
238 |
to_le32(mem_buf + i * 4, env->gpr[i]);
|
|
245 |
for(i = 0; i < 32; i++) {
|
|
246 |
to_le32(®isters[i], env->gpr[i]);
|
|
239 | 247 |
} |
240 | 248 |
/* fill in fprs */ |
241 | 249 |
for (i = 0; i < 32; i++) { |
242 |
to_le32(mem_buf + (i * 2) + 32, *((uint32_t *)&env->fpr[i]));
|
|
243 |
to_le32(mem_buf + (i * 2) + 33, *((uint32_t *)&env->fpr[i] + 1));
|
|
250 |
to_le32(®isters[(i * 2) + 32], *((uint32_t *)&env->fpr[i]));
|
|
251 |
to_le32(®isters[(i * 2) + 33], *((uint32_t *)&env->fpr[i] + 1));
|
|
244 | 252 |
} |
245 | 253 |
/* nip, msr, ccr, lnk, ctr, xer, mq */ |
246 |
to_le32(mem_buf + 96, tswapl(env->nip)); |
|
247 |
to_le32(mem_buf + 97, tswapl(_load_msr())); |
|
248 |
to_le32(mem_buf + 98, 0); |
|
254 |
to_le32(®isters[96], (uint32_t)env->nip/* - 4*/); |
|
255 |
to_le32(®isters[97], _load_msr(env)); |
|
249 | 256 |
tmp = 0; |
250 | 257 |
for (i = 0; i < 8; i++) |
251 |
tmp |= env->crf[i] << (32 - (i * 4));
|
|
252 |
to_le32(mem_buf + 98, tmp);
|
|
253 |
to_le32(mem_buf + 99, tswapl(env->lr));
|
|
254 |
to_le32(mem_buf + 100, tswapl(env->ctr));
|
|
255 |
to_le32(mem_buf + 101, tswapl(_load_xer()));
|
|
256 |
to_le32(mem_buf + 102, 0);
|
|
257 |
|
|
258 |
return 102;
|
|
258 |
tmp |= env->crf[i] << (32 - ((i + 1) * 4));
|
|
259 |
to_le32(®isters[98], tmp);
|
|
260 |
to_le32(®isters[99], env->lr);
|
|
261 |
to_le32(®isters[100], env->ctr);
|
|
262 |
to_le32(®isters[101], _load_xer(env));
|
|
263 |
to_le32(®isters[102], 0);
|
|
264 |
|
|
265 |
return 103 * 4;
|
|
259 | 266 |
} |
260 | 267 |
|
261 | 268 |
static void cpu_gdb_write_registers(CPUState *env, uint8_t *mem_buf, int size) |
... | ... | |
265 | 272 |
|
266 | 273 |
/* fill in gprs */ |
267 | 274 |
for (i = 0; i < 32; i++) { |
268 |
env->gpr[i] = tswapl(registers[i]);
|
|
275 |
env->gpr[i] = from_le32(®isters[i]);
|
|
269 | 276 |
} |
270 | 277 |
/* fill in fprs */ |
271 | 278 |
for (i = 0; i < 32; i++) { |
272 |
*((uint32_t *)&env->fpr[i]) = tswapl(registers[(i * 2) + 32]);
|
|
273 |
*((uint32_t *)&env->fpr[i] + 1) = tswapl(registers[(i * 2) + 33]);
|
|
279 |
*((uint32_t *)&env->fpr[i]) = from_le32(®isters[(i * 2) + 32]);
|
|
280 |
*((uint32_t *)&env->fpr[i] + 1) = from_le32(®isters[(i * 2) + 33]);
|
|
274 | 281 |
} |
275 | 282 |
/* nip, msr, ccr, lnk, ctr, xer, mq */ |
276 |
env->nip = tswapl(registers[96]);
|
|
277 |
_store_msr(tswapl(registers[97]));
|
|
278 |
registers[98] = tswapl(registers[98]);
|
|
283 |
env->nip = from_le32(®isters[96]);
|
|
284 |
_store_msr(env, from_le32(®isters[97]));
|
|
285 |
registers[98] = from_le32(®isters[98]);
|
|
279 | 286 |
for (i = 0; i < 8; i++) |
280 |
env->crf[i] = (registers[98] >> (32 - (i * 4))) & 0xF;
|
|
281 |
env->lr = tswapl(registers[99]);
|
|
282 |
env->ctr = tswapl(registers[100]);
|
|
283 |
_store_xer(tswapl(registers[101]));
|
|
287 |
env->crf[i] = (registers[98] >> (32 - ((i + 1) * 4))) & 0xF;
|
|
288 |
env->lr = from_le32(®isters[99]);
|
|
289 |
env->ctr = from_le32(®isters[100]);
|
|
290 |
_store_xer(env, from_le32(®isters[101]));
|
|
284 | 291 |
} |
285 | 292 |
#else |
286 | 293 |
|
Also available in: Unified diff