kernel-mode #1
@ -124,13 +124,26 @@ class ElfInstruction:
|
|||||||
|
|
||||||
|
|
||||||
class ElfLoadedMemorySection(LoadedMemorySection):
|
class ElfLoadedMemorySection(LoadedMemorySection):
|
||||||
|
ins_cache: List[Optional[ElfInstruction]]
|
||||||
|
"""
|
||||||
|
A fast cache for accessing pre-decoded instructions
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
self.__setattr__('ins_cache', [None] * (self.size // 4))
|
||||||
|
|
||||||
def read_instruction(self, offset):
|
def read_instruction(self, offset):
|
||||||
|
if self.ins_cache[offset//4] is not None:
|
||||||
|
return self.ins_cache[offset//4]
|
||||||
if not self.flags.executable:
|
if not self.flags.executable:
|
||||||
print(FMT_PARSE + "Reading instruction from non-executable memory!" + FMT_NONE)
|
print(FMT_PARSE + "Reading instruction from non-executable memory!" + FMT_NONE)
|
||||||
raise InstructionAccessFault(offset + self.base)
|
raise InstructionAccessFault(offset + self.base)
|
||||||
if offset % 4 != 0:
|
if offset % 4 != 0:
|
||||||
raise InstructionAddressMisalignedTrap(offset + self.base)
|
raise InstructionAddressMisalignedTrap(offset + self.base)
|
||||||
return ElfInstruction(*decode(self.content[offset:offset + 4]))
|
ins = ElfInstruction(*decode(self.content[offset:offset + 4]))
|
||||||
|
self.ins_cache[offset // 4] = ins
|
||||||
|
return ins
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def end(self):
|
def end(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user