mirror of
https://github.com/cirosantilli/linux-kernel-module-cheat.git
synced 2026-01-29 04:54:27 +01:00
Fix import_path circular dependency by splitting it out.
Use import thread_pool instead from, from is evil. Fix poweroff.out path for ./trace-boot.
This commit is contained in:
@@ -14198,11 +14198,12 @@ You should also test that the Internet works:
|
|||||||
./run --arch x86_64 --kernel-cli '- lkmc_eval="ifup -a;wget -S google.com;poweroff;"'
|
./run --arch x86_64 --kernel-cli '- lkmc_eval="ifup -a;wget -S google.com;poweroff;"'
|
||||||
....
|
....
|
||||||
|
|
||||||
===== test-build-userland
|
===== CLI script tests
|
||||||
|
|
||||||
`build-userland` has a wide variety of target selection modes, and it was hard to keep them all working without a test.
|
`build-userland` and `test-user-mode` have a wide variety of target selection modes, and it was hard to keep them all working without some tests:
|
||||||
|
|
||||||
So we've created the simple: link:test-build-userland[] to ensure that at least none of the build modes blows up.
|
* link:test-build-userland[]
|
||||||
|
* link:test-test-user-mode[]
|
||||||
|
|
||||||
=== Bisection
|
=== Bisection
|
||||||
|
|
||||||
|
|||||||
4
build
4
build
@@ -10,6 +10,8 @@ import copy
|
|||||||
import shell_helpers
|
import shell_helpers
|
||||||
from shell_helpers import LF
|
from shell_helpers import LF
|
||||||
|
|
||||||
|
import lkmc
|
||||||
|
|
||||||
class _Component:
|
class _Component:
|
||||||
'''
|
'''
|
||||||
Yes, we are re-inventing a crappy dependency resolution system,
|
Yes, we are re-inventing a crappy dependency resolution system,
|
||||||
@@ -403,7 +405,7 @@ Which components to build. Default: qemu-buildroot
|
|||||||
args = self.get_common_args()
|
args = self.get_common_args()
|
||||||
args.update(extra_args)
|
args.update(extra_args)
|
||||||
args['show_time'] = False
|
args['show_time'] = False
|
||||||
common.import_path_main(component_file)(**args)
|
lkmc.import_path.import_path_main(component_file)(**args)
|
||||||
return f
|
return f
|
||||||
|
|
||||||
def timed_main(self):
|
def timed_main(self):
|
||||||
|
|||||||
@@ -161,7 +161,7 @@ usually extra Buildroot targets.
|
|||||||
] +
|
] +
|
||||||
extra_make_args
|
extra_make_args
|
||||||
,
|
,
|
||||||
out_file=os.path.join(self.env['buildroot_build_dir'], 'lkmc.log'),
|
out_file=os.path.join(self.env['buildroot_build_dir'], self.env['repo_short_id'] + '.log'),
|
||||||
delete_env=['LD_LIBRARY_PATH'],
|
delete_env=['LD_LIBRARY_PATH'],
|
||||||
cwd=self.env['buildroot_source_dir'],
|
cwd=self.env['buildroot_source_dir'],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ Build crosstool-NG with Newlib for bare metal compilation
|
|||||||
'build', LF,
|
'build', LF,
|
||||||
'CT_JOBS={}'.format(str(self.env['nproc'])), LF,
|
'CT_JOBS={}'.format(str(self.env['nproc'])), LF,
|
||||||
],
|
],
|
||||||
out_file=os.path.join(build_dir, 'lkmc.log'),
|
out_file=os.path.join(build_dir, self.env['repo_short_id'] + '.log'),
|
||||||
delete_env=['LD_LIBRARY_PATH'],
|
delete_env=['LD_LIBRARY_PATH'],
|
||||||
extra_paths=[self.env['ccache_dir']],
|
extra_paths=[self.env['ccache_dir']],
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ Run `make modules_install` after `make`.
|
|||||||
extra_env={
|
extra_env={
|
||||||
'KBUILD_BUILD_VERSION': '1',
|
'KBUILD_BUILD_VERSION': '1',
|
||||||
'KBUILD_BUILD_TIMESTAMP': 'Thu Jan 1 00:00:00 UTC 1970',
|
'KBUILD_BUILD_TIMESTAMP': 'Thu Jan 1 00:00:00 UTC 1970',
|
||||||
'KBUILD_BUILD_USER': 'lkmc',
|
'KBUILD_BUILD_USER': self.env['repo_short_id'],
|
||||||
'KBUILD_BUILD_HOST': common.git_sha(self.env['linux_source_dir']),
|
'KBUILD_BUILD_HOST': common.git_sha(self.env['linux_source_dir']),
|
||||||
},
|
},
|
||||||
**common_args
|
**common_args
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import threading
|
|||||||
|
|
||||||
from shell_helpers import LF
|
from shell_helpers import LF
|
||||||
import common
|
import common
|
||||||
from thread_pool import ThreadPool
|
import thread_pool
|
||||||
|
|
||||||
class Main(common.BuildCliFunction):
|
class Main(common.BuildCliFunction):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@@ -79,10 +79,10 @@ Default: build all examples that have their package dependencies met, e.g.:
|
|||||||
extra_deps=[self.env['common_h']],
|
extra_deps=[self.env['common_h']],
|
||||||
link=False,
|
link=False,
|
||||||
)
|
)
|
||||||
with ThreadPool(
|
with thread_pool.ThreadPool(
|
||||||
self._build_one,
|
self._build_one,
|
||||||
nthreads=self.env['nproc'],
|
nthreads=self.env['nproc'],
|
||||||
) as thread_pool:
|
) as my_thread_pool:
|
||||||
try:
|
try:
|
||||||
for target in self.env['targets']:
|
for target in self.env['targets']:
|
||||||
for path, in_dirnames, in_filenames in self.sh.walk(target):
|
for path, in_dirnames, in_filenames in self.sh.walk(target):
|
||||||
@@ -91,7 +91,7 @@ Default: build all examples that have their package dependencies met, e.g.:
|
|||||||
if not in_ext in self.env['build_in_exts']:
|
if not in_ext in self.env['build_in_exts']:
|
||||||
continue
|
continue
|
||||||
in_path = os.path.join(path, in_filename)
|
in_path = os.path.join(path, in_filename)
|
||||||
error = thread_pool.submit({
|
error = my_thread_pool.submit({
|
||||||
'in_path': in_path,
|
'in_path': in_path,
|
||||||
'out_path': self.resolve_userland_executable(in_path),
|
'out_path': self.resolve_userland_executable(in_path),
|
||||||
'cc_flags': cc_flags,
|
'cc_flags': cc_flags,
|
||||||
@@ -102,7 +102,7 @@ Default: build all examples that have their package dependencies met, e.g.:
|
|||||||
raise common.ExitLoop()
|
raise common.ExitLoop()
|
||||||
except common.ExitLoop:
|
except common.ExitLoop:
|
||||||
pass
|
pass
|
||||||
error = thread_pool.get_error()
|
error = my_thread_pool.get_error()
|
||||||
if error is not None:
|
if error is not None:
|
||||||
print(error)
|
print(error)
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
|
|
||||||
import common
|
import lkmc.import_path
|
||||||
|
|
||||||
build_userland = common.import_path_relative_root('build-userland')
|
build_userland = lkmc.import_path.import_path_relative_root('build-userland')
|
||||||
|
|
||||||
class Main(build_userland.Main):
|
class Main(build_userland.Main):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import collections
|
|||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import common
|
import lkmc.import_path
|
||||||
|
|
||||||
class _Argument:
|
class _Argument:
|
||||||
def __init__(
|
def __init__(
|
||||||
@@ -192,7 +192,7 @@ class CliFunction:
|
|||||||
if config_file is not None:
|
if config_file is not None:
|
||||||
if os.path.exists(config_file):
|
if os.path.exists(config_file):
|
||||||
config_configs = {}
|
config_configs = {}
|
||||||
config = common.import_path(config_file)
|
config = lkmc.import_path.import_path(config_file)
|
||||||
if self.extra_config_params is None:
|
if self.extra_config_params is None:
|
||||||
config.set_args(config_configs)
|
config.set_args(config_configs)
|
||||||
else:
|
else:
|
||||||
|
|||||||
49
common.py
49
common.py
@@ -8,7 +8,6 @@ import datetime
|
|||||||
import enum
|
import enum
|
||||||
import functools
|
import functools
|
||||||
import glob
|
import glob
|
||||||
import importlib
|
|
||||||
import inspect
|
import inspect
|
||||||
import itertools
|
import itertools
|
||||||
import json
|
import json
|
||||||
@@ -64,7 +63,7 @@ consts['userland_subdir'] = 'userland'
|
|||||||
consts['userland_source_dir'] = os.path.join(consts['root_dir'], consts['userland_subdir'])
|
consts['userland_source_dir'] = os.path.join(consts['root_dir'], consts['userland_subdir'])
|
||||||
consts['userland_source_arch_dir'] = os.path.join(consts['userland_source_dir'], 'arch')
|
consts['userland_source_arch_dir'] = os.path.join(consts['userland_source_dir'], 'arch')
|
||||||
consts['userland_executable_ext'] = '.out'
|
consts['userland_executable_ext'] = '.out'
|
||||||
consts['include_subdir'] = 'lkmc'
|
consts['include_subdir'] = consts['repo_short_id']
|
||||||
consts['include_source_dir'] = os.path.join(consts['root_dir'], consts['include_subdir'])
|
consts['include_source_dir'] = os.path.join(consts['root_dir'], consts['include_subdir'])
|
||||||
consts['submodules_dir'] = os.path.join(consts['root_dir'], 'submodules')
|
consts['submodules_dir'] = os.path.join(consts['root_dir'], 'submodules')
|
||||||
consts['buildroot_source_dir'] = os.path.join(consts['submodules_dir'], 'buildroot')
|
consts['buildroot_source_dir'] = os.path.join(consts['submodules_dir'], 'buildroot')
|
||||||
@@ -135,32 +134,7 @@ for key in consts['emulator_short_to_long_dict']:
|
|||||||
consts['emulator_choices'].add(key)
|
consts['emulator_choices'].add(key)
|
||||||
consts['emulator_choices'].add(consts['emulator_short_to_long_dict'][key])
|
consts['emulator_choices'].add(consts['emulator_short_to_long_dict'][key])
|
||||||
consts['host_arch'] = platform.processor()
|
consts['host_arch'] = platform.processor()
|
||||||
|
consts['guest_lkmc_home'] = os.sep + consts['repo_short_id']
|
||||||
def import_path(path):
|
|
||||||
'''
|
|
||||||
https://stackoverflow.com/questions/2601047/import-a-python-module-without-the-py-extension
|
|
||||||
https://stackoverflow.com/questions/31773310/what-does-the-first-argument-of-the-imp-load-source-method-do
|
|
||||||
'''
|
|
||||||
module_name = os.path.basename(path).replace('-', '_')
|
|
||||||
spec = importlib.util.spec_from_loader(
|
|
||||||
module_name,
|
|
||||||
importlib.machinery.SourceFileLoader(module_name, path)
|
|
||||||
)
|
|
||||||
module = importlib.util.module_from_spec(spec)
|
|
||||||
spec.loader.exec_module(module)
|
|
||||||
sys.modules[module_name] = module
|
|
||||||
return module
|
|
||||||
|
|
||||||
def import_path_relative_root(basename):
|
|
||||||
return import_path(os.path.join(consts['root_dir'], basename))
|
|
||||||
|
|
||||||
def import_path_main(basename):
|
|
||||||
'''
|
|
||||||
Import an object of the Main class of a given file.
|
|
||||||
|
|
||||||
By convention, we call the main object of all our CLI scripts as Main.
|
|
||||||
'''
|
|
||||||
return import_path_relative_root(basename).Main()
|
|
||||||
|
|
||||||
class ExitLoop(Exception):
|
class ExitLoop(Exception):
|
||||||
pass
|
pass
|
||||||
@@ -452,8 +426,8 @@ Use the docker download Ubuntu root filesystem instead of the default Buildroot
|
|||||||
)
|
)
|
||||||
self.add_argument(
|
self.add_argument(
|
||||||
'--qemu-which',
|
'--qemu-which',
|
||||||
choices=['lkmc', 'host'],
|
choices=[consts['repo_short_id'], 'host'],
|
||||||
default='lkmc',
|
default=consts['repo_short_id'],
|
||||||
help='''\
|
help='''\
|
||||||
Which qemu binaries to use: qemu-system-, qemu-, qemu-img, etc.:
|
Which qemu binaries to use: qemu-system-, qemu-, qemu-img, etc.:
|
||||||
- lkmc: the ones we built with ./build-qemu
|
- lkmc: the ones we built with ./build-qemu
|
||||||
@@ -850,7 +824,11 @@ Incompatible archs are skipped.
|
|||||||
if env['emulator']== 'gem5':
|
if env['emulator']== 'gem5':
|
||||||
env['userland_quit_cmd'] = './gem5_exit.sh'
|
env['userland_quit_cmd'] = './gem5_exit.sh'
|
||||||
else:
|
else:
|
||||||
env['userland_quit_cmd'] = './poweroff.out'
|
env['userland_quit_cmd'] = join(
|
||||||
|
env['guest_lkmc_home'],
|
||||||
|
'linux',
|
||||||
|
'poweroff' + env['userland_executable_ext']
|
||||||
|
)
|
||||||
env['ramfs'] = env['initrd'] or env['initramfs']
|
env['ramfs'] = env['initrd'] or env['initramfs']
|
||||||
if env['ramfs']:
|
if env['ramfs']:
|
||||||
env['initarg'] = 'rdinit'
|
env['initarg'] = 'rdinit'
|
||||||
@@ -874,9 +852,8 @@ Incompatible archs are skipped.
|
|||||||
|
|
||||||
# Overlay.
|
# Overlay.
|
||||||
env['out_rootfs_overlay_dir'] = join(env['out_dir'], 'rootfs_overlay', env['arch'])
|
env['out_rootfs_overlay_dir'] = join(env['out_dir'], 'rootfs_overlay', env['arch'])
|
||||||
env['out_rootfs_overlay_lkmc_dir'] = join(env['out_rootfs_overlay_dir'], 'lkmc')
|
env['out_rootfs_overlay_lkmc_dir'] = join(env['out_rootfs_overlay_dir'], env['repo_short_id'])
|
||||||
env['out_rootfs_overlay_bin_dir'] = join(env['out_rootfs_overlay_lkmc_dir'], 'bin')
|
env['out_rootfs_overlay_bin_dir'] = join(env['out_rootfs_overlay_lkmc_dir'], 'bin')
|
||||||
env['guest_lkmc_home'] = os.sep + 'lkmc'
|
|
||||||
|
|
||||||
# Baremetal.
|
# Baremetal.
|
||||||
env['baremetal_source_dir'] = join(env['root_dir'], 'baremetal')
|
env['baremetal_source_dir'] = join(env['root_dir'], 'baremetal')
|
||||||
@@ -893,7 +870,7 @@ Incompatible archs are skipped.
|
|||||||
env['baremetal_build_ext'] = '.elf'
|
env['baremetal_build_ext'] = '.elf'
|
||||||
|
|
||||||
# Userland / baremetal common source.
|
# Userland / baremetal common source.
|
||||||
env['common_basename_noext'] = 'lkmc'
|
env['common_basename_noext'] = env['repo_short_id']
|
||||||
env['common_c'] = common_c = os.path.join(
|
env['common_c'] = common_c = os.path.join(
|
||||||
env['root_dir'],
|
env['root_dir'],
|
||||||
env['common_basename_noext'] + env['c_ext']
|
env['common_basename_noext'] + env['c_ext']
|
||||||
@@ -1165,8 +1142,6 @@ lunch aosp_{}-eng
|
|||||||
if arch in env['arch_short_to_long_dict']:
|
if arch in env['arch_short_to_long_dict']:
|
||||||
arch = env['arch_short_to_long_dict'][arch]
|
arch = env['arch_short_to_long_dict'][arch]
|
||||||
if emulator == 'native':
|
if emulator == 'native':
|
||||||
if env['userland'] is None:
|
|
||||||
raise Exception('Emulator only supported in user mode: {}'.format(emulator))
|
|
||||||
if arch != env['host_arch']:
|
if arch != env['host_arch']:
|
||||||
continue
|
continue
|
||||||
if self.is_arch_supported(arch):
|
if self.is_arch_supported(arch):
|
||||||
@@ -1286,6 +1261,8 @@ lunch aosp_{}-eng
|
|||||||
If it is out of tree, return the same exact path as input.
|
If it is out of tree, return the same exact path as input.
|
||||||
|
|
||||||
If the input path is a file, add the executable extension automatically.
|
If the input path is a file, add the executable extension automatically.
|
||||||
|
|
||||||
|
Directories map to the directories that would contain executable in that directory.
|
||||||
'''
|
'''
|
||||||
if not self.env['dry_run'] and not os.path.exists(in_path):
|
if not self.env['dry_run'] and not os.path.exists(in_path):
|
||||||
raise Exception('Input path does not exist: ' + in_path)
|
raise Exception('Input path does not exist: ' + in_path)
|
||||||
|
|||||||
0
lkmc/__init__.py
Normal file
0
lkmc/__init__.py
Normal file
33
lkmc/import_path.py
Normal file
33
lkmc/import_path.py
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import importlib
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
|
def import_path(path):
|
||||||
|
'''
|
||||||
|
https://stackoverflow.com/questions/2601047/import-a-python-module-without-the-py-extension
|
||||||
|
https://stackoverflow.com/questions/31773310/what-does-the-first-argument-of-the-imp-load-source-method-do
|
||||||
|
'''
|
||||||
|
module_name = os.path.basename(path).replace('-', '_')
|
||||||
|
spec = importlib.util.spec_from_loader(
|
||||||
|
module_name,
|
||||||
|
importlib.machinery.SourceFileLoader(module_name, path)
|
||||||
|
)
|
||||||
|
module = importlib.util.module_from_spec(spec)
|
||||||
|
spec.loader.exec_module(module)
|
||||||
|
sys.modules[module_name] = module
|
||||||
|
return module
|
||||||
|
|
||||||
|
def import_path_relative_root(basename):
|
||||||
|
return import_path(os.path.join(root_dir, basename))
|
||||||
|
|
||||||
|
def import_path_main(basename):
|
||||||
|
'''
|
||||||
|
Import an object of the Main class of a given file.
|
||||||
|
|
||||||
|
By convention, we call the main object of all our CLI scripts as Main.
|
||||||
|
'''
|
||||||
|
return import_path_relative_root(basename).Main()
|
||||||
2
run
2
run
@@ -309,6 +309,8 @@ Extra options to append at the end of the emulator command line.
|
|||||||
)
|
)
|
||||||
|
|
||||||
def timed_main(self):
|
def timed_main(self):
|
||||||
|
if self.env['emulator'] == 'native' and self.env['userland'] is None:
|
||||||
|
raise Exception('native emulator only supported in user mode')
|
||||||
show_stdout = self.env['show_stdout']
|
show_stdout = self.env['show_stdout']
|
||||||
# Common qemu / gem5 logic.
|
# Common qemu / gem5 logic.
|
||||||
# nokaslr:
|
# nokaslr:
|
||||||
|
|||||||
3
run-gdb
3
run-gdb
@@ -6,6 +6,7 @@ import subprocess
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
import common
|
import common
|
||||||
|
import lkmc.import_path
|
||||||
from shell_helpers import LF
|
from shell_helpers import LF
|
||||||
|
|
||||||
class GdbTestcase:
|
class GdbTestcase:
|
||||||
@@ -33,7 +34,7 @@ class GdbTestcase:
|
|||||||
self.child.setecho(False)
|
self.child.setecho(False)
|
||||||
self.child.waitnoecho()
|
self.child.waitnoecho()
|
||||||
self.child.expect(self.prompt)
|
self.child.expect(self.prompt)
|
||||||
test = common.import_path(test_script_path)
|
test = lkmc.import_path.import_path(test_script_path)
|
||||||
exception = None
|
exception = None
|
||||||
try:
|
try:
|
||||||
test.test(self)
|
test.test(self)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import common
|
import common
|
||||||
|
import lkmc.import_path
|
||||||
|
|
||||||
class Main(common.LkmcCliFunction):
|
class Main(common.LkmcCliFunction):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -35,7 +36,7 @@ More information at: https://github.com/cirosantilli/linux-kernel-module-cheat#g
|
|||||||
# Also, lx-symbols overrides the add-symbol-file commands.
|
# Also, lx-symbols overrides the add-symbol-file commands.
|
||||||
args['no_lxsymbols'] = True
|
args['no_lxsymbols'] = True
|
||||||
args['break_at'] = self.env['break_at']
|
args['break_at'] = self.env['break_at']
|
||||||
rungdb = common.import_path_main('run-gdb')
|
rungdb = lkmc.import_path.import_path_main('run-gdb')
|
||||||
return rungdb(**args)
|
return rungdb(**args)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
14
test
14
test
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import common
|
import common
|
||||||
import shell_helpers
|
import lkmc.import_path
|
||||||
from shell_helpers import LF
|
from shell_helpers import LF
|
||||||
|
|
||||||
class Main(common.TestCliFunction):
|
class Main(common.TestCliFunction):
|
||||||
@@ -28,15 +28,15 @@ Size of the tests to run. Scale:
|
|||||||
run_args = self.get_common_args()
|
run_args = self.get_common_args()
|
||||||
test_boot_args = run_args.copy()
|
test_boot_args = run_args.copy()
|
||||||
test_boot_args['size'] = self.env['size']
|
test_boot_args['size'] = self.env['size']
|
||||||
self.run_test(common.import_path_main('test-boot'), test_boot_args, 'test-boot')
|
self.run_test(lkmc.import_path.import_path_main('test-boot'), test_boot_args, 'test-boot')
|
||||||
self.run_test(common.import_path_main('test-userland-full-system'), run_args, 'test-userland')
|
self.run_test(lkmc.import_path.import_path_main('test-userland-full-system'), run_args, 'test-userland')
|
||||||
self.run_test(common.import_path_main('test-baremetal'), run_args, 'test-baremetal')
|
self.run_test(lkmc.import_path.import_path_main('test-baremetal'), run_args, 'test-baremetal')
|
||||||
self.run_test(common.import_path_main('test-user-mode'), run_args, 'test-user-mode')
|
self.run_test(lkmc.import_path.import_path_main('test-user-mode'), run_args, 'test-user-mode')
|
||||||
self.run_test(common.import_path_main('test-gdb'), run_args, 'test-gdb')
|
self.run_test(lkmc.import_path.import_path_main('test-gdb'), run_args, 'test-gdb')
|
||||||
if self.env['emulator'] == 'gem5':
|
if self.env['emulator'] == 'gem5':
|
||||||
gem5_unit_test_args = run_args.copy()
|
gem5_unit_test_args = run_args.copy()
|
||||||
gem5_unit_test_args['unit_tests'] = True
|
gem5_unit_test_args['unit_tests'] = True
|
||||||
self.run_test(common.import_path_main('build-gem5'), gem5_unit_test_args, 'gem5-unit-tests')
|
self.run_test(lkmc.import_path.import_path_main('build-gem5'), gem5_unit_test_args, 'gem5-unit-tests')
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
Main().cli()
|
Main().cli()
|
||||||
|
|||||||
@@ -4,8 +4,9 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
import common
|
import common
|
||||||
|
import lkmc.import_path
|
||||||
import path_properties
|
import path_properties
|
||||||
from thread_pool import ThreadPool
|
import thread_pool
|
||||||
|
|
||||||
class Main(common.TestCliFunction):
|
class Main(common.TestCliFunction):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -29,11 +30,11 @@ If given, run only the given tests. Otherwise, run all tests.
|
|||||||
def timed_main(self):
|
def timed_main(self):
|
||||||
run_args = self.get_common_args()
|
run_args = self.get_common_args()
|
||||||
rootdir_abs_len = len(self.env['root_dir'])
|
rootdir_abs_len = len(self.env['root_dir'])
|
||||||
with ThreadPool(
|
with thread_pool.ThreadPool(
|
||||||
self.run_test,
|
self.run_test,
|
||||||
nthreads=self.env['nproc'],
|
nthreads=self.env['nproc'],
|
||||||
thread_id_arg='thread_id',
|
thread_id_arg='thread_id',
|
||||||
) as thread_pool:
|
) as my_thread_pool:
|
||||||
try:
|
try:
|
||||||
for test in self.env['tests']:
|
for test in self.env['tests']:
|
||||||
for path, in_dirnames, in_filenames in self.sh.walk(test):
|
for path, in_dirnames, in_filenames in self.sh.walk(test):
|
||||||
@@ -52,17 +53,17 @@ If given, run only the given tests. Otherwise, run all tests.
|
|||||||
test_args = {
|
test_args = {
|
||||||
'expected_exit_status': my_path_properties['exit_status'],
|
'expected_exit_status': my_path_properties['exit_status'],
|
||||||
'run_args': cur_run_args,
|
'run_args': cur_run_args,
|
||||||
'run_obj': common.import_path_main('run'),
|
'run_obj': lkmc.import_path.import_path_main('run'),
|
||||||
'test_id': path_relative_root,
|
'test_id': path_relative_root,
|
||||||
}
|
}
|
||||||
error = thread_pool.submit(test_args)
|
error = my_thread_pool.submit(test_args)
|
||||||
if error is not None:
|
if error is not None:
|
||||||
if self.env['quit_on_fail']:
|
if self.env['quit_on_fail']:
|
||||||
raise common.ExitLoop()
|
raise common.ExitLoop()
|
||||||
|
|
||||||
except common.ExitLoop:
|
except common.ExitLoop:
|
||||||
pass
|
pass
|
||||||
error = thread_pool.get_error()
|
error = my_thread_pool.get_error()
|
||||||
if error is not None:
|
if error is not None:
|
||||||
print(error)
|
print(error)
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import common
|
import common
|
||||||
|
import lkmc.import_path
|
||||||
import shell_helpers
|
import shell_helpers
|
||||||
from shell_helpers import LF
|
from shell_helpers import LF
|
||||||
|
|
||||||
@@ -45,7 +46,7 @@ See ./test --help for --size.
|
|||||||
#)
|
#)
|
||||||
#
|
#
|
||||||
#rm -f "${self.env['test_boot_benchmark_file']}"
|
#rm -f "${self.env['test_boot_benchmark_file']}"
|
||||||
self.run = common.import_path_main('run')
|
self.run = lkmc.import_path.import_path_main('run')
|
||||||
self.common_args = self.get_common_args()
|
self.common_args = self.get_common_args()
|
||||||
self.common_args['ctrl_c_host'] = True
|
self.common_args['ctrl_c_host'] = True
|
||||||
self.common_args['quit_after_boot'] = True
|
self.common_args['quit_after_boot'] = True
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Quick sanity check that userland target resolution works.
|
# https://github.com/cirosantilli/linux-kernel-module-cheat#cli-script-tests
|
||||||
|
|
||||||
set -eux
|
set -eux
|
||||||
|
|
||||||
@@ -44,13 +44,12 @@ for in_tree in '' --in-tree; do
|
|||||||
! ./build-userland $in_tree "${userland_build_dir}/c/hello.out"
|
! ./build-userland $in_tree "${userland_build_dir}/c/hello.out"
|
||||||
tmpfile="$(mktemp)"
|
tmpfile="$(mktemp)"
|
||||||
! ./build-userland $in_tree "$tmpfile"
|
! ./build-userland $in_tree "$tmpfile"
|
||||||
|
! ./build-userland --clean $in_tree "$tmpfile"
|
||||||
rm "$tmpfile"
|
rm "$tmpfile"
|
||||||
! ./build-userland $in_tree ..
|
! ./build-userland $in_tree ..
|
||||||
! ./build-userland $in_tree kernel_modules
|
! ./build-userland $in_tree kernel_modules
|
||||||
|
! ./build-userland --clean $in_tree userland/does_not_exist
|
||||||
./build-userland --clean $in_tree
|
./build-userland --clean $in_tree
|
||||||
|
|
||||||
# Clean is however more forgiving and accepts paths that don't exist.
|
|
||||||
./build-userland --clean $in_tree userland/does_not_exist
|
|
||||||
done
|
done
|
||||||
|
|
||||||
./build-userland-in-tree
|
./build-userland-in-tree
|
||||||
|
|||||||
5
test-gdb
5
test-gdb
@@ -4,6 +4,7 @@ import threading
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import common
|
import common
|
||||||
|
import lkmc.import_path
|
||||||
|
|
||||||
class Main(common.TestCliFunction):
|
class Main(common.TestCliFunction):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -22,8 +23,8 @@ found by searching for the Python test files.
|
|||||||
)
|
)
|
||||||
|
|
||||||
def timed_main(self):
|
def timed_main(self):
|
||||||
run = common.import_path_main('run')
|
run = lkmc.import_path.import_path_main('run')
|
||||||
run_gdb = common.import_path_main('run-gdb')
|
run_gdb = lkmc.import_path.import_path_main('run-gdb')
|
||||||
if self.env['arch'] in self.env['crosstool_ng_supported_archs']:
|
if self.env['arch'] in self.env['crosstool_ng_supported_archs']:
|
||||||
test_sources = []
|
test_sources = []
|
||||||
if self.env['tests'] == []:
|
if self.env['tests'] == []:
|
||||||
|
|||||||
39
test-test-user-mode
Executable file
39
test-test-user-mode
Executable file
@@ -0,0 +1,39 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# https://github.com/cirosantilli/linux-kernel-module-cheat#cli-script-tests
|
||||||
|
|
||||||
|
set -eux
|
||||||
|
|
||||||
|
./build-userland
|
||||||
|
./build-userland-in-tree
|
||||||
|
|
||||||
|
f="$(tempfile)"
|
||||||
|
|
||||||
|
./test-user-mode | tee "$f"
|
||||||
|
grep -E '^PASS .* userland/c/hello' "$f"
|
||||||
|
grep -E '^PASS .* userland/posix/uname' "$f"
|
||||||
|
|
||||||
|
./test-user-mode userland | tee "$f"
|
||||||
|
grep -E '^PASS .* userland/c/hello' "$f"
|
||||||
|
grep -E '^PASS .* userland/posix/uname' "$f"
|
||||||
|
|
||||||
|
./test-user-mode userland/c | tee "$f"
|
||||||
|
grep -E '^PASS .* userland/c/hello' "$f"
|
||||||
|
! grep -E '^PASS .* userland/posix/uname' "$f"
|
||||||
|
|
||||||
|
./test-user-mode userland/c/hello.c | tee "$f"
|
||||||
|
grep -E '^PASS .* userland/c/hello' "$f"
|
||||||
|
! grep -E '^PASS .* userland/c/false' "$f"
|
||||||
|
! grep -E '^PASS .* userland/posix/uname' "$f"
|
||||||
|
|
||||||
|
./test-user-mode-in-tree | tee "$f"
|
||||||
|
grep -E '^PASS .* userland/c/hello' "$f"
|
||||||
|
grep -E '^PASS .* userland/posix/uname' "$f"
|
||||||
|
|
||||||
|
cd userland
|
||||||
|
./test
|
||||||
|
grep -E '^PASS .* userland/c/hello' "$f"
|
||||||
|
grep -E '^PASS .* userland/posix/uname' "$f"
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
rm "$f"
|
||||||
@@ -4,8 +4,9 @@ import os
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
import common
|
import common
|
||||||
|
import lkmc.import_path
|
||||||
import path_properties
|
import path_properties
|
||||||
from thread_pool import ThreadPool
|
import thread_pool
|
||||||
|
|
||||||
class Main(common.TestCliFunction):
|
class Main(common.TestCliFunction):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@@ -16,8 +17,6 @@ TODO: expose all userland relevant ./run args here as well somehow.
|
|||||||
'''
|
'''
|
||||||
if not 'defaults' in kwargs:
|
if not 'defaults' in kwargs:
|
||||||
kwargs['defaults'] = {}
|
kwargs['defaults'] = {}
|
||||||
if not 'userland' in kwargs['defaults']:
|
|
||||||
kwargs['defaults']['userland'] = ''
|
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
self.add_argument(
|
self.add_argument(
|
||||||
'tests',
|
'tests',
|
||||||
@@ -39,11 +38,11 @@ If given, run only the given tests. Otherwise, run all tests.
|
|||||||
run_args['userland_build_id'] = 'static'
|
run_args['userland_build_id'] = 'static'
|
||||||
had_failure = False
|
had_failure = False
|
||||||
rootdir_abs_len = len(self.env['root_dir'])
|
rootdir_abs_len = len(self.env['root_dir'])
|
||||||
with ThreadPool(
|
with thread_pool.ThreadPool(
|
||||||
self.run_test,
|
self.run_test,
|
||||||
nthreads=self.env['nproc'],
|
nthreads=self.env['nproc'],
|
||||||
thread_id_arg='thread_id',
|
thread_id_arg='thread_id',
|
||||||
) as thread_pool:
|
) as my_thread_pool:
|
||||||
try:
|
try:
|
||||||
for test in self.env['tests']:
|
for test in self.env['tests']:
|
||||||
for path, in_dirnames, in_filenames in self.sh.walk(test):
|
for path, in_dirnames, in_filenames in self.sh.walk(test):
|
||||||
@@ -62,18 +61,18 @@ If given, run only the given tests. Otherwise, run all tests.
|
|||||||
run_test_args = {
|
run_test_args = {
|
||||||
'expected_exit_status': my_path_properties['exit_status'],
|
'expected_exit_status': my_path_properties['exit_status'],
|
||||||
'run_args': cur_run_args,
|
'run_args': cur_run_args,
|
||||||
'run_obj': common.import_path_main('run'),
|
'run_obj': lkmc.import_path.import_path_main('run'),
|
||||||
'test_id': path_relative_root,
|
'test_id': path_relative_root,
|
||||||
}
|
}
|
||||||
if my_path_properties['receives_signal']:
|
if my_path_properties['receives_signal']:
|
||||||
run_test_args['expected_exit_status'] = 128 - my_path_properties['exit_status']
|
run_test_args['expected_exit_status'] = 128 - my_path_properties['exit_status']
|
||||||
error = thread_pool.submit(run_test_args)
|
error = my_thread_pool.submit(run_test_args)
|
||||||
if error is not None:
|
if error is not None:
|
||||||
if self.env['quit_on_fail']:
|
if self.env['quit_on_fail']:
|
||||||
raise common.ExitLoop()
|
raise common.ExitLoop()
|
||||||
except common.ExitLoop:
|
except common.ExitLoop:
|
||||||
pass
|
pass
|
||||||
error = thread_pool.get_error()
|
error = my_thread_pool.get_error()
|
||||||
if error is not None:
|
if error is not None:
|
||||||
print(error)
|
print(error)
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import common
|
import lkmc.import_path
|
||||||
|
|
||||||
test_user_mode = common.import_path_relative_root('test-user-mode')
|
test_user_mode = lkmc.import_path.import_path_relative_root('test-user-mode')
|
||||||
|
|
||||||
class Main(test_user_mode.Main):
|
class Main(test_user_mode.Main):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
|
|
||||||
import common
|
import common
|
||||||
|
import lkmc.import_path
|
||||||
|
|
||||||
class Main(common.TestCliFunction):
|
class Main(common.TestCliFunction):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -13,7 +13,7 @@ https://github.com/cirosantilli/linux-kernel-module-cheat#test-userland-in-full-
|
|||||||
'''
|
'''
|
||||||
)
|
)
|
||||||
def timed_main(self):
|
def timed_main(self):
|
||||||
run = common.import_path_main('run')
|
run = lkmc.import_path.import_path_main('run')
|
||||||
run_args = self.get_common_args()
|
run_args = self.get_common_args()
|
||||||
run_args['eval_after'] = './test_all.sh;{};'.format(self.env['userland_quit_cmd'])
|
run_args['eval_after'] = './test_all.sh;{};'.format(self.env['userland_quit_cmd'])
|
||||||
self.run_test(run, run_args)
|
self.run_test(run, run_args)
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import common
|
|
||||||
from shell_helpers import LF
|
from shell_helpers import LF
|
||||||
|
import common
|
||||||
|
import lkmc.import_path
|
||||||
|
|
||||||
class Main(common.LkmcCliFunction):
|
class Main(common.LkmcCliFunction):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -14,7 +15,7 @@ More information at: https://github.com/cirosantilli/linux-kernel-module-cheat#t
|
|||||||
|
|
||||||
def timed_main(self):
|
def timed_main(self):
|
||||||
args = self.get_common_args()
|
args = self.get_common_args()
|
||||||
run = common.import_path_main('run')
|
run = lkmc.import_path.import_path_main('run')
|
||||||
if self.env['emulator'] == 'gem5':
|
if self.env['emulator'] == 'gem5':
|
||||||
args['trace'] = 'Exec,-ExecSymbol,-ExecMicro'
|
args['trace'] = 'Exec,-ExecSymbol,-ExecMicro'
|
||||||
run(**args)
|
run(**args)
|
||||||
@@ -23,7 +24,7 @@ More information at: https://github.com/cirosantilli/linux-kernel-module-cheat#t
|
|||||||
run_args['trace'] = 'exec_tb'
|
run_args['trace'] = 'exec_tb'
|
||||||
run_args['quit_after_boot'] = True
|
run_args['quit_after_boot'] = True
|
||||||
run(**run_args)
|
run(**run_args)
|
||||||
qemu_trace2txt = common.import_path_main('qemu-trace2txt')
|
qemu_trace2txt = lkmc.import_path.import_path_main('qemu-trace2txt')
|
||||||
qemu_trace2txt(**args)
|
qemu_trace2txt(**args)
|
||||||
# Instruction count.
|
# Instruction count.
|
||||||
# We could put this on a separate script, but it just adds more arch boilerplate to a new script.
|
# We could put this on a separate script, but it just adds more arch boilerplate to a new script.
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ now...
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
import common
|
import common
|
||||||
|
import lkmc.import_path
|
||||||
from shell_helpers import LF
|
from shell_helpers import LF
|
||||||
|
|
||||||
class Main(common.LkmcCliFunction):
|
class Main(common.LkmcCliFunction):
|
||||||
|
|||||||
@@ -7,10 +7,7 @@
|
|||||||
|
|
||||||
ENTRY
|
ENTRY
|
||||||
.bss
|
.bss
|
||||||
output: .skip 16
|
output: .skip 16
|
||||||
|
|
||||||
#define t
|
|
||||||
|
|
||||||
.data
|
.data
|
||||||
addps_input0: .float 1.5, 2.5, 3.5, 4.5
|
addps_input0: .float 1.5, 2.5, 3.5, 4.5
|
||||||
addps_input1: .float 5.5, 6.5, 7.5, 8.5
|
addps_input1: .float 5.5, 6.5, 7.5, 8.5
|
||||||
|
|||||||
Reference in New Issue
Block a user