Commit 19bf517b7f7f3a24c463bca932fdab4ba2684e55
1 parent
cd5158ea
target-alpha: gdb-stub support
(Vince Weaver) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5945 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
60 additions
and
1 deletions
gdbstub.c
... | ... | @@ -990,6 +990,56 @@ static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n) |
990 | 990 | |
991 | 991 | return 4; |
992 | 992 | } |
993 | +#elif defined (TARGET_ALPHA) | |
994 | + | |
995 | +#define NUM_CORE_REGS 65 | |
996 | + | |
997 | +static int cpu_gdb_read_register(CPUState *env, uint8_t *mem_buf, int n) | |
998 | +{ | |
999 | + if (n < 31) { | |
1000 | + GET_REGL(env->ir[n]); | |
1001 | + } | |
1002 | + else if (n == 31) { | |
1003 | + GET_REGL(0); | |
1004 | + } | |
1005 | + else if (n<63) { | |
1006 | + uint64_t val; | |
1007 | + | |
1008 | + val=*((uint64_t *)&env->fir[n-32]); | |
1009 | + GET_REGL(val); | |
1010 | + } | |
1011 | + else if (n==63) { | |
1012 | + GET_REGL(env->fpcr); | |
1013 | + } | |
1014 | + else if (n==64) { | |
1015 | + GET_REGL(env->pc); | |
1016 | + } | |
1017 | + else { | |
1018 | + GET_REGL(0); | |
1019 | + } | |
1020 | + | |
1021 | + return 0; | |
1022 | +} | |
1023 | + | |
1024 | +static int cpu_gdb_write_register(CPUState *env, uint8_t *mem_buf, int n) | |
1025 | +{ | |
1026 | + target_ulong tmp; | |
1027 | + tmp = ldtul_p(mem_buf); | |
1028 | + | |
1029 | + if (n < 31) { | |
1030 | + env->ir[n] = tmp; | |
1031 | + } | |
1032 | + | |
1033 | + if (n > 31 && n < 63) { | |
1034 | + env->fir[n - 32] = ldfl_p(mem_buf); | |
1035 | + } | |
1036 | + | |
1037 | + if (n == 64 ) { | |
1038 | + env->pc=tmp; | |
1039 | + } | |
1040 | + | |
1041 | + return 8; | |
1042 | +} | |
993 | 1043 | #else |
994 | 1044 | |
995 | 1045 | #define NUM_CORE_REGS 0 |
... | ... | @@ -1277,6 +1327,8 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf) |
1277 | 1327 | s->c_cpu->active_tc.PC = addr; |
1278 | 1328 | #elif defined (TARGET_CRIS) |
1279 | 1329 | s->c_cpu->pc = addr; |
1330 | +#elif defined (TARGET_ALPHA) | |
1331 | + s->c_cpu->pc = addr; | |
1280 | 1332 | #endif |
1281 | 1333 | } |
1282 | 1334 | gdb_continue(s); |
... | ... | @@ -1313,6 +1365,8 @@ static int gdb_handle_packet(GDBState *s, const char *line_buf) |
1313 | 1365 | s->c_cpu->active_tc.PC = addr; |
1314 | 1366 | #elif defined (TARGET_CRIS) |
1315 | 1367 | s->c_cpu->pc = addr; |
1368 | +#elif defined (TARGET_ALPHA) | |
1369 | + s->c_cpu->pc = addr; | |
1316 | 1370 | #endif |
1317 | 1371 | } |
1318 | 1372 | cpu_single_step(s->c_cpu, sstep_flags); | ... | ... |
target-alpha/translate.c
... | ... | @@ -2407,10 +2407,15 @@ static always_inline void gen_intermediate_code_internal (CPUState *env, |
2407 | 2407 | * generation |
2408 | 2408 | */ |
2409 | 2409 | if (((ctx.pc & (TARGET_PAGE_SIZE - 1)) == 0) || |
2410 | - (env->singlestep_enabled) || | |
2411 | 2410 | num_insns >= max_insns) { |
2412 | 2411 | break; |
2413 | 2412 | } |
2413 | + | |
2414 | + if (env->singlestep_enabled) { | |
2415 | + gen_excp(&ctx, EXCP_DEBUG, 0); | |
2416 | + break; | |
2417 | + } | |
2418 | + | |
2414 | 2419 | #if defined (DO_SINGLE_STEP) |
2415 | 2420 | break; |
2416 | 2421 | #endif | ... | ... |