Skip to content

Commit e8fd456

Browse files
author
neok-m4700
committed
avoid fetching all registers when using gereg(...)
1 parent 8e3a57b commit e8fd456

3 files changed

Lines changed: 9 additions & 12 deletions

File tree

ptrace/binding/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from ptrace.binding.func import ( # noqa
22
HAS_PTRACE_SINGLESTEP, HAS_PTRACE_EVENTS,
33
HAS_PTRACE_IO, HAS_PTRACE_SIGINFO, HAS_PTRACE_GETREGS,
4-
HAS_PTRACE_GETREGSET, REGISTER_NAMES,
4+
HAS_PTRACE_GETREGSET, REGISTER_NAMES, REGISTER_OFFSETS,
55
ptrace_attach, ptrace_traceme,
66
ptrace_detach, ptrace_kill,
77
ptrace_cont, ptrace_syscall,

ptrace/binding/func.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
else:
2424
raise NotImplementedError("Unknown OS!")
2525
REGISTER_NAMES = tuple(name for name, type in ptrace_registers_t._fields_)
26+
REGISTER_OFFSETS = {n: getattr(ptrace_registers_t, n).offset for n, t in ptrace_registers_t._fields_}
2627

2728
HAS_PTRACE_SINGLESTEP = True
2829
HAS_PTRACE_EVENTS = False

ptrace/debugger/process.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
HAS_PTRACE_GETREGSET,
55
ptrace_attach, ptrace_detach,
66
ptrace_cont, ptrace_syscall,
7-
ptrace_setregs,
7+
ptrace_setregs, ptrace_peekuser,
88
ptrace_peektext, ptrace_poketext,
9-
REGISTER_NAMES)
9+
REGISTER_NAMES, REGISTER_OFFSETS)
1010
from ptrace.os_tools import HAS_PROC, RUNNING_BSD, RUNNING_PYTHON3
1111
from ptrace.tools import dumpRegs
1212
from ptrace.cpu_info import CPU_WORD_SIZE
@@ -49,7 +49,7 @@
4949
if HAS_PTRACE_GETREGS or HAS_PTRACE_GETREGSET:
5050
from ptrace.binding import ptrace_getregs
5151
else:
52-
from ptrace.binding import ptrace_peekuser, ptrace_registers_t
52+
from ptrace.binding import ptrace_registers_t
5353
if HAS_DISASSEMBLER:
5454
from ptrace.disasm import disassemble, disassembleOne, MAX_INSTR_SIZE
5555
if HAS_PROC:
@@ -416,13 +416,10 @@ def getregs(self):
416416
if HAS_PTRACE_GETREGS or HAS_PTRACE_GETREGSET:
417417
return ptrace_getregs(self.pid)
418418
else:
419-
# FIXME: Optimize getreg() when used with this function
420419
words = []
421-
nb_words = sizeof(ptrace_registers_t) // CPU_WORD_SIZE
422-
for offset in range(nb_words):
423-
word = ptrace_peekuser(self.pid, offset * CPU_WORD_SIZE)
424-
bytes = word2bytes(word)
425-
words.append(bytes)
420+
for name in REGISTER_OFFSETS:
421+
word = ptrace_peekuser(self.pid, REGISTER_OFFSETS[name])
422+
words.append(word2bytes(word))
426423
bytes = ''.join(words)
427424
return bytes2type(bytes, ptrace_registers_t)
428425

@@ -434,8 +431,7 @@ def getreg(self, name):
434431
mask = None
435432
if name not in REGISTER_NAMES:
436433
raise ProcessError(self, "Unknown register: %r" % name)
437-
regs = self.getregs()
438-
value = getattr(regs, name)
434+
value = ptrace_peekuser(self.pid, REGISTER_OFFSETS[name])
439435
value >>= shift
440436
if mask:
441437
value &= mask

0 commit comments

Comments
 (0)