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 get_registers(self
):
32 return self
.gdb
.write('-data-list-register-values x')
34 def get_register(self
, num
):
35 res
= self
.gdb
.write('-data-list-register-values x {}'.format(num
))
36 assert 'register-values' in res
[0]['payload']
37 val
= int(res
[0]['payload']['register-values'][0]['value'], 0)
41 return self
.gdb
.write('-exec-next-instruction')
43 def gdb_continue(self
):
44 return self
.gdb
.write('-exec-continue')
48 self
.qemu_popen
.kill()
49 outs
, errs
= self
.qemu_popen
.communicate()
50 self
.qemu_popen
.stdout
.close()
51 self
.qemu_popen
.stdin
.close()
54 def run_program(program
):
55 q
= QemuController(program
.binfile
.name
)
57 q
.break_address(0x20000000 + program
.size())
62 if __name__
== '__main__':
63 q
= QemuController("qemu_test/kernel.bin")
65 q
.break_address(0x20000000)
67 print(q
.get_register(1))
69 print(q
.get_register(1))