more destructive changes

This commit is contained in:
Ciro Santilli 六四事件 法轮功
2018-12-05 00:00:00 +00:00
parent 0162205797
commit cfa3991e64
8 changed files with 355 additions and 331 deletions

View File

@@ -8491,8 +8491,8 @@ List all available debug flags:
but to understand most of them you have to look at the source code: but to understand most of them you have to look at the source code:
.... ....
less "$(./getvar gem5_src_dir)/src/cpu/SConscript" less "$(./getvar gem5_source_dir)/src/cpu/SConscript"
less "$(./getvar gem5_src_dir)/src/cpu/exetrace.cc" less "$(./getvar gem5_source_dir)/src/cpu/exetrace.cc"
.... ....
The traces are generated from `DPRINTF(<trace-id>` calls scattered throughout the code. The traces are generated from `DPRINTF(<trace-id>` calls scattered throughout the code.
@@ -9903,7 +9903,7 @@ The `--gem5-script biglittle` option enables the alternative `configs/example/ar
First apply: First apply:
.... ....
patch -d "$(./getvar gem5_src_dir)" -p 1 < patches/manual/gem5-biglittle.patch patch -d "$(./getvar gem5_source_dir)" -p 1 < patches/manual/gem5-biglittle.patch
.... ....
then: then:
@@ -10373,7 +10373,7 @@ Bibliography:
For gem5, you need: For gem5, you need:
.... ....
patch -d "$(./getvar gem5_src_dir)" -p 1 < patches/manual/gem5-semihost.patch patch -d "$(./getvar gem5_source_dir)" -p 1 < patches/manual/gem5-semihost.patch
.... ....
https://stackoverflow.com/questions/52475268/how-to-enable-arm-semihosting-in-gem5/52475269#52475269 https://stackoverflow.com/questions/52475268/how-to-enable-arm-semihosting-in-gem5/52475269#52475269
@@ -11432,17 +11432,17 @@ Analogous to the <<linux-kernel-build-variants>> but with the `--gem5-build-id`
./build-gem5 ./build-gem5
# Build another branch. # Build another branch.
git -C "$(./getvar gem5_src_dir)" checkout some-branch git -C "$(./getvar gem5_source_dir)" checkout some-branch
./build-gem5 --gem5-build-id some-branch ./build-gem5 --gem5-build-id some-branch
# Restore master. # Restore master.
git -C "$(./getvar gem5_src_dir)" checkout - git -C "$(./getvar gem5_source_dir)" checkout -
# Run master. # Run master.
./run --gem5 ./run --gem5
# Run another branch. # Run another branch.
git -C "$(./getvar gem5_src_dir)" checkout some-branch git -C "$(./getvar gem5_source_dir)" checkout some-branch
./run --gem5-build-id some-branch --gem5 ./run --gem5-build-id some-branch --gem5
.... ....

View File

@@ -100,9 +100,9 @@ if "$bench_gem5_build"; then
common_arch="$default_arch" common_arch="$default_arch"
gem5_build_id=bench gem5_build_id=bench
common_gem5_build_dir="$("$getvar" --arch "$common_arch" --gem5-build-id "$gem5_build_id" gem5_build_dir)" common_gem5_build_dir="$("$getvar" --arch "$common_arch" --gem5-build-id "$gem5_build_id" gem5_build_dir)"
common_gem5_src_dir="$("$getvar" --arch "$common_arch" --gem5-build-id "$gem5_build_id" gem5_src_dir)" common_gem5_source_dir="$("$getvar" --arch "$common_arch" --gem5-build-id "$gem5_build_id" gem5_src_dir)"
results_file="${common_gem5_build_dir}/lkmc-bench-build.txt" results_file="${common_gem5_build_dir}/lkmc-bench-build.txt"
git -C "${common_gem5_src_dir}" clean -xdf git -C "${common_gem5_source_dir}" clean -xdf
rm -f "$results_file" rm -f "$results_file"
"${root_dir}/build-gem5" --arch "$common_arch" --clean --gem5-build-id "$gem5_build_id" "${root_dir}/build-gem5" --arch "$common_arch" --clean --gem5-build-id "$gem5_build_id"
# TODO understand better: --foreground required otherwise we cannot # TODO understand better: --foreground required otherwise we cannot
@@ -110,7 +110,7 @@ if "$bench_gem5_build"; then
# bash -c "eval 'timeout 5 sleep 3'" # bash -c "eval 'timeout 5 sleep 3'"
"${root_dir}/bench-cmd" "timeout --foreground 900 ./build-gem5 --arch '$common_arch' --gem5-build-id '$gem5_build_id'" "$results_file" "${root_dir}/bench-cmd" "timeout --foreground 900 ./build-gem5 --arch '$common_arch' --gem5-build-id '$gem5_build_id'" "$results_file"
cp "$results_file" "${new_dir}/gem5-bench-build-${common_arch}.txt" cp "$results_file" "${new_dir}/gem5-bench-build-${common_arch}.txt"
git -C "${common_gem5_src_dir}" clean -xdf git -C "${common_gem5_source_dir}" clean -xdf
"${root_dir}/build-gem5" --arch "$common_arch" --clean --gem5-build-id "$gem5_build_id" "${root_dir}/build-gem5" --arch "$common_arch" --clean --gem5-build-id "$gem5_build_id"
fi fi

View File

@@ -144,7 +144,7 @@ usually extra Buildroot targets.
common.run_cmd( common.run_cmd(
[ [
'make', common.Newline, 'make', common.Newline,
'LKMC_GEM5_SRCDIR="{}"'.format(common.gem5_src_dir), common.Newline, 'LKMC_GEM5_SRCDIR="{}"'.format(common.gem5_source_dir), common.Newline,
'LKMC_PARSEC_BENCHMARK_SRCDIR="{}"'.format(common.parsec_benchmark_src_dir), common.Newline, 'LKMC_PARSEC_BENCHMARK_SRCDIR="{}"'.format(common.parsec_benchmark_src_dir), common.Newline,
'O={}'.format(common.buildroot_build_dir), common.Newline, 'O={}'.format(common.buildroot_build_dir), common.Newline,
'V={}'.format(int(args.verbose)), common.Newline, 'V={}'.format(int(args.verbose)), common.Newline,

View File

@@ -15,6 +15,7 @@ class Main(common.BuildCliFunction):
metavar='extra-scons-args', metavar='extra-scons-args',
nargs='*', nargs='*',
) )
common.add_args_gem5(self)
def build(self, **kwargs): def build(self, **kwargs):
build_dir = self.get_build_dir(**kwargs) build_dir = self.get_build_dir(**kwargs)
@@ -23,15 +24,15 @@ class Main(common.BuildCliFunction):
os.makedirs(binaries_dir, exist_ok=True) os.makedirs(binaries_dir, exist_ok=True)
os.makedirs(disks_dir, exist_ok=True) os.makedirs(disks_dir, exist_ok=True)
if kwargs['gem5_source_dir'] is None: if kwargs['gem5_source_dir'] is None:
if not os.path.exists(os.path.join(kwargs['gem5_src_dir'], '.git')): if not os.path.exists(os.path.join(kwargs['gem5_source_dir'], '.git')):
if kwargs['gem5_src_dir'] == kwargs['gem5_default_src_dir']: if kwargs['gem5_source_dir'] == kwargs['gem5_default_src_dir']:
raise Exception('gem5 submodule not checked out') raise Exception('gem5 submodule not checked out')
common.run_cmd([ common.run_cmd([
'git', common.Newline, 'git', common.Newline,
'-C', kwargs['gem5_default_src_dir'], common.Newline, '-C', kwargs['gem5_default_src_dir'], common.Newline,
'worktree', 'add', common.Newline, 'worktree', 'add', common.Newline,
'-b', os.path.join('wt', kwargs['gem5_build_id']), common.Newline, '-b', os.path.join('wt', kwargs['gem5_build_id']), common.Newline,
kwargs['gem5_src_dir'], common.Newline, kwargs['gem5_source_dir'], common.Newline,
]) ])
if kwargs['verbose']: if kwargs['verbose']:
verbose = ['--verbose', common.Newline] verbose = ['--verbose', common.Newline]
@@ -49,7 +50,7 @@ class Main(common.BuildCliFunction):
# I'm not even joking. No one has ever built x86 gem5 without the magic dist dir present. # I'm not even joking. No one has ever built x86 gem5 without the magic dist dir present.
pass pass
elif kwargs['arch'] == 'arm' or kwargs['arch'] == 'aarch64': elif kwargs['arch'] == 'arm' or kwargs['arch'] == 'aarch64':
gem5_system_src_dir = os.path.join(kwargs['gem5_src_dir'], 'system') gem5_system_src_dir = os.path.join(kwargs['gem5_source_dir'], 'system')
# dtb # dtb
dt_src_dir = os.path.join(gem5_system_src_dir, 'arm', 'dt') dt_src_dir = os.path.join(gem5_system_src_dir, 'arm', 'dt')
@@ -95,10 +96,10 @@ class Main(common.BuildCliFunction):
verbose + verbose +
common.add_newlines(kwargs['extra_scons_args']) common.add_newlines(kwargs['extra_scons_args'])
), ),
cwd=kwargs['gem5_src_dir'], cwd=kwargs['gem5_source_dir'],
extra_paths=[kwargs['ccache_dir']], extra_paths=[kwargs['ccache_dir']],
) )
term_src_dir = os.path.join(kwargs['gem5_src_dir'], 'util/term') term_src_dir = os.path.join(kwargs['gem5_source_dir'], 'util/term')
m5term_build = os.path.join(term_src_dir, 'm5term') m5term_build = os.path.join(term_src_dir, 'm5term')
common.run_cmd(['make', '-C', term_src_dir]) common.run_cmd(['make', '-C', term_src_dir])
if os.path.exists(kwargs['gem5_m5term']): if os.path.exists(kwargs['gem5_m5term']):

View File

@@ -19,7 +19,7 @@ class M5Component(common.Component):
'-f', 'Makefile.{}'.format(arch), common.Newline, '-f', 'Makefile.{}'.format(arch), common.Newline,
'CC={}'.format(cc), common.Newline, 'CC={}'.format(cc), common.Newline,
'LD={}'.format(ld), common.Newline, 'LD={}'.format(ld), common.Newline,
'PWD={}'.format(common.gem5_m5_src_dir), common.Newline, 'PWD={}'.format(common.gem5_m5_source_dir), common.Newline,
] ]
def do_build(self, args): def do_build(self, args):
@@ -29,15 +29,15 @@ class M5Component(common.Component):
self.clean(args) self.clean(args)
common.run_cmd( common.run_cmd(
self.get_make_cmd(args), self.get_make_cmd(args),
cwd=common.gem5_m5_src_dir, cwd=common.gem5_m5_source_dir,
) )
os.makedirs(common.out_rootfs_overlay_bin_dir, exist_ok=True) os.makedirs(common.out_rootfs_overlay_bin_dir, exist_ok=True)
common.cp(os.path.join(common.gem5_m5_src_dir, 'm5'), common.out_rootfs_overlay_bin_dir) common.cp(os.path.join(common.gem5_m5_source_dir, 'm5'), common.out_rootfs_overlay_bin_dir)
def clean(self, args): def clean(self, args):
common.run_cmd( common.run_cmd(
self.get_make_cmd(args) + ['clean', common.Newline], self.get_make_cmd(args) + ['clean', common.Newline],
cwd=common.gem5_m5_src_dir, cwd=common.gem5_m5_source_dir,
) )
if __name__ == '__main__': if __name__ == '__main__':

View File

@@ -30,10 +30,12 @@ class Argument:
if longname[0] == '-': if longname[0] == '-':
self.args.append(longname) self.args.append(longname)
self.key = longname.lstrip('-').replace('-', '_') self.key = longname.lstrip('-').replace('-', '_')
self.is_option = True
else: else:
self.key = longname.replace('-', '_') self.key = longname.replace('-', '_')
self.args.append(self.key) self.args.append(self.key)
self.kwargs['metavar'] = longname self.kwargs['metavar'] = longname
self.is_option = False
if default is not None and nargs is None: if default is not None and nargs is None:
self.kwargs['nargs'] = '?' self.kwargs['nargs'] = '?'
if nargs is not None: if nargs is not None:
@@ -55,6 +57,7 @@ class Argument:
self.optional = ( self.optional = (
default is not None or default is not None or
self.is_bool or self.is_bool or
self.is_option or
nargs in ('?', '*', '+') nargs in ('?', '*', '+')
) )
self.kwargs.update(kwargs) self.kwargs.update(kwargs)
@@ -150,13 +153,16 @@ class CliFunction:
parser.add_argument(*argument.args, **argument.kwargs) parser.add_argument(*argument.args, **argument.kwargs)
if argument.is_bool: if argument.is_bool:
new_longname = '--no' + argument.longname[1:] new_longname = '--no' + argument.longname[1:]
argument.kwargs['default'] = not argument.default kwargs = argument.kwargs.copy()
kwargs['default'] = not argument.default
if argument.default: if argument.default:
action = 'store_true' action = 'store_true'
else: else:
action = 'store_false' action = 'store_false'
argument.kwargs['action'] = action kwargs['action'] = action
parser.add_argument(new_longname, dest=argument.key, **argument.kwargs) if 'help' in kwargs:
del kwargs['help']
parser.add_argument(new_longname, dest=argument.key, **kwargs)
args = parser.parse_args(args=cli_args) args = parser.parse_args(args=cli_args)
return self(**vars(args)) return self(**vars(args))
@@ -176,6 +182,7 @@ if __name__ == '__main__':
self.add_argument('-q', '--qwer', default='Q', help='Help for qwer'), self.add_argument('-q', '--qwer', default='Q', help='Help for qwer'),
self.add_argument('-b', '--bool', default=True, help='Help for bool'), self.add_argument('-b', '--bool', default=True, help='Help for bool'),
self.add_argument('--bool-cli', default=False, help='Help for bool'), self.add_argument('--bool-cli', default=False, help='Help for bool'),
self.add_argument('--no-default', help='Help for no-bool'),
self.add_argument('pos-mandatory', help='Help for pos-mandatory', type=int), self.add_argument('pos-mandatory', help='Help for pos-mandatory', type=int),
self.add_argument('pos-optional', default=0, help='Help for pos-optional', type=int), self.add_argument('pos-optional', default=0, help='Help for pos-optional', type=int),
self.add_argument('args-star', help='Help for args-star', nargs='*'), self.add_argument('args-star', help='Help for args-star', nargs='*'),
@@ -188,10 +195,10 @@ amazing function!
return kwargs return kwargs
# Code calls. # Code calls.
assert OneCliFunction()(pos_mandatory=1) == {'asdf': 'A', 'qwer': 'Q', 'bool': True, 'bool_cli': True, 'pos_mandatory': 1, 'pos_optional': 0, 'args_star': []} assert OneCliFunction()(pos_mandatory=1) == {'asdf': 'A', 'qwer': 'Q', 'bool': True, 'bool_cli': True, 'no_default': None, 'pos_mandatory': 1, 'pos_optional': 0, 'args_star': []}
assert OneCliFunction()(pos_mandatory=1, asdf='B') == {'asdf': 'B', 'qwer': 'Q', 'bool': True, 'bool_cli': True, 'pos_mandatory': 1, 'pos_optional': 0, 'args_star': []} assert OneCliFunction()(pos_mandatory=1, asdf='B') == {'asdf': 'B', 'qwer': 'Q', 'bool': True, 'bool_cli': True, 'no_default': None, 'pos_mandatory': 1, 'pos_optional': 0, 'args_star': []}
assert OneCliFunction()(pos_mandatory=1, bool=False) == {'asdf': 'A', 'qwer': 'Q', 'bool': False, 'bool_cli': True, 'pos_mandatory': 1, 'pos_optional': 0, 'args_star': []} assert OneCliFunction()(pos_mandatory=1, bool=False) == {'asdf': 'A', 'qwer': 'Q', 'bool': False, 'bool_cli': True, 'no_default': None, 'pos_mandatory': 1, 'pos_optional': 0, 'args_star': []}
assert OneCliFunction()(pos_mandatory=1, asdf='B', qwer='R', bool=False) == {'asdf': 'B', 'qwer': 'R', 'bool': False, 'bool_cli': True, 'pos_mandatory': 1, 'pos_optional': 0, 'args_star': []} assert OneCliFunction()(pos_mandatory=1, asdf='B', qwer='R', bool=False) == {'asdf': 'B', 'qwer': 'R', 'bool': False, 'bool_cli': True, 'no_default': None, 'pos_mandatory': 1, 'pos_optional': 0, 'args_star': []}
# Force a boolean value set on the config to be False on CLI. # Force a boolean value set on the config to be False on CLI.
assert OneCliFunction().cli(['--no-bool-cli', '1'])['bool_cli'] is False assert OneCliFunction().cli(['--no-bool-cli', '1'])['bool_cli'] is False

620
common.py
View File

@@ -40,6 +40,12 @@ if consts['in_docker']:
consts['out_dir'] = os.path.join(consts['root_dir'], 'out.docker') consts['out_dir'] = os.path.join(consts['root_dir'], 'out.docker')
else: else:
consts['out_dir'] = os.path.join(consts['root_dir'], 'out') consts['out_dir'] = os.path.join(consts['root_dir'], 'out')
consts['gem5_out_dir'] = os.path.join(consts['out_dir'], 'gem5')
consts['kernel_modules_build_base_dir'] = os.path.join(consts['out_dir'], 'kernel_modules')
consts['buildroot_out_dir'] = os.path.join(consts['out_dir'], 'buildroot')
consts['gem5_m5_build_dir'] = os.path.join(consts['out_dir'], 'util', 'm5')
consts['run_dir_base'] = os.path.join(consts['out_dir'], 'run')
consts['crosstool_ng_out_dir'] = os.path.join(consts['out_dir'], 'crosstool-ng')
consts['bench_boot'] = os.path.join(consts['out_dir'], 'bench-boot.txt') consts['bench_boot'] = os.path.join(consts['out_dir'], 'bench-boot.txt')
consts['packages_dir'] = os.path.join(consts['root_dir'], 'buildroot_packages') consts['packages_dir'] = os.path.join(consts['root_dir'], 'buildroot_packages')
consts['kernel_modules_subdir'] = 'kernel_modules' consts['kernel_modules_subdir'] = 'kernel_modules'
@@ -55,6 +61,7 @@ consts['crosstool_ng_src_dir'] = os.path.join(consts['submodules_dir'], 'crossto
consts['crosstool_ng_supported_archs'] = set(['arm', 'aarch64']) consts['crosstool_ng_supported_archs'] = set(['arm', 'aarch64'])
consts['linux_src_dir'] = os.path.join(consts['submodules_dir'], 'linux') consts['linux_src_dir'] = os.path.join(consts['submodules_dir'], 'linux')
consts['linux_config_dir'] = os.path.join(consts['root_dir'], 'linux_config') consts['linux_config_dir'] = os.path.join(consts['root_dir'], 'linux_config')
consts['gem5_default_src_dir'] = os.path.join(consts['submodules_dir'], 'gem5')
consts['rootfs_overlay_dir'] = os.path.join(consts['root_dir'], 'rootfs_overlay') consts['rootfs_overlay_dir'] = os.path.join(consts['root_dir'], 'rootfs_overlay')
consts['extract_vmlinux'] = os.path.join(consts['linux_src_dir'], 'scripts', 'extract-vmlinux') consts['extract_vmlinux'] = os.path.join(consts['linux_src_dir'], 'scripts', 'extract-vmlinux')
consts['qemu_src_dir'] = os.path.join(consts['submodules_dir'], 'qemu') consts['qemu_src_dir'] = os.path.join(consts['submodules_dir'], 'qemu')
@@ -85,6 +92,7 @@ consts['obj_ext'] = '.o'
consts['config_file'] = os.path.join(consts['data_dir'], 'config.py') consts['config_file'] = os.path.join(consts['data_dir'], 'config.py')
consts['command_prefix'] = '+ ' consts['command_prefix'] = '+ '
consts['magic_fail_string'] = b'lkmc_test_fail' consts['magic_fail_string'] = b'lkmc_test_fail'
consts['baremetal_lib_basename'] = 'lib'
class LkmcCliFunction(cli_function.CliFunction): class LkmcCliFunction(cli_function.CliFunction):
''' '''
@@ -96,8 +104,8 @@ class LkmcCliFunction(cli_function.CliFunction):
def __init__(self): def __init__(self):
super().__init__(config_file=common.consts['config_file']) super().__init__(config_file=common.consts['config_file'])
self.add_argument( self.add_argument(
'-a', '--arch', choices=common.arch_choices, default=common.default_arch, '-a', '--arch', choices=consts['arch_choices'], default=consts['default_arch'],
help='CPU architecture. Default: %(default)s' help='CPU architecture.'
) )
self.add_argument( self.add_argument(
'--dry-run', '--dry-run',
@@ -122,6 +130,8 @@ mkdir are generally omitted since those are obvious
''' '''
if not kwargs['dry_run']: if not kwargs['dry_run']:
start_time = time.time() start_time = time.time()
kwargs.update(common.consts)
kwargs = set_kwargs(kwargs)
self.timed_main(**kwargs) self.timed_main(**kwargs)
if not kwargs['dry_run']: if not kwargs['dry_run']:
end_time = time.time() end_time = time.time()
@@ -149,7 +159,7 @@ class BuildCliFunction(LkmcCliFunction):
'--nproc', '--nproc',
default=multiprocessing.cpu_count(), default=multiprocessing.cpu_count(),
type=int, type=int,
help='Number of processors to use for the build. Default: use all cores.', help='Number of processors to use for the build.',
) )
def clean(self, **kwargs): def clean(self, **kwargs):
@@ -184,6 +194,37 @@ class Newline:
''' '''
pass pass
def add_args_gem5(parser):
parser.add_argument(
'--gem5-build-dir',
help='''\
Use the given directory as the gem5 build directory.
'''
)
parser.add_argument(
'-M', '--gem5-build-id',
help='''\
gem5 build ID. Allows you to keep multiple separate gem5 builds.
'''
)
parser.add_argument(
'--gem5-build-type', default='opt',
help='gem5 build type, most often used for "debug" builds.'
)
parser.add_argument(
'--gem5-source-dir',
help='''\
Use the given directory as the gem5 source tree. Ignore `--gem5-worktree`.
'''
)
parser.add_argument(
'-N', '--gem5-worktree',
help='''\
Create and use a git worktree of the gem5 submodule.
See: https://github.com/cirosantilli/linux-kernel-module-cheat#gem5-worktree
'''
)
def add_newlines(cmd): def add_newlines(cmd):
out = [] out = []
for arg in cmd: for arg in cmd:
@@ -293,16 +334,16 @@ inside baremetal/ and then try to use corresponding executable.
) )
parser.add_argument( parser.add_argument(
'--buildroot-build-id', '--buildroot-build-id',
default=default_build_id, default=consts['default_build_id'],
help='Buildroot build ID. Allows you to keep multiple separate gem5 builds. Default: %(default)s' help='Buildroot build ID. Allows you to keep multiple separate gem5 builds.'
) )
parser.add_argument( parser.add_argument(
'--buildroot-linux', default=False, action='store_true', '--buildroot-linux', default=False, action='store_true',
help='Boot with the Buildroot Linux kernel instead of our custom built one. Mostly for sanity checks.' help='Boot with the Buildroot Linux kernel instead of our custom built one. Mostly for sanity checks.'
) )
parser.add_argument( parser.add_argument(
'--crosstool-ng-build-id', default=default_build_id, '--crosstool-ng-build-id', default=consts['default_build_id'],
help='Crosstool-NG build ID. Allows you to keep multiple separate crosstool-NG builds. Default: %(default)s' help='Crosstool-NG build ID. Allows you to keep multiple separate crosstool-NG builds.'
) )
parser.add_argument( parser.add_argument(
'--docker', default=False, action='store_true', '--docker', default=False, action='store_true',
@@ -311,8 +352,8 @@ Use the docker download Ubuntu root filesystem instead of the default Buildroot
''' '''
) )
parser.add_argument( parser.add_argument(
'-L', '--linux-build-id', default=default_build_id, '-L', '--linux-build-id', default=consts['default_build_id'],
help='Linux build ID. Allows you to keep multiple separate Linux builds. Default: %(default)s' help='Linux build ID. Allows you to keep multiple separate Linux builds.'
) )
parser.add_argument( parser.add_argument(
'--machine', '--machine',
@@ -324,43 +365,13 @@ See the documentation for other values known to work.
) )
emulator_group.add_argument( emulator_group.add_argument(
'-g', '--gem5', default=False, action='store_true', '-g', '--gem5', default=False, action='store_true',
help='Use gem5 instead of QEMU. Default: False' help='Use gem5 instead of QEMU.'
)
parser.add_argument(
'--gem5-build-dir',
help='''\
Use the given directory as the gem5 build directory.
'''
)
parser.add_argument(
'-M', '--gem5-build-id',
help='''\
gem5 build ID. Allows you to keep multiple separate gem5 builds. Default: {}
'''.format(default_build_id)
)
parser.add_argument(
'--gem5-build-type', default='opt',
help='gem5 build type, most often used for "debug" builds. Default: %(default)s'
)
parser.add_argument(
'--gem5-source-dir',
help='''\
Use the given directory as the gem5 source tree. Ignore `--gem5-worktree`.
'''
)
parser.add_argument(
'-N', '--gem5-worktree',
help='''\
Create and use a git worktree of the gem5 submodule.
See: https://github.com/cirosantilli/linux-kernel-module-cheat#gem5-worktree
'''
) )
parser.add_argument( parser.add_argument(
'-n', '--run-id', default='0', '-n', '--run-id', default='0',
help='''\ help='''\
ID for run outputs such as gem5's m5out. Allows you to do multiple runs, ID for run outputs such as gem5's m5out. Allows you to do multiple runs,
and then inspect separate outputs later in different output directories. and then inspect separate outputs later in different output directories.
Default: %(default)s
''' '''
) )
parser.add_argument( parser.add_argument(
@@ -375,8 +386,7 @@ the likelihood of incompatibilities.
'--port-offset', type=int, '--port-offset', type=int,
help='''\ help='''\
Increase the ports to be used such as for GDB by an offset to run multiple Increase the ports to be used such as for GDB by an offset to run multiple
instances in parallel. instances in parallel. Default: the run ID (-n) if that is an integer, otherwise 0.
Default: the run ID (-n) if that is an integer, otherwise 0.
''' '''
) )
emulator_group.add_argument( emulator_group.add_argument(
@@ -387,8 +397,8 @@ to allow overriding configs from the CLI.
''' '''
) )
parser.add_argument( parser.add_argument(
'-Q', '--qemu-build-id', default=default_build_id, '-Q', '--qemu-build-id', default=consts['default_build_id'],
help='QEMU build ID. Allows you to keep multiple separate QEMU builds. Default: %(default)s' help='QEMU build ID. Allows you to keep multiple separate QEMU builds.'
) )
parser.add_argument( parser.add_argument(
'--userland-build-id', default=None '--userland-build-id', default=None
@@ -693,262 +703,6 @@ def run_cmd(
else: else:
return 0 return 0
def calculate_kwargs(**kwargs):
'''
Update the kwargs from the command line with derived arguments.
'''
if args.qemu or not args.gem5:
common['emulator'] = 'qemu'
else:
common['emulator'] = 'gem5'
if args.arch in common.arch_short_to_long_dict:
args.arch = common.arch_short_to_long_dict[args.arch]
if args.gem5_build_id is None:
args.gem5_build_id = default_build_id
gem5_build_id_given = False
else:
gem5_build_id_given = True
if args.userland_build_id is None:
args.userland_build_id = default_build_id
common.userland_build_id_given = False
else:
common.userland_build_id_given = True
if args.gem5_worktree is not None and not gem5_build_id_given:
args.gem5_build_id = args.gem5_worktree
common['machine'] = args.machine
common.setup_dry_run_arguments(args)
common.is_arm = False
if args.arch == 'arm':
common['armv'] = 7
common.gem5_arch = 'ARM'
common['mcpu'] = 'cortex-a15'
common.buildroot_toolchain_prefix = 'arm-buildroot-linux-uclibcgnueabihf'
common.crosstool_ng_toolchain_prefix = 'arm-unknown-eabi'
common.ubuntu_toolchain_prefix = 'arm-linux-gnueabihf'
if common['emulator'] == 'gem5':
if common['machine'] is None:
common['machine'] = 'VExpress_GEM5_V1'
else:
if common['machine'] is None:
common['machine'] = 'virt'
common.is_arm = True
elif args.arch == 'aarch64':
common['armv'] = 8
common.gem5_arch = 'ARM'
common['mcpu'] = 'cortex-a57'
common.buildroot_toolchain_prefix = 'aarch64-buildroot-linux-uclibc'
common.crosstool_ng_toolchain_prefix = 'aarch64-unknown-elf'
common.ubuntu_toolchain_prefix = 'aarch64-linux-gnu'
if common['emulator'] == 'gem5':
if common['machine'] is None:
common['machine'] = 'VExpress_GEM5_V1'
else:
if common['machine'] is None:
common['machine'] = 'virt'
common.is_arm = True
elif args.arch == 'x86_64':
common.crosstool_ng_toolchain_prefix = 'x86_64-unknown-elf'
common.gem5_arch = 'X86'
common.buildroot_toolchain_prefix = 'x86_64-buildroot-linux-uclibc'
common.ubuntu_toolchain_prefix = 'x86_64-linux-gnu'
if common['emulator'] == 'gem5':
if common['machine'] is None:
common['machine'] = 'TODO'
else:
if common['machine'] is None:
common['machine'] = 'pc'
common.buildroot_out_dir = os.path.join(consts['out_dir'], 'buildroot')
common.buildroot_build_dir = os.path.join(common.buildroot_out_dir, 'build', args.buildroot_build_id, args.arch)
common.buildroot_download_dir = os.path.join(common.buildroot_out_dir, 'download')
common.buildroot_config_file = os.path.join(common.buildroot_build_dir, '.config')
common.buildroot_build_build_dir = os.path.join(common.buildroot_build_dir, 'build')
common.buildroot_linux_build_dir = os.path.join(common.buildroot_build_build_dir, 'linux-custom')
common.buildroot_vmlinux = os.path.join(common.buildroot_linux_build_dir, "vmlinux")
common.qemu_build_dir = os.path.join(consts['out_dir'], 'qemu', args.qemu_build_id)
common.qemu_executable_basename = 'qemu-system-{}'.format(args.arch)
common.qemu_executable = os.path.join(common.qemu_build_dir, '{}-softmmu'.format(args.arch), common.qemu_executable_basename)
common.qemu_img_basename = 'qemu-img'
common.qemu_img_executable = os.path.join(common.qemu_build_dir, common.qemu_img_basename)
common.host_dir = os.path.join(common.buildroot_build_dir, 'host')
common.host_bin_dir = os.path.join(common.host_dir, 'usr', 'bin')
common.buildroot_pkg_config = os.path.join(common.host_bin_dir, 'pkg-config')
common.buildroot_images_dir = os.path.join(common.buildroot_build_dir, 'images')
common.buildroot_rootfs_raw_file = os.path.join(common.buildroot_images_dir, 'rootfs.ext2')
common.buildroot_qcow2_file = common.buildroot_rootfs_raw_file + '.qcow2'
common.staging_dir = os.path.join(consts['out_dir'], 'staging', args.arch)
common.buildroot_staging_dir = os.path.join(common.buildroot_build_dir, 'staging')
common.target_dir = os.path.join(common.buildroot_build_dir, 'target')
common.run_dir_base = os.path.join(consts['out_dir'], 'run')
common.gem5_run_dir = os.path.join(common.run_dir_base, 'gem5', args.arch, str(args.run_id))
common.m5out_dir = os.path.join(common.gem5_run_dir, 'm5out')
common.stats_file = os.path.join(common.m5out_dir, 'stats.txt')
common.gem5_trace_txt_file = os.path.join(common.m5out_dir, 'trace.txt')
common.gem5_guest_terminal_file = os.path.join(common.m5out_dir, 'system.terminal')
common.gem5_readfile = os.path.join(common.gem5_run_dir, 'readfile')
common.gem5_termout_file = os.path.join(common.gem5_run_dir, 'termout.txt')
common.qemu_run_dir = os.path.join(common.run_dir_base, 'qemu', args.arch, str(args.run_id))
common.qemu_trace_basename = 'trace.bin'
common.qemu_trace_file = os.path.join(common.qemu_run_dir, 'trace.bin')
common.qemu_trace_txt_file = os.path.join(common.qemu_run_dir, 'trace.txt')
common.qemu_termout_file = os.path.join(common.qemu_run_dir, 'termout.txt')
common.qemu_rrfile = os.path.join(common.qemu_run_dir, 'rrfile')
common.qemu_guest_terminal_file = os.path.join(common.m5out_dir, qemu_termout_file)
common.gem5_out_dir = os.path.join(consts['out_dir'], 'gem5')
if args.gem5_build_dir is None:
common.gem5_build_dir = os.path.join(common.gem5_out_dir, args.gem5_build_id, args.gem5_build_type)
else:
common.gem5_build_dir = args.gem5_build_dir
common.gem5_fake_iso = os.path.join(common.gem5_out_dir, 'fake.iso')
common.gem5_m5term = os.path.join(common.gem5_build_dir, 'm5term')
common.gem5_build_build_dir = os.path.join(common.gem5_build_dir, 'build')
common.gem5_executable = os.path.join(common.gem5_build_build_dir, gem5_arch, 'gem5.{}'.format(args.gem5_build_type))
common.gem5_system_dir = os.path.join(common.gem5_build_dir, 'system')
common.crosstool_ng_out_dir = os.path.join(consts['out_dir'], 'crosstool-ng')
common.crosstool_ng_buildid_dir = os.path.join(common.crosstool_ng_out_dir, 'build', args.crosstool_ng_build_id)
common.crosstool_ng_install_dir = os.path.join(common.crosstool_ng_buildid_dir, 'install', args.arch)
common.crosstool_ng_bin_dir = os.path.join(common.crosstool_ng_install_dir, 'bin')
common.crosstool_ng_util_dir = os.path.join(common.crosstool_ng_buildid_dir, 'util')
common.crosstool_ng_config = os.path.join(common.crosstool_ng_util_dir, '.config')
common.crosstool_ng_defconfig = os.path.join(common.crosstool_ng_util_dir, 'defconfig')
common.crosstool_ng_executable = os.path.join(common.crosstool_ng_util_dir, 'ct-ng')
common.crosstool_ng_build_dir = os.path.join(common.crosstool_ng_buildid_dir, 'build')
common.crosstool_ng_download_dir = os.path.join(common.crosstool_ng_out_dir, 'download')
common.gem5_default_src_dir = os.path.join(submodules_dir, 'gem5')
if args.gem5_source_dir is not None:
common.gem5_src_dir = args.gem5_source_dir
assert(os.path.exists(args.gem5_source_dir))
else:
if args.gem5_worktree is not None:
common.gem5_src_dir = os.path.join(common.gem5_non_default_src_root_dir, args.gem5_worktree)
else:
common.gem5_src_dir = common.gem5_default_src_dir
common.gem5_m5_src_dir = os.path.join(common.gem5_src_dir, 'util', 'm5')
common.gem5_m5_build_dir = os.path.join(consts['out_dir'], 'util', 'm5')
if common['emulator'] == 'gem5':
common['executable'] = common.gem5_executable
common.run_dir = common.gem5_run_dir
common.termout_file = common.gem5_termout_file
common.guest_terminal_file = gem5_guest_terminal_file
common.trace_txt_file = gem5_trace_txt_file
else:
common['executable'] = common.qemu_executable
common.run_dir = common.qemu_run_dir
common.termout_file = common.qemu_termout_file
common.guest_terminal_file = qemu_guest_terminal_file
common.trace_txt_file = qemu_trace_txt_file
common.gem5_config_dir = os.path.join(common.gem5_src_dir, 'configs')
common.gem5_se_file = os.path.join(common.gem5_config_dir, 'example', 'se.py')
common.gem5_fs_file = os.path.join(common.gem5_config_dir, 'example', 'fs.py')
common.run_cmd_file = os.path.join(common.run_dir, 'run.sh')
# Linux
common.linux_buildroot_build_dir = os.path.join(common.buildroot_build_build_dir, 'linux-custom')
common.linux_build_dir = os.path.join(consts['out_dir'], 'linux', args.linux_build_id, args.arch)
common.lkmc_vmlinux = os.path.join(common.linux_build_dir, "vmlinux")
if args.arch == 'arm':
common.linux_arch = 'arm'
common.linux_image_prefix = os.path.join('arch', common.linux_arch, 'boot', 'zImage')
elif args.arch == 'aarch64':
common.linux_arch = 'arm64'
common.linux_image_prefix = os.path.join('arch', common.linux_arch, 'boot', 'Image')
elif args.arch == 'x86_64':
common.linux_arch = 'x86'
common.linux_image_prefix = os.path.join('arch', common.linux_arch, 'boot', 'bzImage')
common.lkmc_linux_image = os.path.join(common.linux_build_dir, common.linux_image_prefix)
common.buildroot_linux_image = os.path.join(common.buildroot_linux_build_dir, linux_image_prefix)
if args.buildroot_linux:
common['vmlinux'] = common.buildroot_vmlinux
common.linux_image = common.buildroot_linux_image
else:
common['vmlinux'] = common.lkmc_vmlinux
common.linux_image = common.lkmc_linux_image
# Kernel modules.
common.kernel_modules_build_base_dir = os.path.join(consts['out_dir'], 'kernel_modules')
common.kernel_modules_build_dir = os.path.join(common.kernel_modules_build_base_dir, args.arch)
common.kernel_modules_build_subdir = os.path.join(common.kernel_modules_build_dir, kernel_modules_subdir)
common.kernel_modules_build_host_dir = os.path.join(common.kernel_modules_build_base_dir, 'host')
common.kernel_modules_build_host_subdir = os.path.join(common.kernel_modules_build_host_dir, kernel_modules_subdir)
common.userland_build_dir = os.path.join(consts['out_dir'], 'userland', args.userland_build_id, args.arch)
common.out_rootfs_overlay_dir = os.path.join(consts['out_dir'], 'rootfs_overlay', args.arch)
common.out_rootfs_overlay_bin_dir = os.path.join(common.out_rootfs_overlay_dir, 'bin')
# Ports
if args.port_offset is None:
try:
args.port_offset = int(args.run_id)
except ValueError:
args.port_offset = 0
if common['emulator'] == 'gem5':
common.gem5_telnet_port = 3456 + args.port_offset
common.gdb_port = 7000 + args.port_offset
else:
common.qemu_base_port = 45454 + 10 * args.port_offset
common.qemu_monitor_port = common.qemu_base_port + 0
common.qemu_hostfwd_generic_port = common.qemu_base_port + 1
common.qemu_hostfwd_ssh_port = common.qemu_base_port + 2
common.qemu_gdb_port = common.qemu_base_port + 3
common.extra_serial_port = common.qemu_base_port + 4
common.gdb_port = common.qemu_gdb_port
common.qemu_background_serial_file = os.path.join(common.qemu_run_dir, 'background.log')
# Baremetal.
common['baremetal'] = args.baremetal
common.baremetal_lib_basename = 'lib'
common.baremetal_src_dir = os.path.join(consts['root_dir'], 'baremetal')
common.baremetal_src_lib_dir = os.path.join(common.baremetal_src_dir, common.baremetal_lib_basename)
if common['emulator'] == 'gem5':
common.simulator_name = 'gem5'
else:
common.simulator_name = 'qemu'
common.baremetal_build_dir = os.path.join(out_dir, 'baremetal', args.arch, common.simulator_name, common['machine'])
common.baremetal_build_lib_dir = os.path.join(common.baremetal_build_dir, common.baremetal_lib_basename)
common.baremetal_build_ext = '.elf'
# Docker
common.docker_build_dir = os.path.join(consts['out_dir'], 'docker', args.arch)
common.docker_tar_dir = os.path.join(common.docker_build_dir, 'export')
common.docker_tar_file = os.path.join(common.docker_build_dir, 'export.tar')
common.docker_rootfs_raw_file = os.path.join(common.docker_build_dir, 'export.ext2')
common.docker_qcow2_file = os.path.join(common.docker_rootfs_raw_file + '.qcow2')
if args.docker:
common.rootfs_raw_file = common.docker_rootfs_raw_file
common.qcow2_file = common.docker_qcow2_file
else:
common.rootfs_raw_file = common.buildroot_rootfs_raw_file
common.qcow2_file = common.buildroot_qcow2_file
# Image.
if common['baremetal'] is None:
if common['emulator'] == 'gem5':
common['image'] = common['vmlinux']
common.disk_image = common.rootfs_raw_file
else:
common['image'] = common.linux_image
common.disk_image = common.qcow2_file
else:
common.disk_image = common.gem5_fake_iso
if common['baremetal'] == 'all':
path = common['baremetal']
else:
path = common.resolve_executable(
common['baremetal'],
common.baremetal_src_dir,
common.baremetal_build_dir,
common.baremetal_build_ext,
)
source_path_noext = os.path.splitext(os.path.join(
common.baremetal_src_dir,
os.path.relpath(path, common.baremetal_build_dir)
))[0]
for ext in [c_ext, asm_ext]:
source_path = source_path_noext + ext
if os.path.exists(source_path):
common.source_path = source_path
break
common['image'] = path
return args
def resolve_executable(in_path, magic_in_dir, magic_out_dir, out_ext): def resolve_executable(in_path, magic_in_dir, magic_out_dir, out_ext):
if os.path.isabs(in_path): if os.path.isabs(in_path):
return in_path return in_path
@@ -974,8 +728,270 @@ def resolve_userland(path):
common.userland_build_ext, common.userland_build_ext,
) )
def setup_dry_run_arguments(args): def set_kwargs(kwargs):
common.dry_run = args.dry_run '''
Update the kwargs from the command line with derived arguments.
'''
def join(*paths):
'''
This is bad, we should just find a nice way to lazily evaluate the kwargs.
'''
if None in paths:
return None
else:
return os.path.join(*paths)
kwargs = collections.defaultdict(lambda: None, **kwargs)
if kwargs['qemu'] or not kwargs['gem5']:
kwargs['emulator'] = 'qemu'
else:
kwargs['emulator'] = 'gem5'
if kwargs['arch'] in kwargs['arch_short_to_long_dict']:
kwargs['arch'] = kwargs['arch_short_to_long_dict'][kwargs['arch']]
if kwargs['gem5_build_id'] is None:
kwargs['gem5_build_id'] = kwargs['default_build_id']
gem5_build_id_given = False
else:
gem5_build_id_given = True
if kwargs['userland_build_id'] is None:
kwargs['userland_build_id'] = kwargs['default_build_id']
kwargs['userland_build_id_given'] = False
else:
kwargs['userland_build_id_given'] = True
if kwargs['gem5_worktree'] is not None and not gem5_build_id_given:
kwargs['gem5_build_id'] = kwargs['gem5_worktree']
kwargs['is_arm'] = False
if kwargs['arch'] == 'arm':
kwargs['armv'] = 7
kwargs['gem5_arch'] = 'ARM'
kwargs['mcpu'] = 'cortex-a15'
kwargs['buildroot_toolchain_prefix'] = 'arm-buildroot-linux-uclibcgnueabihf'
kwargs['crosstool_ng_toolchain_prefix'] = 'arm-unknown-eabi'
kwargs['ubuntu_toolchain_prefix'] = 'arm-linux-gnueabihf'
if kwargs['emulator'] == 'gem5':
if kwargs['machine'] is None:
kwargs['machine'] = 'VExpress_GEM5_V1'
else:
if kwargs['machine'] is None:
kwargs['machine'] = 'virt'
kwargs['is_arm'] = True
elif kwargs['arch'] == 'aarch64':
kwargs['armv'] = 8
kwargs['gem5_arch'] = 'ARM'
kwargs['mcpu'] = 'cortex-a57'
kwargs['buildroot_toolchain_prefix'] = 'aarch64-buildroot-linux-uclibc'
kwargs['crosstool_ng_toolchain_prefix'] = 'aarch64-unknown-elf'
kwargs['ubuntu_toolchain_prefix'] = 'aarch64-linux-gnu'
if kwargs['emulator'] == 'gem5':
if kwargs['machine'] is None:
kwargs['machine'] = 'VExpress_GEM5_V1'
else:
if kwargs['machine'] is None:
kwargs['machine'] = 'virt'
kwargs['is_arm'] = True
elif kwargs['arch'] == 'x86_64':
kwargs['crosstool_ng_toolchain_prefix'] = 'x86_64-unknown-elf'
kwargs['gem5_arch'] = 'X86'
kwargs['buildroot_toolchain_prefix'] = 'x86_64-buildroot-linux-uclibc'
kwargs['ubuntu_toolchain_prefix'] = 'x86_64-linux-gnu'
if kwargs['emulator'] == 'gem5':
if kwargs['machine'] is None:
kwargs['machine'] = 'TODO'
else:
if kwargs['machine'] is None:
kwargs['machine'] = 'pc'
if 'buildroot_build_id' in kwargs:
kwargs['buildroot_build_dir'] = join(kwargs['buildroot_out_dir'], 'build', kwargs['buildroot_build_id'], kwargs['arch'])
kwargs['buildroot_download_dir'] = join(kwargs['buildroot_out_dir'], 'download')
kwargs['buildroot_config_file'] = join(kwargs['buildroot_build_dir'], '.config')
kwargs['buildroot_build_build_dir'] = join(kwargs['buildroot_build_dir'], 'build')
kwargs['buildroot_linux_build_dir'] = join(kwargs['buildroot_build_build_dir'], 'linux-custom')
kwargs['buildroot_vmlinux'] = join(kwargs['buildroot_linux_build_dir'], "vmlinux")
kwargs['host_dir'] = join(kwargs['buildroot_build_dir'], 'host')
kwargs['host_bin_dir'] = join(kwargs['host_dir'], 'usr', 'bin')
kwargs['buildroot_pkg_config'] = join(kwargs['host_bin_dir'], 'pkg-config')
kwargs['buildroot_images_dir'] = join(kwargs['buildroot_build_dir'], 'images')
kwargs['buildroot_rootfs_raw_file'] = join(kwargs['buildroot_images_dir'], 'rootfs.ext2')
kwargs['buildroot_qcow2_file'] = kwargs['buildroot_rootfs_raw_file'] + '.qcow2'
kwargs['staging_dir'] = join(kwargs['out_dir'], 'staging', kwargs['arch'])
kwargs['buildroot_staging_dir'] = join(kwargs['buildroot_build_dir'], 'staging')
kwargs['target_dir'] = join(kwargs['buildroot_build_dir'], 'target')
kwargs['linux_buildroot_build_dir'] = join(kwargs['buildroot_build_build_dir'], 'linux-custom')
if 'qemu_build_id' in kwargs:
kwargs['qemu_build_dir'] = join(kwargs['out_dir'], 'qemu', kwargs['qemu_build_id'])
kwargs['qemu_executable_basename'] = 'qemu-system-{}'.format(kwargs['arch'])
kwargs['qemu_executable'] = join(kwargs['qemu_build_dir'], '{}-softmmu'.format(kwargs['arch']), kwargs['qemu_executable_basename'])
kwargs['qemu_img_basename'] = 'qemu-img'
kwargs['qemu_img_executable'] = join(kwargs['qemu_build_dir'], kwargs['qemu_img_basename'])
kwargs['qemu_termout_file'] = join(kwargs['qemu_run_dir'], 'termout.txt')
# gem5 build
if 'gem5_build_id' in kwargs:
if kwargs['gem5_build_dir'] is None:
kwargs['gem5_build_dir'] = join(kwargs['gem5_out_dir'], kwargs['gem5_build_id'], kwargs['gem5_build_type'])
kwargs['gem5_fake_iso'] = join(kwargs['gem5_out_dir'], 'fake.iso')
kwargs['gem5_m5term'] = join(kwargs['gem5_build_dir'], 'm5term')
kwargs['gem5_build_build_dir'] = join(kwargs['gem5_build_dir'], 'build')
kwargs['gem5_executable'] = join(kwargs['gem5_build_build_dir'], kwargs['gem5_arch'], 'gem5.{}'.format(kwargs['gem5_build_type']))
kwargs['gem5_system_dir'] = join(kwargs['gem5_build_dir'], 'system')
# gem5 source
if kwargs['gem5_source_dir'] is not None:
assert os.path.exists(kwargs['gem5_source_dir'])
else:
if kwargs['gem5_worktree'] is not None:
kwargs['gem5_source_dir'] = join(kwargs['gem5_non_default_src_root_dir'], kwargs['gem5_worktree'])
else:
kwargs['gem5_source_dir'] = kwargs['gem5_default_src_dir']
kwargs['gem5_m5_source_dir'] = join(kwargs['gem5_source_dir'], 'util', 'm5')
kwargs['gem5_config_dir'] = join(kwargs['gem5_source_dir'], 'configs')
kwargs['gem5_se_file'] = join(kwargs['gem5_config_dir'], 'example', 'se.py')
kwargs['gem5_fs_file'] = join(kwargs['gem5_config_dir'], 'example', 'fs.py')
if 'crosstool_ng_build_id' in kwargs:
kwargs['crosstool_ng_buildid_dir'] = join(kwargs['crosstool_ng_out_dir'], 'build', kwargs['crosstool_ng_build_id'])
kwargs['crosstool_ng_install_dir'] = join(kwargs['crosstool_ng_buildid_dir'], 'install', kwargs['arch'])
kwargs['crosstool_ng_bin_dir'] = join(kwargs['crosstool_ng_install_dir'], 'bin')
kwargs['crosstool_ng_util_dir'] = join(kwargs['crosstool_ng_buildid_dir'], 'util')
kwargs['crosstool_ng_config'] = join(kwargs['crosstool_ng_util_dir'], '.config')
kwargs['crosstool_ng_defconfig'] = join(kwargs['crosstool_ng_util_dir'], 'defconfig')
kwargs['crosstool_ng_executable'] = join(kwargs['crosstool_ng_util_dir'], 'ct-ng')
kwargs['crosstool_ng_build_dir'] = join(kwargs['crosstool_ng_buildid_dir'], 'build')
kwargs['crosstool_ng_download_dir'] = join(kwargs['crosstool_ng_out_dir'], 'download')
if 'run_id' in kwargs:
kwargs['qemu_guest_terminal_file'] = join(kwargs['m5out_dir'], kwargs['qemu_termout_file'])
kwargs['gem5_run_dir'] = join(kwargs['run_dir_base'], 'gem5', kwargs['arch'], str(kwargs['run_id']))
kwargs['m5out_dir'] = join(kwargs['gem5_run_dir'], 'm5out')
kwargs['stats_file'] = join(kwargs['m5out_dir'], 'stats.txt')
kwargs['gem5_trace_txt_file'] = join(kwargs['m5out_dir'], 'trace.txt')
kwargs['gem5_guest_terminal_file'] = join(kwargs['m5out_dir'], 'system.terminal')
kwargs['gem5_readfile'] = join(kwargs['gem5_run_dir'], 'readfile')
kwargs['gem5_termout_file'] = join(kwargs['gem5_run_dir'], 'termout.txt')
kwargs['qemu_run_dir'] = join(kwargs['run_dir_base'], 'qemu', kwargs['arch'], str(kwargs['run_id']))
kwargs['qemu_trace_basename'] = 'trace.bin'
kwargs['qemu_trace_file'] = join(kwargs['qemu_run_dir'], 'trace.bin')
kwargs['qemu_trace_txt_file'] = join(kwargs['qemu_run_dir'], 'trace.txt')
kwargs['qemu_rrfile'] = join(kwargs['qemu_run_dir'], 'rrfile')
kwargs['gem5_out_dir'] = join(kwargs['out_dir'], 'gem5')
# Ports
if kwargs['port_offset'] is None:
try:
kwargs['port_offset'] = int(kwargs['run_id'])
except ValueError:
kwargs['port_offset'] = 0
if kwargs['emulator'] == 'gem5':
kwargs['gem5_telnet_port'] = 3456 + kwargs['port_offset']
kwargs['gdb_port'] = 7000 + kwargs['port_offset']
else:
kwargs['qemu_base_port'] = 45454 + 10 * kwargs['port_offset']
kwargs['qemu_monitor_port'] = kwargs['qemu_base_port'] + 0
kwargs['qemu_hostfwd_generic_port'] = kwargs['qemu_base_port'] + 1
kwargs['qemu_hostfwd_ssh_port'] = kwargs['qemu_base_port'] + 2
kwargs['qemu_gdb_port'] = kwargs['qemu_base_port'] + 3
kwargs['extra_serial_port'] = kwargs['qemu_base_port'] + 4
kwargs['gdb_port'] = kwargs['qemu_gdb_port']
kwargs['qemu_background_serial_file'] = join(kwargs['qemu_run_dir'], 'background.log')
# gem5 QEMU polymorphism.
if kwargs['emulator'] == 'gem5':
kwargs['executable'] = kwargs['gem5_executable']
kwargs['run_dir'] = kwargs['gem5_run_dir']
kwargs['termout_file'] = kwargs['gem5_termout_file']
kwargs['guest_terminal_file'] = gem5_guest_terminal_file
kwargs['trace_txt_file'] = gem5_trace_txt_file
else:
kwargs['executable'] = kwargs['qemu_executable']
kwargs['run_dir'] = kwargs['qemu_run_dir']
kwargs['termout_file'] = kwargs['qemu_termout_file']
kwargs['guest_terminal_file'] = kwargs['qemu_guest_terminal_file']
kwargs['trace_txt_file'] = kwargs['qemu_trace_txt_file']
kwargs['run_cmd_file'] = join(kwargs['run_dir'], 'run.sh')
# Linux kernl.
if 'linux_build_id' in kwargs:
kwargs['linux_build_dir'] = join(kwargs['out_dir'], 'linux', kwargs['linux_build_id'], kwargs['arch'])
kwargs['lkmc_vmlinux'] = join(kwargs['linux_build_dir'], "vmlinux")
if kwargs['arch'] == 'arm':
kwargs['linux_arch'] = 'arm'
kwargs['linux_image_prefix'] = join('arch', kwargs['linux_arch'], 'boot', 'zImage')
elif kwargs['arch'] == 'aarch64':
kwargs['linux_arch'] = 'arm64'
kwargs['linux_image_prefix'] = join('arch', kwargs['linux_arch'], 'boot', 'Image')
elif kwargs['arch'] == 'x86_64':
kwargs['linux_arch'] = 'x86'
kwargs['linux_image_prefix'] = join('arch', kwargs['linux_arch'], 'boot', 'bzImage')
kwargs['lkmc_linux_image'] = join(kwargs['linux_build_dir'], kwargs['linux_image_prefix'])
kwargs['buildroot_linux_image'] = join(kwargs['buildroot_linux_build_dir'], linux_image_prefix)
if kwargs['buildroot_linux']:
kwargs['vmlinux'] = kwargs['buildroot_vmlinux']
kwargs['linux_image'] = kwargs['buildroot_linux_image']
else:
kwargs['vmlinux'] = kwargs['lkmc_vmlinux']
kwargs['linux_image'] = kwargs['lkmc_linux_image']
# Kernel modules.
kwargs['kernel_modules_build_dir'] = join(kwargs['kernel_modules_build_base_dir'], kwargs['arch'])
kwargs['kernel_modules_build_subdir'] = join(kwargs['kernel_modules_build_dir'], kwargs['kernel_modules_subdir'])
kwargs['kernel_modules_build_host_dir'] = join(kwargs['kernel_modules_build_base_dir'], 'host')
kwargs['kernel_modules_build_host_subdir'] = join(kwargs['kernel_modules_build_host_dir'], kwargs['kernel_modules_subdir'])
kwargs['userland_build_dir'] = join(kwargs['out_dir'], 'userland', kwargs['userland_build_id'], kwargs['arch'])
kwargs['out_rootfs_overlay_dir'] = join(kwargs['out_dir'], 'rootfs_overlay', kwargs['arch'])
kwargs['out_rootfs_overlay_bin_dir'] = join(kwargs['out_rootfs_overlay_dir'], 'bin')
# Baremetal.
kwargs['baremetal_src_dir'] = join(kwargs['root_dir'], 'baremetal')
kwargs['baremetal_src_lib_dir'] = join(kwargs['baremetal_src_dir'], kwargs['baremetal_lib_basename'])
if kwargs['emulator'] == 'gem5':
kwargs['simulator_name'] = 'gem5'
else:
kwargs['simulator_name'] = 'qemu'
kwargs['baremetal_build_dir'] = join(kwargs['out_dir'], 'baremetal', kwargs['arch'], kwargs['simulator_name'], kwargs['machine'])
kwargs['baremetal_build_lib_dir'] = join(kwargs['baremetal_build_dir'], kwargs['baremetal_lib_basename'])
kwargs['baremetal_build_ext'] = '.elf'
# Docker
kwargs['docker_build_dir'] = join(kwargs['out_dir'], 'docker', kwargs['arch'])
kwargs['docker_tar_dir'] = join(kwargs['docker_build_dir'], 'export')
kwargs['docker_tar_file'] = join(kwargs['docker_build_dir'], 'export.tar')
kwargs['docker_rootfs_raw_file'] = join(kwargs['docker_build_dir'], 'export.ext2')
kwargs['docker_qcow2_file'] = join(kwargs['docker_rootfs_raw_file'] + '.qcow2')
if kwargs['docker']:
kwargs['rootfs_raw_file'] = kwargs['docker_rootfs_raw_file']
kwargs['qcow2_file'] = kwargs['docker_qcow2_file']
else:
kwargs['rootfs_raw_file'] = kwargs['buildroot_rootfs_raw_file']
kwargs['qcow2_file'] = kwargs['buildroot_qcow2_file']
# Image.
if kwargs['baremetal'] is None:
if kwargs['emulator'] == 'gem5':
kwargs['image'] = kwargs['vmlinux']
kwargs['disk_image'] = kwargs['rootfs_raw_file']
else:
kwargs['image'] = kwargs['linux_image']
kwargs['disk_image'] = kwargs['qcow2_file']
else:
kwargs['disk_image'] = kwargs['gem5_fake_iso']
if kwargs['baremetal'] == 'all':
path = kwargs['baremetal']
else:
path = kwargs.resolve_executable(
kwargs['baremetal'],
kwargs['baremetal_src_dir'],
kwargs['baremetal_build_dir'],
kwargs['baremetal_build_ext'],
)
source_path_noext = os.path.splitext(join(
kwargs['baremetal_src_dir'],
os.path.relpath(path, kwargs['baremetal_build_dir'])
))[0]
for ext in [c_ext, asm_ext]:
source_path = source_path_noext + ext
if os.path.exists(source_path):
kwargs['source_path'] = source_path
break
kwargs['image'] = path
return dict(kwargs)
def shlex_split(string): def shlex_split(string):
''' '''

2
run
View File

@@ -219,7 +219,7 @@ def main(args, extra_args=None):
cpt_dir = common.gem_list_checkpoint_dirs()[-args.gem5_restore] cpt_dir = common.gem_list_checkpoint_dirs()[-args.gem5_restore]
extra_emulator_args.extend(['--restore-from', os.path.join(common.m5out_dir, cpt_dir)]) extra_emulator_args.extend(['--restore-from', os.path.join(common.m5out_dir, cpt_dir)])
cmd.extend([ cmd.extend([
os.path.join(common.gem5_src_dir, 'configs', 'example', 'arm', 'fs_bigLITTLE.py'), common.Newline, os.path.join(common.gem5_source_dir, 'configs', 'example', 'arm', 'fs_bigLITTLE.py'), common.Newline,
'--big-cpus', '2', common.Newline, '--big-cpus', '2', common.Newline,
'--cpu-type', cpu_type, common.Newline, '--cpu-type', cpu_type, common.Newline,
'--disk', common.disk_image, common.Newline, '--disk', common.disk_image, common.Newline,