[decoder, ElfLoader] decoing an instruction now returns all args as int

kernel-mode
Anton Lydike 4 years ago
parent f9b0bac245
commit 849d5f4fc3

@ -1 +1 @@
from .decoder import decode
from .decoder import decode, RISCV_REGS

@ -6,6 +6,7 @@ if __name__ == '__main__':
from .decoder import *
from .formats import *
from .instruction_table import *
from .regs import RISCV_REGS
sess_vars = globals()
sess_vars.update(locals())
@ -13,4 +14,4 @@ if __name__ == '__main__':
readline.set_completer(rlcompleter.Completer(sess_vars).complete)
readline.set_completer(rlcompleter.Completer(sess_vars).complete)
readline.parse_and_bind("tab: complete")
code.InteractiveConsole(sess_vars).interact(banner="Interaktive decoding session started...", exitmsg="Closing...")
code.InteractiveConsole(sess_vars).interact(banner="Interaktive decoding session started...", exitmsg="Closing...")

@ -8,11 +8,11 @@ def print_ins(ins: int):
f"0b{ins >> 25 :07b}_{(ins >> 20) & 0b11111:05b}_{(ins >> 15) & 0b11111:03b}_{(ins >> 12) & 0b111:03b}_{(ins >> 7) & 0b11111:05b}_{ins & 0b1111111:07b}");
STATIC_INSN: Dict[int, Tuple[str, List[Union[str, int]], int]] = {
STATIC_INSN: Dict[int, Tuple[str, List[int], int]] = {
0x00000013: ("nop", [], 0x00000013),
0x00008067: ("ret", [], 0x00008067),
0xfe010113: ("addi", ["sp", "sp", -32], 0xfe010113),
0x02010113: ("addi", ["sp", "sp", 32], 0x02010113),
0xfe010113: ("addi", [2, 2, -32], 0xfe010113),
0x02010113: ("addi", [2, 2, 32], 0x02010113),
0x00100073: ("ebreak", [], 0x00100073),
0x00000073: ("ecall", [], 0x00000073),
0x30200073: ("mret", [], 0x30200073),
@ -72,7 +72,7 @@ def name_from_insn(ins: int):
raise RuntimeError(f"Invalid instruction: {ins:x}")
def decode(ins: bytearray) -> Tuple[str, List[Union[str, int]], int]:
def decode(ins: bytearray) -> Tuple[str, List[int], int]:
insn = int_from_ins(ins)
if insn & 3 != 3:

@ -69,37 +69,37 @@ def sign_extend(num, bits):
return (num & (sign_mask - 1)) - (num & sign_mask)
def decode_i(ins: int) -> List[Union[str, int]]:
return [RISCV_REGS[rd(ins)], RISCV_REGS[rs1(ins)], imm_i(ins)]
def decode_i(ins: int) -> List[int]:
return [rd(ins), rs1(ins), imm_i(ins)]
def decode_b(ins: int) -> List[Union[str, int]]:
return [RISCV_REGS[rs1(ins)], RISCV_REGS[rs2(ins)], imm_b(ins)]
def decode_b(ins: int) -> List[int]:
return [rs1(ins), rs2(ins), imm_b(ins)]
def decode_u(ins: int) -> List[Union[str, int]]:
return [RISCV_REGS[rd(ins)], imm_u(ins)]
def decode_u(ins: int) -> List[int]:
return [rd(ins), imm_u(ins)]
def decode_r(ins: int) -> List[Union[str, int]]:
return [RISCV_REGS[rd(ins)], RISCV_REGS[rs1(ins)], RISCV_REGS[rs2(ins)]]
def decode_r(ins: int) -> List[int]:
return [rd(ins), rs1(ins), rs2(ins)]
def decode_s(ins: int) -> List[Union[str, int]]:
return [RISCV_REGS[rs1(ins)], RISCV_REGS[rs2(ins)], imm_s(ins)]
def decode_s(ins: int) -> List[int]:
return [rs2(ins), rs1(ins), imm_s(ins)]
def decode_j(ins: int) -> List[Union[str, int]]:
return [RISCV_REGS[rd(ins)], imm_j(ins)]
def decode_j(ins: int) -> List[int]:
return [rd(ins), imm_j(ins)]
def decode_i_shamt(ins: int) -> List[Union[str, int]]:
def decode_i_shamt(ins: int) -> List[int]:
if funct3(ins) in (1, 5):
return [RISCV_REGS[rd(ins)], RISCV_REGS[rs1(ins)], rs2(ins)]
return [rd(ins), rs1(ins), rs2(ins)]
return decode_i(ins)
INSTRUCTION_ARGS_DECODER: Dict[int, Callable[[int], List[Union[str, int]]]] = {
INSTRUCTION_ARGS_DECODER: Dict[int, Callable[[int], List[int]]] = {
0x00: decode_i,
0x04: decode_i_shamt,
0x05: decode_u,

@ -7,7 +7,7 @@ from elftools.elf.sections import Section, SymbolTableSection
from .Exceptions import *
from ..Exceptions import RiscemuBaseException
from ..Executable import MemoryFlags, LoadedMemorySection
from ..decoder import decode
from ..decoder import decode, RISCV_REGS
from ..helpers import FMT_PARSE, FMT_NONE, FMT_GREEN, FMT_BOLD
FMT_ELF = FMT_GREEN + FMT_BOLD
@ -96,17 +96,17 @@ class InvalidElfException(RiscemuBaseException):
@dataclass(frozen=True)
class ElfInstruction:
name: str
args: List[Union[int, str]]
args: List[int]
encoded: int
def get_imm(self, num: int):
return self.args[-1]
def get_imm(self, num: int) -> int:
return self.args[num]
def get_imm_reg(self, num: int):
def get_imm_reg(self, num: int) -> Tuple[int, int]:
return self.args[-1], self.args[-2]
def get_reg(self, num: int):
return self.args[num]
def get_reg(self, num: int) -> str:
return RISCV_REGS[self.args[num]]
def __repr__(self):
if self.name in ('sw', 'sh', 'sb', 'lb', 'lh', 'lb', 'lbu', 'lhu'):

Loading…
Cancel
Save