debug.c
来自「ppc750 system design simulator using sys」· C语言 代码 · 共 335 行
C
335 行
/*************************************************************************** debug.c - description ------------------- begin : Sun Sep 30 2001 copyright : (C) 2001 Universite Paris Sud and CEA author : Gilles Mouchard email : gilles.mouchard@lri.fr, gilles.mouchard@cea.fr ***************************************************************************//*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/#include <ppcemul.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <signal.h>BOOL debuging = FALSE;static void sigint_handler(int signum){ if(debuging) { debuging = FALSE; } else { exit(0); }}void ppc_debug_disasm(FILE *stream, addr_t addr){ int i; ppc_inst_t inst; char disasm[256]; for(i = 0; i < 10; i++, addr += 4) { inst = ppc_fetch(addr); ppc_disassemble(inst, addr, disasm); fprintf(stream, "0x%08x : 0x%08x %s\n", addr, inst, disasm); }}void ppc_debug_dump(FILE *stream, addr_t addr){ int i, j; fprintf(stream, " address 0 1 2 3 4 5 6 7 8 9 a b c d e f\n"); for(i = 0; i < 16; i++) { fprintf(stream, "0x%08x: ", addr); for(j = 0; j < 16; j++, addr++) { fprintf(stream, "%02x", MEM_READ_BYTE(addr)); if(j < 15) fprintf(stream, " "); } fprintf(stream, "\n"); }}void ppc_debug_go_to(addr_t addr){ ppc_inst_t inst; void (*prev_sigint_handler)(int); char disasm[256]; debuging = TRUE; prev_sigint_handler = signal(SIGINT, sigint_handler); do { inst = ppc_fetch(PC); ppc_execute(inst); } while(debuging && PC != addr); if(prev_sigint_handler != SIG_ERR) signal(SIGINT, SIG_DFL); inst = ppc_fetch(PC); ppc_disassemble(inst, PC, disasm); printf("0x%08x : 0x%08x %s\n", PC, inst, disasm);}void ppc_debug_trace(int count){ ppc_inst_t inst; char disasm[256]; while(count > 0) { inst = ppc_fetch(PC); ppc_execute(inst); count--; } inst = ppc_fetch(PC); ppc_disassemble(inst, PC, disasm); printf("0x%08x : 0x%08x %s\n", PC, inst, disasm);}void ppc_debug_dump_registers(FILE *stream){ int i, j, n; char s[256]; for(n = 0, i = 0; i < 8; i++) { for(j = 0; j < 4; j++, n++) { sprintf(s, "r%u = 0x%08x", n, GPR(n)); fprintf(stream, "%17s", s); if(j < 3) fprintf(stream, " "); } fprintf(stream, "\n"); } for(n = 0, i = 0; i < 16; i++) { for(j = 0; j < 2; j++, n++) { sprintf(s, "f%u = 0x%08x%08x", n, (word_t)(FPR_DW(n) >> 32), (word_t) FPR_DW(n)); fprintf(stream, "%25s", s); if(j < 1) fprintf(stream, " "); } fprintf(stream, "\n"); } fprintf(stream, "XER[SO] = %d\n", XER_SO); fprintf(stream, "XER[OV] = %d\n", XER_OV); fprintf(stream, "XER[CA] = %d\n", XER_CA);}BOOL get_addr(char *s, addr_t *addr){ return sscanf(s, "%x", addr) == 1 || sscanf(s, "0x%x", addr) == 1;}char *my_gets(char *p, int size){ char *ret = fgets(p, size, stdin); if(ret) { int l = strlen(p); if(l > 0) p[l - 1] = 0; } return ret;}void ppc_debug(){ addr_t disasm_addr = PC; addr_t dump_addr = PC; addr_t addr; unsigned int reg_num; int nparms; int count; char line[256]; char last_line[256]; char parm[8][32]; BOOL old_emulate_syscall = emulate_syscall; syscall_cb_t old_cb; syscall_getcb(&old_cb); syscall_setcb(NULL); emulate_syscall = TRUE; strcpy(last_line, ""); strcpy(line, ""); do { if(strcmp(line, "") == 0) { strcpy(line, last_line); } nparms = sscanf(line, "%s %s %s %s %s %s %s %s", parm[0], parm[1], parm[2], parm[3], parm[4], parm[5], parm[6], parm[7]); switch(nparms) { case 1: if(strcmp(parm[0], "u") == 0) { ppc_debug_disasm(stdout, disasm_addr); disasm_addr += 10 * 4; break; } if(strcmp(parm[0], "d") == 0) { ppc_debug_dump(stdout, dump_addr); dump_addr += 16 * 16; break; } if(strcmp(parm[0], "g") == 0) { ppc_debug_go_to(0); break; } if(strcmp(parm[0], "pc") == 0) { printf("PC = 0x%08x\n", PC); break; } if(strcmp(parm[0], "cr") == 0) { printf("CR = 0x%08x\n", CR); break; } if(strcmp(parm[0], "lr") == 0) { printf("LR = 0x%08x\n", LR); break; } if(strcmp(parm[0], "ctr") == 0) { printf("CTR = 0x%08x\n", CTR); break; } if(strcmp(parm[0], "xer") == 0) { printf("XER = 0x%08x\n", XER); } if(strcmp(parm[0], "r") == 0) { ppc_debug_dump_registers(stdout); break; } if(sscanf(parm[0], "r%u", ®_num) == 1) { printf("r%u = 0x%08x\n", reg_num, GPR(reg_num)); break; } if(strcmp(parm[0], "t") == 0) { ppc_debug_trace(1); break; } if(strcmp(parm[0], "q") == 0) { return; } if(strcmp(parm[0], "c") == 0) { ppc_dump_instruction_counters(stdout); break; } if(strcmp(parm[0], "cc") == 0) { ppc_clear_instruction_counters(); break; } break; case 2: if(strcmp(parm[0], "u") == 0 && get_addr(parm[1], &disasm_addr)) { ppc_debug_disasm(stdout, disasm_addr); disasm_addr += 10 * 4; break; } if(strcmp(parm[0], "d") == 0 && get_addr(parm[1], &dump_addr)) { ppc_debug_dump(stdout, dump_addr); dump_addr += 16 * 16; break; } if(strcmp(parm[0], "u") == 0 && strcmp(parm[1], "pc") == 0) { disasm_addr = PC; ppc_debug_disasm(stdout, disasm_addr); disasm_addr += 10 * 4; break; } if(strcmp(parm[0], "g") == 0 && get_addr(parm[1], &addr)) { ppc_debug_go_to(addr); break; } if(strcmp(parm[0], "t") == 0 && sscanf(parm[1], "%d", &count) == 1) { ppc_debug_trace(count); break; } if(strcmp(parm[0], "s") == 0) { ppc_save(parm[1]); break; } if(strcmp(parm[0], "l") == 0) { ppc_restore(parm[1]); break; } break; } strcpy(last_line, line); printf("> "); } while(my_gets(line, sizeof(line))); emulate_syscall = old_emulate_syscall; syscall_setcb(&old_cb);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?