提交 1b866a65 编写于 作者: Z Zihao Yu

Merge branch 'improve-debug' into 'rv64'

Improve debug

See merge request projectn/nemu!20
......@@ -17,6 +17,10 @@
fprintf(stderr, "\33[1;31m"); \
fprintf(stderr, __VA_ARGS__); \
fprintf(stderr, "\33[0m\n"); \
extern void isa_reg_display(); \
extern void monitor_statistic(); \
isa_reg_display(); \
monitor_statistic(); \
assert(cond); \
} \
} while (0)
......
......@@ -7,7 +7,8 @@
extern FILE* log_fp;
# define log_write(...) \
do { \
if (log_fp != NULL) { \
extern bool log_enable(); \
if (log_fp != NULL && log_enable()) { \
fprintf(log_fp, __VA_ARGS__); \
fflush(log_fp); \
} \
......
#include "nemu.h"
#include "monitor/monitor.h"
#include "monitor/watchpoint.h"
#include "monitor/diff-test.h"
#include <stdlib.h>
/* The assembly code of instructions executed is only output to the screen
* when the number of instructions executed is less than this value.
......@@ -9,10 +11,16 @@
*/
#define MAX_INSTR_TO_PRINT 10
/* restrict the size of log file */
#define LOG_MAX (1024 * 1024)
// control when the log is printed
#define LOG_START (0)
// restrict the size of log file
#define LOG_END (1024 * 1024 * 50)
NEMUState nemu_state = {.state = NEMU_STOP};
static uint64_t g_nr_guest_instr = 0;
vaddr_t exec_once(void);
void asm_print(vaddr_t ori_pc, int instr_len, bool print_flag);
int goodtrap(void) {
return (nemu_state.state == NEMU_END && nemu_state.halt_ret == 0);
......@@ -22,16 +30,14 @@ void interpret_rtl_exit(int state, vaddr_t halt_pc, uint32_t halt_ret) {
nemu_state = (NEMUState) { .state = state, .halt_pc = halt_pc, .halt_ret = halt_ret };
}
vaddr_t exec_once(void);
void difftest_step(vaddr_t ori_pc, vaddr_t next_pc);
void asm_print(vaddr_t ori_pc, int instr_len, bool print_flag);
static uint64_t g_nr_guest_instr = 0;
void monitor_statistic(void) {
Log("total guest instructions = %ld", g_nr_guest_instr);
}
bool log_enable(void) {
return (g_nr_guest_instr >= LOG_START) && (g_nr_guest_instr <= LOG_END);
}
/* Simulate how the CPU works. */
void cpu_exec(uint64_t n) {
switch (nemu_state.state) {
......@@ -48,19 +54,12 @@ void cpu_exec(uint64_t n) {
* instruction decode, and the actual execution. */
__attribute__((unused)) vaddr_t seq_pc = exec_once();
#if defined(DIFF_TEST)
difftest_step(ori_pc, cpu.pc);
#endif
difftest_step(ori_pc, cpu.pc);
g_nr_guest_instr ++;
#ifdef DEBUG
if (g_nr_guest_instr < LOG_MAX) {
asm_print(ori_pc, seq_pc - ori_pc, n < MAX_INSTR_TO_PRINT);
}
else if (g_nr_guest_instr == LOG_MAX) {
log_write("\n[Warning] To restrict the size of log file, "
"we do not record more instruction trace beyond this point.\n"
"To capture more trace, you can modify the LOG_MAX macro in %s\n\n", __FILE__);
}
/* TODO: check watchpoints here. */
WP *wp = scan_watchpoint();
......@@ -70,11 +69,8 @@ void cpu_exec(uint64_t n) {
wp->old_val = wp->new_val;
return;
}
#endif
g_nr_guest_instr ++;
#ifdef HAS_IOE
extern void device_update();
device_update();
......@@ -87,10 +83,11 @@ void cpu_exec(uint64_t n) {
case NEMU_RUNNING: nemu_state.state = NEMU_STOP; break;
case NEMU_END: case NEMU_ABORT:
_Log("nemu: %s\33[0m at pc = " FMT_WORD "\n\n",
Log("nemu: %s\33[0m at pc = " FMT_WORD "\n\n",
(nemu_state.state == NEMU_ABORT ? "\33[1;31mABORT" :
(nemu_state.halt_ret == 0 ? "\33[1;32mHIT GOOD TRAP" : "\33[1;31mHIT BAD TRAP")),
nemu_state.halt_pc);
monitor_statistic();
if (nemu_state.state == NEMU_ABORT) abort();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册