> compile NEMU
ysyx_22040000 李心杨 Linux calcite 6.1.69 #1-NixOS SMP PREEMPT_DYNAMIC Wed Dec 20 16:00:29 UTC 2023 x86_64 GNU/Linux 20:49:42 up 3 days 19:50, 2 users, load average: 1.26, 0.91, 0.68
This commit is contained in:
parent
ba8658f385
commit
60cb7ee36a
2 changed files with 33 additions and 15 deletions
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
#include <isa.h>
|
#include <isa.h>
|
||||||
#include "local-include/reg.h"
|
#include "local-include/reg.h"
|
||||||
|
#include "macro.h"
|
||||||
|
|
||||||
const char *regs[] = {
|
const char *regs[] = {
|
||||||
"$0", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
|
"$0", "ra", "sp", "gp", "tp", "t0", "t1", "t2",
|
||||||
|
@ -24,6 +25,12 @@ const char *regs[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
void isa_reg_display() {
|
void isa_reg_display() {
|
||||||
|
int colomn_per_row = 4;
|
||||||
|
for(int i = 0; i < ARRLEN(regs); i++) {
|
||||||
|
printf("%s: %#X", reg_name(i), gpr(i));
|
||||||
|
if (i % colomn_per_row == 3)
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
word_t isa_reg_str2val(const char *s, bool *success) {
|
word_t isa_reg_str2val(const char *s, bool *success) {
|
||||||
|
|
|
@ -34,17 +34,21 @@ static struct CMDTable {
|
||||||
const char *name;
|
const char *name;
|
||||||
const char *description;
|
const char *description;
|
||||||
int (*handler)(char *);
|
int (*handler)(char *);
|
||||||
struct CMDTable* subcommand;
|
struct CMDTable *subcommand;
|
||||||
int nr_subcommand;
|
int nr_subcommand;
|
||||||
} cmd_info_table[] = {
|
} cmd_info_table[] =
|
||||||
{"r", "List all registers and their contents", cmd_info_r, NULL, 0},
|
{
|
||||||
{"w", "Status of specified watchpoints", cmd_info_w, NULL, 0},
|
{"r", "List all registers and their contents", cmd_info_r, NULL, 0},
|
||||||
}, cmd_table[] = {
|
{"w", "Status of specified watchpoints", cmd_info_w, NULL, 0},
|
||||||
{"help", "Display information about all supported commands", cmd_help, NULL, 0},
|
},
|
||||||
{"c", "Continue the execution of the program", cmd_c, NULL, 0},
|
cmd_table[] = {
|
||||||
{"q", "Exit NEMU", cmd_q, NULL, 0},
|
{"help", "Display information about all supported commands", cmd_help,
|
||||||
{"si", "Execute next [n] program line", cmd_si, NULL, 0},
|
NULL, 0},
|
||||||
{"info", "Print information of registers or watchpoints", cmd_info, cmd_info_table, ARRLEN(cmd_info_table)},
|
{"c", "Continue the execution of the program", cmd_c, NULL, 0},
|
||||||
|
{"q", "Exit NEMU", cmd_q, NULL, 0},
|
||||||
|
{"si", "Execute next [n] program line", cmd_si, NULL, 0},
|
||||||
|
{"info", "Print information of registers or watchpoints", cmd_info,
|
||||||
|
cmd_info_table, ARRLEN(cmd_info_table)},
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NR_CMD ARRLEN(cmd_table)
|
#define NR_CMD ARRLEN(cmd_table)
|
||||||
|
@ -117,7 +121,10 @@ static int cmd_si(char *args) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmd_info_r(char *args) { return 0; }
|
static int cmd_info_r(char *args) {
|
||||||
|
isa_reg_display();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int cmd_info_w(char *args) { return 0; }
|
static int cmd_info_w(char *args) { return 0; }
|
||||||
|
|
||||||
|
@ -134,7 +141,8 @@ static int cmd_info(char *args) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmd_help_print(char *args, struct CMDTable* cur_cmd_table, int cur_nr_cmd) {
|
static int cmd_help_print(char *args, struct CMDTable *cur_cmd_table,
|
||||||
|
int cur_nr_cmd) {
|
||||||
int i;
|
int i;
|
||||||
char *arg = strtok(NULL, " ");
|
char *arg = strtok(NULL, " ");
|
||||||
if (arg == NULL) {
|
if (arg == NULL) {
|
||||||
|
@ -143,7 +151,8 @@ static int cmd_help_print(char *args, struct CMDTable* cur_cmd_table, int cur_nr
|
||||||
for (i = 0; i < cur_nr_cmd; i++) {
|
for (i = 0; i < cur_nr_cmd; i++) {
|
||||||
if (strcmp(arg, cur_cmd_table[i].name) == 0) {
|
if (strcmp(arg, cur_cmd_table[i].name) == 0) {
|
||||||
printf("%s ", cur_cmd_table[i].name);
|
printf("%s ", cur_cmd_table[i].name);
|
||||||
if (cmd_help_print(arg, cur_cmd_table[i].subcommand, cur_cmd_table[i].nr_subcommand) == -1) {
|
if (cmd_help_print(arg, cur_cmd_table[i].subcommand,
|
||||||
|
cur_cmd_table[i].nr_subcommand) == -1) {
|
||||||
printf("-- %s\n", cur_cmd_table[i].description);
|
printf("-- %s\n", cur_cmd_table[i].description);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -167,12 +176,14 @@ static int cmd_help(char *args) {
|
||||||
for (i = 0; i < NR_CMD; i++) {
|
for (i = 0; i < NR_CMD; i++) {
|
||||||
if (strcmp(arg, cmd_table[i].name) == 0) {
|
if (strcmp(arg, cmd_table[i].name) == 0) {
|
||||||
printf("%s ", cmd_table[i].name);
|
printf("%s ", cmd_table[i].name);
|
||||||
if (cmd_help_print(args, cmd_table[i].subcommand, cmd_table[i].nr_subcommand) == -1) {
|
if (cmd_help_print(args, cmd_table[i].subcommand,
|
||||||
|
cmd_table[i].nr_subcommand) == -1) {
|
||||||
printf("-- %s\n", cmd_table[i].description);
|
printf("-- %s\n", cmd_table[i].description);
|
||||||
// Print available subcommands
|
// Print available subcommands
|
||||||
for (int j = 0; j < cmd_table[i].nr_subcommand; j++) {
|
for (int j = 0; j < cmd_table[i].nr_subcommand; j++) {
|
||||||
struct CMDTable *sub_cmd_table = cmd_table[i].subcommand;
|
struct CMDTable *sub_cmd_table = cmd_table[i].subcommand;
|
||||||
printf(" > %s -- %s\n", sub_cmd_table[j].name, sub_cmd_table[j].description);
|
printf(" > %s -- %s\n", sub_cmd_table[j].name,
|
||||||
|
sub_cmd_table[j].description);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue