1 from pygdbmi
.gdbcontroller
import GdbController
4 launch_args
= ['qemu-system-ppc64',
5 '-machine', 'powernv9',
11 def __init__(self
, kernel
):
12 args
= launch_args
+ ['-kernel', kernel
]
13 self
.qemu_popen
= subprocess
.Popen(args
,
14 stdout
=subprocess
.PIPE
,
15 stdin
=subprocess
.PIPE
)
16 self
.gdb
= GdbController(gdb_path
='powerpc64-linux-gnu-gdb')
21 def __exit__(self
, type, value
, traceback
):
25 return self
.gdb
.write('-target-select remote localhost:1234')
27 def break_address(self
, addr
):
28 cmd
= '-break-insert *0x{:x}'.format(addr
)
29 return self
.gdb
.write(cmd
)
31 def delete_breakpoint(self
, breakpoint
=None):
34 breakstring
= f
' {breakpoint}'
35 return self
.gdb
.write('-break-delete' + breakstring
)
37 def get_mem(self
, addr
, nbytes
):
38 res
= self
.gdb
.write("-data-read-memory %d u 8 1 %d" % (addr
, nbytes
))
39 print ("get_mem", res
)
41 if(x
["type"]=="result"):
42 return x
['payload']['memory'][0]['data']
45 def get_registers(self
):
46 return self
.gdb
.write('-data-list-register-values x')
48 def _get_register(self
, fmt
):
49 res
= self
.gdb
.write('-data-list-register-values '+fmt
,
50 timeout_sec
=1.0) # increase this timeout if needed
52 if(x
["type"]=="result"):
53 assert 'register-values' in x
['payload']
54 return int(x
['payload']['register-values'][0]['value'], 0)
57 # TODO: use -data-list-register-names instead of hardcoding the values
58 def get_pc(self
): return self
._get
_register
('x 64')
59 def get_msr(self
): return self
._get
_register
('x 65')
60 def get_cr(self
): return self
._get
_register
('x 66')
61 def get_lr(self
): return self
._get
_register
('x 67')
62 def get_ctr(self
): return self
._get
_register
('x 68') # probably
63 def get_xer(self
): return self
._get
_register
('x 69')
64 def get_fpscr(self
): return self
._get
_register
('x 70')
65 def get_mq(self
): return self
._get
_register
('x 71')
66 def get_register(self
, num
):
67 return self
._get
_register
('x {}'.format(num
))
70 return self
.gdb
.write('-exec-next-instruction')
72 def gdb_continue(self
):
73 return self
.gdb
.write('-exec-continue')
75 def gdb_eval(self
, expr
):
76 return self
.gdb
.write(f
'-data-evaluate-expression {expr}')
80 self
.qemu_popen
.kill()
81 outs
, errs
= self
.qemu_popen
.communicate()
82 self
.qemu_popen
.stdout
.close()
83 self
.qemu_popen
.stdin
.close()
86 def run_program(program
):
87 q
= QemuController(program
.binfile
.name
)
89 # Run to the start of the program
90 q
.break_address(0x20000000)
92 # set the CR to 0, matching the simulator
94 # delete the previous breakpoint so loops don't screw things up
97 q
.break_address(0x20000000 + program
.size())
102 if __name__
== '__main__':
103 q
= QemuController("qemu_test/kernel.bin")
105 q
.break_address(0x20000000)
107 print(q
.get_register(1))
109 print(q
.get_register(1))