From 0229b0601d241d67f5473957edcd27ad3beb0353 Mon Sep 17 00:00:00 2001 From: tracer-ysyx Date: Tue, 5 Mar 2024 18:37:12 +0800 Subject: [PATCH] =?UTF-8?q?>=20compile=20NEMU=20ysyx=5F22040000=20?= =?UTF-8?q?=E6=9D=8E=E5=BF=83=E6=9D=A8=20Linux=20calcite=206.6.18=20#1-Nix?= =?UTF-8?q?OS=20SMP=20PREEMPT=5FDYNAMIC=20Fri=20Feb=2023=2008:25:28=20UTC?= =?UTF-8?q?=202024=20x86=5F64=20GNU/Linux=20=2018:37:12=20=20up=20=2022:05?= =?UTF-8?q?,=20=202=20users,=20=20load=20average:=200.76,=200.54,=200.61?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- flake.nix | 9 +++++++++ nemu/src/isa/riscv32/inst.c | 9 +++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 69b4884..990d66d 100644 --- a/flake.nix +++ b/flake.nix @@ -61,6 +61,15 @@ gdb ] ++ builtins.attrValues self.packages.${system}; }; + + devShells.nemu = pkgs.mkShell { + packages = with pkgs; [ + clang-tools + ]; + inputsFrom = [ + self.packages.${system}.nemu + ]; + }; } ); } diff --git a/nemu/src/isa/riscv32/inst.c b/nemu/src/isa/riscv32/inst.c index 39e0e08..7d7d8e7 100644 --- a/nemu/src/isa/riscv32/inst.c +++ b/nemu/src/isa/riscv32/inst.c @@ -48,6 +48,11 @@ static void decode_operand(Decode *s, int *rd, word_t *src1, word_t *src2, word_ } } +static void do_jump(Decode *s, int rd, int relative_address) { + R(rd) = s->pc + 4; + s->dnpc = s->pc + relative_address; +} + static int decode_exec(Decode *s) { int rd = 0; word_t src1 = 0, src2 = 0, imm = 0; @@ -62,8 +67,8 @@ 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("??????? ????? ????? ??? ????? 11011 11", jal, , J, do_jump(s, rd, imm) ); + INSTPAT("??????? ????? ????? ??? ????? 11001 11", jalr , I, do_jump(s, rd, imm) ); 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);