Assemble whole program instead of instruction by instruction
[soc.git] / src / soc / simulator / qemu.py
1 from pygdbmi.gdbcontroller import GdbController
2 import subprocess
3
4 launch_args = ['qemu-system-ppc64',
5 '-machine', 'powernv9',
6 '-nographic',
7 '-s', '-S']
8
9 class QemuController:
10 def __init__(self, kernel):
11 args = launch_args + ['-kernel', kernel]
12 self.qemu_popen = subprocess.Popen(args,
13 stdout=subprocess.PIPE,
14 stdin=subprocess.PIPE)
15 self.gdb = GdbController(gdb_path='powerpc64-linux-gnu-gdb')
16
17 def connect(self):
18 return self.gdb.write('-target-select remote localhost:1234')
19
20 def break_address(self, addr):
21 cmd = '-break-insert *0x{:x}'.format(addr)
22 return self.gdb.write(cmd)
23
24 def get_registers(self):
25 return self.gdb.write('-data-list-register-values x')
26
27 def get_register(self, num):
28 return self.gdb.write('-data-list-register-values x {}'.format(num))
29
30 def step(self):
31 return self.gdb.write('-exec-next-instruction')
32
33 def gdb_continue(self):
34 return self.gdb.write('-exec-continue')
35
36 def exit(self):
37 self.gdb.exit()
38 self.qemu_popen.kill()
39
40
41 if __name__ == '__main__':
42 q = QemuController("qemu_test/kernel.bin")
43 q.connect()
44 q.break_address(0x20000000)
45 q.gdb_continue()
46 print(q.get_register(1))
47 print(q.step())
48 print(q.get_register(1))
49 q.exit()
50
51