12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- #!/usr/bin/env python3
- import imp
- import os
- import subprocess
- import re
- import common
- run = imp.load_source('run', os.path.join(common.root_dir, 'run'))
- qemu_trace2txt = imp.load_source('qemu_trace2txt', os.path.join(common.root_dir, 'qemu-trace2txt'))
- parser = common.get_argparse(argparse_args={
- 'description': '''Trace the PIC addresses executed on a Linux kernel boot.
- More information at: https://github.com/cirosantilli/linux-kernel-module-cheat#tracing
- '''
- })
- parser.add_argument(
- 'extra_emulator_args', nargs='*',
- help='Extra options to append at the end of the emulator command line'
- )
- args = common.setup(parser)
- extra_args = {
- 'extra_emulator_args': args.extra_emulator_args,
- }
- if args.gem5:
- extra_args.update({
- 'eval': 'm5 exit',
- 'trace': 'Exec,-ExecSymbol,-ExecMicro',
- })
- run.main(args, extra_args)
- else:
- extra_args.update({
- 'kernel_cli_extra': 'init=/poweroff.out',
- 'trace': 'exec_tb',
- })
- run.main(args, extra_args)
- qemu_trace2txt.main()
- # Instruction count.
- # We could put this on a separate script, but it just adds more arch boilerplate to a new script.
- # So let's just leave it here for now since it did not add a significant processing time.
- kernel_entry_addr = hex(common.get_elf_entry(common.vmlinux))
- nlines = 0
- nlines_firmware = 0
- with open(common.qemu_trace_txt_file, 'r') as trace_file:
- in_firmware = True
- for line in trace_file:
- line = line.rstrip()
- nlines += 1
- pc = line.split('=')[-1]
- if pc == kernel_entry_addr:
- in_firmware = False
- if in_firmware:
- nlines_firmware += 1
- print('''\
- instructions {}
- entry_address {}
- instructions_firmware {}\
- '''.format(
- nlines,
- kernel_entry_addr,
- nlines_firmware
- ))
|