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(&registers[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(&registers[(i * 2) + 32], *((uint32_t *)&env->fpr[i]));
251
	to_le32(&registers[(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(&registers[96], (uint32_t)env->nip/* - 4*/);
255
    to_le32(&registers[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(&registers[98], tmp);
260
    to_le32(&registers[99], env->lr);
261
    to_le32(&registers[100], env->ctr);
262
    to_le32(&registers[101], _load_xer(env));
263
    to_le32(&registers[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(&registers[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(&registers[(i * 2) + 32]);
280
	*((uint32_t *)&env->fpr[i] + 1) = from_le32(&registers[(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(&registers[96]);
284
    _store_msr(env, from_le32(&registers[97]));
285
    registers[98] = from_le32(&registers[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(&registers[99]);
289
    env->ctr = from_le32(&registers[100]);
290
    _store_xer(env, from_le32(&registers[101]));
284 291
}
285 292
#else
286 293

  

Also available in: Unified diff