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 )
1010from ptrace .os_tools import HAS_PROC , RUNNING_BSD , RUNNING_PYTHON3
1111from ptrace .tools import dumpRegs
1212from ptrace .cpu_info import CPU_WORD_SIZE
4949if HAS_PTRACE_GETREGS or HAS_PTRACE_GETREGSET :
5050 from ptrace .binding import ptrace_getregs
5151else :
52- from ptrace .binding import ptrace_peekuser , ptrace_registers_t
52+ from ptrace .binding import ptrace_registers_t
5353if HAS_DISASSEMBLER :
5454 from ptrace .disasm import disassemble , disassembleOne , MAX_INSTR_SIZE
5555if 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