> compile NEMU

ysyx_22040000 李心杨
Linux calcite 6.1.75 #1-NixOS SMP PREEMPT_DYNAMIC Thu Jan 25 23:27:52 UTC 2024 x86_64 GNU/Linux
 17:38:54  up   3:14,  2 users,  load average: 0.92, 0.78, 1.37
This commit is contained in:
tracer-ysyx 2024-02-07 17:38:54 +08:00 committed by xinyangli
parent 80ccc78e9b
commit 7a45094712
5 changed files with 36 additions and 12 deletions

View file

@ -21,7 +21,15 @@
#include <utils.h> #include <utils.h>
#define Log(format, ...) \ #define Log(format, ...) \
_Log(ANSI_FMT("[%s:%d %s] " format, ANSI_FG_BLUE) "\n", \ _Log(ANSI_FMT("%s:%d %s [INFO]" format, ANSI_FG_BLUE) "\n", \
__FILE__, __LINE__, __func__, ## __VA_ARGS__)
#define Warning(format, ...) \
_Log(ANSI_FMT("%s:%d %s [WARNING]" format, ANSI_FG_YELLOW) "\n", \
__FILE__, __LINE__, __func__, ## __VA_ARGS__)
#define Error(format, ...) \
_Log(ANSI_FMT("%s:%d %s [ERROR] " format, ANSI_FG_RED) "\n", \
__FILE__, __LINE__, __func__, ## __VA_ARGS__) __FILE__, __LINE__, __func__, ## __VA_ARGS__)
#define Assert(cond, format, ...) \ #define Assert(cond, format, ...) \

View file

@ -42,10 +42,7 @@ expression
$$ = $1 / $3; $$ = $1 / $3;
} }
| '-' number { $$ = -$2; } | '-' number { $$ = -$2; }
| '*' expression { | '*' expression { $$ = vaddr_read($2, WORD_BYTES); }
// printf("deref: %u, value: %#x\n", $2, vaddr_read($2, WORD_BYTES));
$$ = vaddr_read($2, WORD_BYTES);
}
| '(' expression ')' { $$ = $2; } | '(' expression ')' { $$ = $2; }
number number

View file

@ -125,17 +125,17 @@ static word_t parse_uint(const char *arg, bool *success) {
} }
} }
static vaddr_t parse_expr(const char *arg, bool *success) { word_t parse_expr(const char *arg, bool *success) {
if (arg == NULL) { if (arg == NULL) {
puts("Invalid expr argument."); puts("Invalid expr argument.");
*success = false; *success = false;
return 0; return 0;
} else { } else {
vaddr_t addr; word_t res;
yy_scan_string(arg); yy_scan_string(arg);
*success = !yyparse(&addr); *success = !yyparse(&res);
yylex_destroy(); yylex_destroy();
return addr; return res;
} }
} }

View file

@ -18,4 +18,6 @@
#include <common.h> #include <common.h>
word_t parse_expr(const char *arg, bool *success);
#endif #endif

View file

@ -15,6 +15,7 @@
#include "common.h" #include "common.h"
#include "sdb.h" #include "sdb.h"
#include <stdio.h>
#define NR_WP 32 #define NR_WP 32
@ -42,7 +43,7 @@ void init_wp_pool() {
WP *wp_new() { WP *wp_new() {
if (free_ == NULL) { if (free_ == NULL) {
Log("wp_pool: Watchpoint pool not initialized or is full."); Error("wp_pool: Watchpoint pool not initialized or is full.");
return NULL; return NULL;
} }
@ -63,7 +64,7 @@ void wp_delete(WP *wp) {
int wp_add(char * expr) { int wp_add(char * expr) {
WP *wp = wp_new(); WP *wp = wp_new();
if (wp == NULL) { if (wp == NULL) {
Log("watchpoint: Failed to add watchpoint, pool is full."); Error("watchpoint: Failed to add watchpoint, pool is full.");
return 1; return 1;
} }
@ -83,7 +84,7 @@ int wp_remove_by_number(int number) {
// Find previous node of target number // Find previous node of target number
for (target_prev = head; target_prev != NULL && target_prev->next->NO != number; target_prev = target_prev->next) ; for (target_prev = head; target_prev != NULL && target_prev->next->NO != number; target_prev = target_prev->next) ;
if (target_prev == NULL) { if (target_prev == NULL) {
Log("Watchpoint not found, you can check current watchpoints with `info w`"); Error("Watchpoint not found, you can check current watchpoints with `info w`");
return 1; return 1;
} }
WP *target = target_prev->next; WP *target = target_prev->next;
@ -97,4 +98,20 @@ int wp_remove_by_number(int number) {
return 0; return 0;
} }
// int wp_eval(WP* wp) {
// bool success = false;
// word_t result;
// result = parse_expr(wp->expr, &success);
// if (!success) {
// }
// }
/*
Check if watchpoint value changed after execution
*/
// int wp_eval_all() {
// }
/* TODO: Implement the functionality of watchpoint */ /* TODO: Implement the functionality of watchpoint */