[decoder, ElfLoader] decoing an instruction now returns all args as int
This commit is contained in:
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…
Reference in New Issue
Block a user