> compile NEMU
ysyx_22040000 李心杨 Linux calcite 6.6.18 #1-NixOS SMP PREEMPT_DYNAMIC Fri Feb 23 08:25:28 UTC 2024 x86_64 GNU/Linux 18:21:57 up 21:50, 2 users, load average: 0.17, 0.54, 0.83
This commit is contained in:
parent
3aceace0c3
commit
4ca052cb1b
5 changed files with 65 additions and 30 deletions
|
@ -9,7 +9,6 @@ stdenv.mkDerivation rec {
|
|||
|
||||
src = ./.;
|
||||
|
||||
NEMU_HOME = "/build/nemu";
|
||||
nativeBuildInputs = with pkgs; [
|
||||
gnumake
|
||||
flex
|
||||
|
@ -23,7 +22,7 @@ stdenv.mkDerivation rec {
|
|||
];
|
||||
|
||||
configurePhase = ''
|
||||
echo pwd=$(pwd)
|
||||
export NEMU_HOME=$(pwd)
|
||||
make alldefconfig
|
||||
'';
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#define Mw vaddr_write
|
||||
|
||||
enum {
|
||||
TYPE_I, TYPE_U, TYPE_S,
|
||||
TYPE_R, TYPE_I, TYPE_U, TYPE_S, TYPE_J,
|
||||
TYPE_N, // none
|
||||
};
|
||||
|
||||
|
@ -32,6 +32,7 @@ enum {
|
|||
#define immI() do { *imm = SEXT(BITS(i, 31, 20), 12); } while(0)
|
||||
#define immU() do { *imm = SEXT(BITS(i, 31, 12), 20) << 12; } while(0)
|
||||
#define immS() do { *imm = (SEXT(BITS(i, 31, 25), 7) << 5) | BITS(i, 11, 7); } while(0)
|
||||
#define immJ() do { *imm = (SEXT(BITS(i, 31, 30), 1) << 20) | BITS(i, 30, 21) << 1 | BITS(i, 21, 20) << 11 | BITS(i, 19, 12) << 12; } while(0)
|
||||
|
||||
static void decode_operand(Decode *s, int *rd, word_t *src1, word_t *src2, word_t *imm, int type) {
|
||||
uint32_t i = s->isa.inst.val;
|
||||
|
@ -39,8 +40,10 @@ static void decode_operand(Decode *s, int *rd, word_t *src1, word_t *src2, word_
|
|||
int rs2 = BITS(i, 24, 20);
|
||||
*rd = BITS(i, 11, 7);
|
||||
switch (type) {
|
||||
case TYPE_R: src1R(); src2R(); break;
|
||||
case TYPE_I: src1R(); immI(); break;
|
||||
case TYPE_U: immU(); break;
|
||||
case TYPE_J: immJ(); break;
|
||||
case TYPE_S: src1R(); src2R(); immS(); break;
|
||||
}
|
||||
}
|
||||
|
@ -57,9 +60,14 @@ static int decode_exec(Decode *s) {
|
|||
}
|
||||
|
||||
INSTPAT_START();
|
||||
INSTPAT("??????? ????? ????? ??? ????? 01101 11", lui , U, R(rd) = imm);
|
||||
INSTPAT("??????? ????? ????? ??? ????? 00101 11", auipc , U, R(rd) = s->pc + imm);
|
||||
// INSTPAT("??????? ????? ????? ??? ????? 11011 11", jal, , J, do {s->dnpc = s->pc + imm; R(rd) = s->pc + 4; } while(0));
|
||||
// INSTPAT("??????? ????? ????? ??? ????? 11001 11", jalr , I, do {s->dnpc = s->pc + src1; R(rd) = s->pc + 4); } while(0);
|
||||
INSTPAT("??????? ????? ????? 100 ????? 00000 11", lbu , I, R(rd) = Mr(src1 + imm, 1));
|
||||
INSTPAT("??????? ????? ????? 000 ????? 01000 11", sb , S, Mw(src1 + imm, 1, src2));
|
||||
INSTPAT("??????? ????? ????? 000 ????? 00100 11", addi , I, R(rd) = src1 + (sword_t)imm);
|
||||
INSTPAT("0000000 ????? ????? 000 ????? 01100 11", add , R, R(rd) = src1 + src2);
|
||||
|
||||
INSTPAT("0000000 00001 00000 000 00000 11100 11", ebreak , N, NEMUTRAP(s->pc, R(10))); // R(10) is $a0
|
||||
INSTPAT("??????? ????? ????? ??? ????? ????? ??", inv , N, INV(s->pc));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue