307
307
registers[98] = tswapl(tmp);
308
308
registers[99] = tswapl(env->lr);
309
309
registers[100] = tswapl(env->ctr);
310
registers[101] = tswapl(do_load_xer(env));
310
registers[101] = tswapl(ppc_load_xer(env));
311
311
registers[102] = 0;
335
335
env->crf[i] = (registers[98] >> (32 - ((i + 1) * 4))) & 0xF;
336
336
env->lr = tswapl(registers[99]);
337
337
env->ctr = tswapl(registers[100]);
338
do_store_xer(env, tswapl(registers[101]));
338
ppc_store_xer(env, tswapl(registers[101]));
340
340
#elif defined (TARGET_SPARC)
341
341
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
377
377
for (i = 0; i < 64; i += 2) {
380
tmp = (uint64_t)tswap32(*((uint32_t *)&env->fpr[i])) << 32;
381
tmp |= tswap32(*((uint32_t *)&env->fpr[i + 1]));
382
registers[i/2 + 32] = tmp;
380
tmp = ((uint64_t)*(uint32_t *)&env->fpr[i]) << 32;
381
tmp |= *(uint32_t *)&env->fpr[i + 1];
382
registers[i / 2 + 32] = tswap64(tmp);
384
384
registers[64] = tswapl(env->pc);
385
385
registers[65] = tswapl(env->npc);
386
registers[66] = tswapl(env->tstate[env->tl]);
386
registers[66] = tswapl(((uint64_t)GET_CCR(env) << 32) |
387
((env->asi & 0xff) << 24) |
388
((env->pstate & 0xfff) << 8) |
387
390
registers[67] = tswapl(env->fsr);
388
391
registers[68] = tswapl(env->fprs);
389
392
registers[69] = tswapl(env->y);
419
422
env->fsr = tswapl(registers[70]);
421
424
for (i = 0; i < 64; i += 2) {
422
*((uint32_t *)&env->fpr[i]) = tswap32(registers[i/2 + 32] >> 32);
423
*((uint32_t *)&env->fpr[i + 1]) = tswap32(registers[i/2 + 32] & 0xffffffff);
427
tmp = tswap64(registers[i / 2 + 32]);
428
*((uint32_t *)&env->fpr[i]) = tmp >> 32;
429
*((uint32_t *)&env->fpr[i + 1]) = tmp & 0xffffffff;
425
431
env->pc = tswapl(registers[64]);
426
432
env->npc = tswapl(registers[65]);
427
env->tstate[env->tl] = tswapl(registers[66]);
434
uint64_t tmp = tswapl(registers[66]);
436
PUT_CCR(env, tmp >> 32);
437
env->asi = (tmp >> 24) & 0xff;
438
env->pstate = (tmp >> 8) & 0xfff;
439
PUT_CWP64(env, tmp & 0xff);
428
441
env->fsr = tswapl(registers[67]);
429
442
env->fprs = tswapl(registers[68]);
430
443
env->y = tswapl(registers[69]);
547
560
for (i = 0; i < 32; i++)
549
*(uint32_t *)ptr = tswapl(env->gpr[i]);
562
*(target_ulong *)ptr = tswapl(env->gpr[i]);
563
ptr += sizeof(target_ulong);
553
*(uint32_t *)ptr = tswapl(env->CP0_Status);
556
*(uint32_t *)ptr = tswapl(env->LO);
559
*(uint32_t *)ptr = tswapl(env->HI);
562
*(uint32_t *)ptr = tswapl(env->CP0_BadVAddr);
565
*(uint32_t *)ptr = tswapl(env->CP0_Cause);
568
*(uint32_t *)ptr = tswapl(env->PC);
572
for (i = 0; i < 32; i++)
566
*(target_ulong *)ptr = tswapl(env->CP0_Status);
567
ptr += sizeof(target_ulong);
569
*(target_ulong *)ptr = tswapl(env->LO);
570
ptr += sizeof(target_ulong);
572
*(target_ulong *)ptr = tswapl(env->HI);
573
ptr += sizeof(target_ulong);
575
*(target_ulong *)ptr = tswapl(env->CP0_BadVAddr);
576
ptr += sizeof(target_ulong);
578
*(target_ulong *)ptr = tswapl(env->CP0_Cause);
579
ptr += sizeof(target_ulong);
581
*(target_ulong *)ptr = tswapl(env->PC);
582
ptr += sizeof(target_ulong);
584
if (env->CP0_Config1 & (1 << CP0C1_FP))
574
*(uint32_t *)ptr = tswapl(FPR_W (env, i));
586
for (i = 0; i < 32; i++)
588
*(target_ulong *)ptr = tswapl(env->fpr[i].fs[FP_ENDIAN_IDX]);
589
ptr += sizeof(target_ulong);
592
*(target_ulong *)ptr = tswapl(env->fcr31);
593
ptr += sizeof(target_ulong);
595
*(target_ulong *)ptr = tswapl(env->fcr0);
596
ptr += sizeof(target_ulong);
578
*(uint32_t *)ptr = tswapl(env->fcr31);
581
*(uint32_t *)ptr = tswapl(env->fcr0);
585
599
/* 32 FP registers, fsr, fir, fp. Not yet implemented. */
586
600
/* what's 'fp' mean here? */
608
622
for (i = 0; i < 32; i++)
610
env->gpr[i] = tswapl(*(uint32_t *)ptr);
624
env->gpr[i] = tswapl(*(target_ulong *)ptr);
625
ptr += sizeof(target_ulong);
614
env->CP0_Status = tswapl(*(uint32_t *)ptr);
617
env->LO = tswapl(*(uint32_t *)ptr);
620
env->HI = tswapl(*(uint32_t *)ptr);
623
env->CP0_BadVAddr = tswapl(*(uint32_t *)ptr);
626
env->CP0_Cause = tswapl(*(uint32_t *)ptr);
629
env->PC = tswapl(*(uint32_t *)ptr);
633
for (i = 0; i < 32; i++)
628
env->CP0_Status = tswapl(*(target_ulong *)ptr);
629
ptr += sizeof(target_ulong);
631
env->LO = tswapl(*(target_ulong *)ptr);
632
ptr += sizeof(target_ulong);
634
env->HI = tswapl(*(target_ulong *)ptr);
635
ptr += sizeof(target_ulong);
637
env->CP0_BadVAddr = tswapl(*(target_ulong *)ptr);
638
ptr += sizeof(target_ulong);
640
env->CP0_Cause = tswapl(*(target_ulong *)ptr);
641
ptr += sizeof(target_ulong);
643
env->PC = tswapl(*(target_ulong *)ptr);
644
ptr += sizeof(target_ulong);
646
if (env->CP0_Config1 & (1 << CP0C1_FP))
635
FPR_W (env, i) = tswapl(*(uint32_t *)ptr);
639
env->fcr31 = tswapl(*(uint32_t *)ptr) & 0x0183FFFF;
642
env->fcr0 = tswapl(*(uint32_t *)ptr);
645
/* set rounding mode */
646
RESTORE_ROUNDING_MODE;
648
for (i = 0; i < 32; i++)
650
env->fpr[i].fs[FP_ENDIAN_IDX] = tswapl(*(target_ulong *)ptr);
651
ptr += sizeof(target_ulong);
654
env->fcr31 = tswapl(*(target_ulong *)ptr) & 0x0183FFFF;
655
ptr += sizeof(target_ulong);
657
env->fcr0 = tswapl(*(target_ulong *)ptr);
658
ptr += sizeof(target_ulong);
660
/* set rounding mode */
661
RESTORE_ROUNDING_MODE;
648
663
#ifndef CONFIG_SOFTFLOAT
649
/* no floating point exception for native float */
650
SET_FP_ENABLE(env->fcr31, 0);
664
/* no floating point exception for native float */
665
SET_FP_ENABLE(env->fcr31, 0);
654
669
#elif defined (TARGET_SH4)
671
/* Hint: Use "set architecture sh4" in GDB to see fpu registers */
655
673
static int cpu_gdb_read_registers(CPUState *env, uint8_t *mem_buf)
657
675
uint32_t *ptr = (uint32_t *)mem_buf;
879
922
if (strncmp(p, "Offsets", 7) == 0) {
880
923
TaskState *ts = env->opaque;
882
sprintf(buf, "Text=%x;Data=%x;Bss=%x", ts->info->code_offset,
883
ts->info->data_offset, ts->info->data_offset);
926
"Text=" TARGET_FMT_lx ";Data=" TARGET_FMT_lx ";Bss=" TARGET_FMT_lx,
927
ts->info->code_offset,
928
ts->info->data_offset,
929
ts->info->data_offset);
884
930
put_packet(s, buf);
912
958
cpu_single_step(s->env, 0);
914
960
if (reason == EXCP_DEBUG) {
961
if (s->env->watchpoint_hit) {
962
snprintf(buf, sizeof(buf), "T%02xwatch:" TARGET_FMT_lx ";",
964
s->env->watchpoint[s->env->watchpoint_hit - 1].vaddr);
966
s->env->watchpoint_hit = 0;
915
969
tb_flush(s->env);
917
971
} else if (reason == EXCP_INTERRUPT) {
927
981
/* Send a gdb syscall request.
928
982
This accepts limited printf-style format specifiers, specifically:
929
%x - target_ulong argument printed in hex.
930
%s - string pointer (target_ulong) and length (int) pair. */
983
%x - target_ulong argument printed in hex.
984
%lx - 64-bit argument printed in hex.
985
%s - string pointer (target_ulong) and length (int) pair. */
931
986
void gdb_do_syscall(gdb_syscall_complete_cb cb, char *fmt, ...)
936
991
target_ulong addr;
939
995
s = gdb_syscall_state;
956
1012
addr = va_arg(va, target_ulong);
957
1013
p += sprintf(p, TARGET_FMT_lx, addr);
1016
if (*(fmt++) != 'x')
1018
i64 = va_arg(va, uint64_t);
1019
p += sprintf(p, "%" PRIx64, i64);
960
1022
addr = va_arg(va, target_ulong);
961
1023
p += sprintf(p, TARGET_FMT_lx "/%x", addr, va_arg(va, int));
964
1027
fprintf(stderr, "gdbstub: Bad syscall format string '%s'\n",
1192
static int gdb_chr_can_recieve(void *opaque)
1256
static int gdb_chr_can_receive(void *opaque)
1197
static void gdb_chr_recieve(void *opaque, const uint8_t *buf, int size)
1261
static void gdb_chr_receive(void *opaque, const uint8_t *buf, int size)
1199
1263
GDBState *s = opaque;
1219
int gdbserver_start(CharDriverState *chr)
1283
int gdbserver_start(const char *port)
1286
char gdbstub_port_name[128];
1289
CharDriverState *chr;
1291
if (!port || !*port)
1294
port_num = strtol(port, &p, 10);
1296
/* A numeric value is interpreted as a port number. */
1297
snprintf(gdbstub_port_name, sizeof(gdbstub_port_name),
1298
"tcp::%d,nowait,nodelay,server", port_num);
1299
port = gdbstub_port_name;
1302
chr = qemu_chr_open(port);
1230
1310
s->env = first_cpu; /* XXX: allow to change CPU */
1232
qemu_chr_add_handlers(chr, gdb_chr_can_recieve, gdb_chr_recieve,
1312
qemu_chr_add_handlers(chr, gdb_chr_can_receive, gdb_chr_receive,
1233
1313
gdb_chr_event, s);
1234
1314
qemu_add_vm_stop_handler(gdb_vm_stopped, s);
1238
int gdbserver_start_port(int port)
1240
CharDriverState *chr;
1241
char gdbstub_port_name[128];
1243
snprintf(gdbstub_port_name, sizeof(gdbstub_port_name),
1244
"tcp::%d,nowait,nodelay,server", port);
1245
chr = qemu_chr_open(gdbstub_port_name);
1248
return gdbserver_start(chr);