> compile NEMU

ysyx_22040000 李心杨
Linux calcite 6.1.71 #1-NixOS SMP PREEMPT_DYNAMIC Fri Jan  5 14:18:41 UTC 2024 x86_64 GNU/Linux
 16:04:14  up 2 days  4:59,  2 users,  load average: 1.20, 0.76, 0.69
This commit is contained in:
tracer-ysyx 2024-01-15 16:04:14 +08:00 committed by xinyangli
parent 9507e0e4ac
commit 294353437a
5 changed files with 747 additions and 28 deletions

3
nemu/.vscode/settings.json vendored Normal file
View file

@ -0,0 +1,3 @@
{
"digital-ide.welcome.show": false
}

File diff suppressed because one or more lines are too long

View file

@ -52,19 +52,17 @@
configurePhase = '' configurePhase = ''
echo NEMU_HOME=$NEMU_HOME echo NEMU_HOME=$NEMU_HOME
make -f scripts/config.mk rv32_defconfig echo pwd=$(pwd)
''; mkdir -p $(pwd)/kconfig
WORK_DIR=$(pwd) obj=$(pwd)/kconfig make --trace -e -f scripts/config.mk WORK_DIR=$(pwd) obj=$(pwd)/kconfig rv32_defconfig
buildPhase = ''
make app
''; '';
installPhase = '' installPhase = ''
make install BUILD_DIR=$out make install
''; '';
checkPhase = '' checkPhase = ''
make test BUILD_DIR=$out make test
''; '';
NEMU_HOME = src; NEMU_HOME = src;

View file

@ -16,6 +16,8 @@
#include "sdb.h" #include "sdb.h"
#include "common.h" #include "common.h"
#include "sys/types.h" #include "sys/types.h"
#include <addrexp.h>
#include <addrexp_lex.h>
#include <cpu/cpu.h> #include <cpu/cpu.h>
#include <errno.h> #include <errno.h>
#include <isa.h> #include <isa.h>
@ -23,8 +25,6 @@
#include <readline/history.h> #include <readline/history.h>
#include <readline/readline.h> #include <readline/readline.h>
#include <stdint.h> #include <stdint.h>
#include <addrexp.h>
#include <addrexp_lex.h>
static int is_batch_mode = false; static int is_batch_mode = false;

View file

@ -1,18 +1,19 @@
/*************************************************************************************** /***************************************************************************************
* Copyright (c) 2014-2022 Zihao Yu, Nanjing University * Copyright (c) 2014-2022 Zihao Yu, Nanjing University
* *
* NEMU is licensed under Mulan PSL v2. * NEMU is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2. * You can use this software according to the terms and conditions of the Mulan
* You may obtain a copy of Mulan PSL v2 at: *PSL v2. You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2 * http://license.coscl.org.cn/MulanPSL2
* *
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, *KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. *NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* *
* See the Mulan PSL v2 for more details. * See the Mulan PSL v2 for more details.
***************************************************************************************/ ***************************************************************************************/
#include "common.h"
#include "sdb.h" #include "sdb.h"
#define NR_WP 32 #define NR_WP 32
@ -20,17 +21,17 @@
typedef struct watchpoint { typedef struct watchpoint {
int NO; int NO;
struct watchpoint *next; struct watchpoint *next;
word_t val;
/* TODO: Add more members if necessary */ char *expr;
} WP; } WP;
static WP wp_pool[NR_WP] = {}; static WP wp_pool[NR_WP] = {};
static WP *head = NULL, *free_ = NULL; static WP *head = NULL, *tail = NULL, *free_ = NULL;
static int wp_count = 0;
void init_wp_pool() { void init_wp_pool() {
int i; int i;
for (i = 0; i < NR_WP; i ++) { for (i = 0; i < NR_WP; i++) {
wp_pool[i].NO = i; wp_pool[i].NO = i;
wp_pool[i].next = (i == NR_WP - 1 ? NULL : &wp_pool[i + 1]); wp_pool[i].next = (i == NR_WP - 1 ? NULL : &wp_pool[i + 1]);
} }
@ -39,5 +40,65 @@ void init_wp_pool() {
free_ = wp_pool; free_ = wp_pool;
} }
/* TODO: Implement the functionality of watchpoint */ WP *wp_new() {
if (free_ == NULL) {
Log("wp_pool: Watchpoint pool not initialized or is full.");
return NULL;
}
WP *ret = free_;
free_ = free_->next;
ret->NO = 0;
ret->next = NULL;
return ret;
}
void wp_delete(WP *wp) {
assert(wp);
wp->next = free_;
free_ = wp;
}
int wp_add(char * expr) {
WP *wp = wp_new();
if (wp == NULL) {
Log("watchpoint: Failed to add watchpoint, pool is full.");
return 1;
}
wp->NO = wp_count++;
if (tail == NULL) {
head = wp;
tail = wp;
} else {
tail->next = wp;
tail = wp;
}
return 0;
}
int wp_remove_by_number(int number) {
WP *target_prev;
// Find previous node of target number
for (target_prev = head; target_prev != NULL && target_prev->next->NO != number; target_prev = target_prev->next) ;
if (target_prev == NULL) {
Log("Watchpoint not found, you can check current watchpoints with `info w`");
return 1;
}
WP *target = target_prev->next;
target_prev->next = target->next;
if (target == head) {
head = target->next;
} else if (target == tail) {
tail = target_prev;
}
wp_delete(target);
return 0;
}
// int wp_eval_all(char *) {
// }
/* TODO: Implement the functionality of watchpoint */