Skip to content

Commit 1563f74

Browse files
authored
Add experimental force_arch setting (#34)
1 parent 58d2fe5 commit 1563f74

File tree

5 files changed

+34
-16
lines changed

5 files changed

+34
-16
lines changed

README.md

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,17 @@ Settings are stored in a file `.llef` located in your home directory formatted a
5858

5959
##### Available Settings
6060

61-
| Setting | Type | Description |
62-
|-------------------|---------|--------------------------------------|
63-
| color_output | Boolean | Enable/disable color terminal output |
64-
| register_coloring | Boolean | Enable/disable register coloring |
65-
| show_legend | Boolean | Enable/disable legend output |
66-
| show_registers | Boolean | Enable/disable registers output |
67-
| show_stack | Boolean | Enable/disable stack output |
68-
| show_code | Boolean | Enable/disable code output |
69-
| show_threads | Boolean | Enable/disable threads output |
70-
| show_trace | Boolean | Enable/disable trace output |
61+
| Setting | Type | Description |
62+
|-------------------|---------|----------------------------------------------------|
63+
| color_output | Boolean | Enable/disable color terminal output |
64+
| register_coloring | Boolean | Enable/disable register coloring |
65+
| show_legend | Boolean | Enable/disable legend output |
66+
| show_registers | Boolean | Enable/disable registers output |
67+
| show_stack | Boolean | Enable/disable stack output |
68+
| show_code | Boolean | Enable/disable code output |
69+
| show_threads | Boolean | Enable/disable threads output |
70+
| show_trace | Boolean | Enable/disable trace output |
71+
| force_arch | String | Force register display architecture (experimental) |
7172

7273
#### Context
7374

arch/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,15 @@
2424
"arm64e": Aarch64,
2525
}
2626

27+
2728
def get_arch(target: SBTarget) -> Type[BaseArch]:
2829
"""Get the architecture of a given target"""
2930
arch = extract_arch_from_triple(target.triple)
31+
return get_arch_from_str(arch)
32+
33+
34+
def get_arch_from_str(arch: str) -> Type[BaseArch]:
35+
"""Get the architecture class from string"""
3036
if arch in supported_arch:
3137
return supported_arch[arch]
3238

arch/i386.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,6 @@ class I386(BaseArch):
4646
}
4747

4848
flag_registers = [
49-
FlagRegister("eflags", _eflags_register_bit_masks)
49+
FlagRegister("eflags", _eflags_register_bit_masks),
50+
FlagRegister("rflags", _eflags_register_bit_masks)
5051
]

common/context_handler.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
SBValue,
1313
)
1414

15-
from arch import get_arch
15+
from arch import get_arch, get_arch_from_str
1616
from arch.base_arch import BaseArch, FlagRegister
1717
from common.constants import GLYPHS, TERM_COLORS
1818
from common.settings import LLEFSettings
@@ -202,9 +202,9 @@ def display_registers(self) -> None:
202202
"""Print the registers display section"""
203203

204204
print_line_with_string("registers")
205-
for reg in get_registers(self.frame, self.arch().gpr_key):
206-
if reg.GetName() in self.arch().gpr_registers:
207-
self.print_register(reg)
205+
for reg in self.arch().gpr_registers:
206+
if self.frame.register[reg] is not None:
207+
self.print_register(self.frame.register[reg])
208208
for flag_register in self.arch.flag_registers:
209209
if self.frame.register[flag_register.name] is not None:
210210
self.print_flags_register(flag_register)
@@ -312,7 +312,11 @@ def display_context(
312312
self.process = exe_ctx.GetProcess()
313313
self.target = exe_ctx.GetTarget()
314314
self.thread = exe_ctx.GetThread()
315-
self.arch = get_arch(self.target)
315+
if self.settings.force_arch is not None:
316+
self.arch = get_arch_from_str(self.settings.force_arch)
317+
else:
318+
self.arch = get_arch(self.target)
319+
316320
if self.settings.register_coloring is True:
317321
self.regions = self.process.GetMemoryRegions()
318322
else:

common/settings.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import configparser
33
import os
44

5+
from arch import supported_arch
56
from common.singleton import Singleton
67

78
LLEF_CONFIG_PATH = os.path.join(os.path.expanduser('~'), ".llef")
@@ -46,6 +47,11 @@ def show_threads(self):
4647
def show_trace(self):
4748
return self._RAW_CONFIG.getboolean(GLOBAL_SECTION, "show_trace", fallback=True)
4849

50+
@property
51+
def force_arch(self):
52+
arch = self._RAW_CONFIG.get(GLOBAL_SECTION, "force_arch", fallback=None)
53+
return None if arch not in supported_arch else arch
54+
4955
@classmethod
5056
def _get_setting_names(cls):
5157
return [name for name, value in vars(cls).items() if isinstance(value, property)]

0 commit comments

Comments
 (0)