mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-13 20:12:26 +00:00
The update is required to include 3c3ca64b5f0dd9eef7b1ce1c65cc6e8e9147dd38 otherwise baremetal does not on VExpress. baremetal: create a baremetal setup with crosstool-ng buildroot: improve directory location: move out/dl inside out/buildroot/download, and add a new out/buildroot/build level tagline: generalize, deliver more value than howto, since now howtos are starting to multiply rename all top scripts to separate words with hyphen more consistently, e.g. run-gdb instead of rungdb getvar: list all variables gem5: make m5out section to focus all releated information at Prevent m5term Text file busy when rebuilding gem5 while it is running.
97 lines
3.9 KiB
Python
Executable File
97 lines
3.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import glob
|
|
import multiprocessing
|
|
import os
|
|
import pathlib
|
|
import shutil
|
|
import subprocess
|
|
import time
|
|
|
|
import common
|
|
|
|
parser = common.get_argparse()
|
|
common.add_build_arguments(parser)
|
|
parser.add_argument(
|
|
'extra_scons_args',
|
|
default=[],
|
|
metavar='extra-scons-args',
|
|
nargs='*'
|
|
)
|
|
args = common.setup(parser)
|
|
binaries_dir = os.path.join(common.gem5_system_dir, 'binaries')
|
|
disks_dir = os.path.join(common.gem5_system_dir, 'disks')
|
|
if args.clean:
|
|
common.rmrf(common.gem5_build_dir)
|
|
else:
|
|
start_time = time.time()
|
|
os.makedirs(binaries_dir, exist_ok=True)
|
|
os.makedirs(disks_dir, exist_ok=True)
|
|
if not os.path.exists(os.path.join(common.gem5_src_dir, '.git')):
|
|
if common.gem5_src_dir == common.gem5_default_src_dir:
|
|
raise Exception('gem5 submodule not checked out')
|
|
subprocess.check_call([
|
|
'git',
|
|
'-C', common.gem5_default_src_dir,
|
|
'worktree', 'add',
|
|
'-b', os.path.join('wt', args.gem5_build_id),
|
|
common.gem5_src_dir
|
|
])
|
|
if args.arch == 'x86_64':
|
|
dummy_img_path = os.path.join(disks_dir, 'linux-bigswap2.img')
|
|
with open(dummy_img_path, 'wb') as dummy_img_file:
|
|
zeroes = b'\x00' * (2 ** 16)
|
|
for i in range(2 ** 10):
|
|
dummy_img_file.write(zeroes)
|
|
subprocess.check_call(['mkswap', dummy_img_path])
|
|
with open(os.path.join(binaries_dir, 'x86_64-vmlinux-2.6.22.9'), 'w'):
|
|
# This file must always be present, despite --kernel overriding that default and selecting the kernel.
|
|
# I'm not even joking. No one has ever built x86 gem5 without the magic dist dir present.
|
|
pass
|
|
elif args.arch == 'arm' or args.arch == 'aarch64':
|
|
gem5_system_src_dir = os.path.join(common.gem5_src_dir, 'system')
|
|
|
|
# dtb
|
|
dt_src_dir = os.path.join(gem5_system_src_dir, 'arm', 'dt')
|
|
dt_build_dir = os.path.join(common.gem5_system_dir, 'arm', 'dt')
|
|
subprocess.check_call(['make', '-C', dt_src_dir])
|
|
os.makedirs(dt_build_dir, exist_ok=True)
|
|
for dt in glob.glob(os.path.join(dt_src_dir, '*.dtb')):
|
|
shutil.copy2(dt, dt_build_dir)
|
|
|
|
# Bootloader 32.
|
|
bootloader32_dir = os.path.join(gem5_system_src_dir, 'arm', 'simple_bootloader')
|
|
# TODO use the buildroot cross compiler here, and remove the dependencies from configure.
|
|
subprocess.check_call(['make', '-C', bootloader32_dir])
|
|
# bootloader
|
|
shutil.copy2(os.path.join(bootloader32_dir, 'boot_emm.arm'), binaries_dir)
|
|
|
|
# Bootloader 64.
|
|
bootloader64_dir = os.path.join(gem5_system_src_dir, 'arm', 'aarch64_bootloader')
|
|
# TODO cross_compile is ignored because the make does not use CC...
|
|
subprocess.check_call(['make', '-C', bootloader64_dir])
|
|
shutil.copy2(os.path.join(bootloader64_dir, 'boot_emm.arm64'), binaries_dir)
|
|
assert common.run_cmd(
|
|
[
|
|
'scons',
|
|
# TODO factor with build.
|
|
'-j', str(multiprocessing.cpu_count()),
|
|
'--ignore-style',
|
|
common.gem5_executable
|
|
] +
|
|
args.extra_scons_args,
|
|
cwd=common.gem5_src_dir,
|
|
extra_env={'PATH': common.ccache_dir + ':' + os.environ['PATH']},
|
|
) == 0
|
|
term_src_dir = os.path.join(common.gem5_src_dir, 'util/term')
|
|
m5term_build = os.path.join(term_src_dir, 'm5term')
|
|
subprocess.check_call(['make', '-C', term_src_dir])
|
|
if os.path.exists(common.gem5_m5term):
|
|
# Otherwise shutil.copy2 would fail with "Text file busy" if you
|
|
# tried to rebuild while running m5term:
|
|
# https://stackoverflow.com/questions/16764946/what-generates-the-text-file-busy-message-in-unix/52427512#52427512
|
|
os.unlink(common.gem5_m5term)
|
|
shutil.copy2(m5term_build, common.gem5_m5term)
|
|
end_time = time.time()
|
|
common.print_time(end_time - start_time)
|