diff options
author | Andy Lutomirski <luto@amacapital.net> | 2014-09-09 17:53:58 -0700 |
---|---|---|
committer | Andy Lutomirski <luto@amacapital.net> | 2014-09-09 17:53:58 -0700 |
commit | 65d2ce31b08deda60956ac1aa7f31792a7644a51 (patch) | |
tree | 0318132b95e15c9710e33995e80d4ed1a709850c | |
parent | d8f25458246c89885781ef049fdc43946c8ee536 (diff) | |
download | virtme-65d2ce31b08deda60956ac1aa7f31792a7644a51.tar.gz |
virtme-configkernel: New command to automatically configure a kernel
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
-rw-r--r-- | prereqs.config | 31 | ||||
-rwxr-xr-x | setup.py | 1 | ||||
-rwxr-xr-x | virtme-configkernel | 13 | ||||
-rw-r--r-- | virtme/architectures.py | 44 | ||||
-rw-r--r-- | virtme/commands/configkernel.py | 134 |
5 files changed, 191 insertions, 32 deletions
diff --git a/prereqs.config b/prereqs.config deleted file mode 100644 index f3d542c..0000000 --- a/prereqs.config +++ /dev/null @@ -1,31 +0,0 @@ -# Kconfig helper rules to generate a working configuration. -# Use something like: -# make ARCH=arch KCONFIG_ALLCONFIG=prereqs.config defconfig - -# Generic -CONFIG_PCI=y -CONFIG_VIRTIO=y -CONFIG_VIRTIO_PCI=y -CONFIG_NET_9P=y -CONFIG_NET_9P_VIRTIO=y -CONFIG_9P_FS=y -CONFIG_VIRTIO_NET=y -CONFIG_CMDLINE_OVERRIDE=n -CONFIG_BINFMT_SCRIPT=y -CONFIG_TMPFS=y -CONFIG_MODULE_SIG_FORCE=n -CONFIG_DEVTMPFS=y - -# virtio-scsi support -CONFIG_SCSI_LOWLEVEL=y -CONFIG_SCSI=y -CONFIG_SCSI_VIRTIO=y -CONFIG_BLK_DEV_SD=y - -# virt-serial support -CONFIG_VIRTIO_CONSOLE=y - -# watchdog (useful for test scripts) -CONFIG_WATCHDOG=y -CONFIG_WATCHDOG_CORE=y -CONFIG_I6300ESB_WDT=y
\ No newline at end of file @@ -27,6 +27,7 @@ setup( entry_points = { 'console_scripts': [ 'virtme-run = virtme.commands.run:main', + 'virtme-configkernel = virtme.commands.configkernel:main', ] }, data_files = [ diff --git a/virtme-configkernel b/virtme-configkernel new file mode 100755 index 0000000..9e94b5b --- /dev/null +++ b/virtme-configkernel @@ -0,0 +1,13 @@ +#!/usr/bin/python3 +# -*- mode: python -*- +# virtme-configkernel: Configure a kernel for virtme +# Copyright © 2014 Andy Lutomirski +# Licensed under the GPLv2, which is available in the virtme distribution +# as a file called LICENSE with SHA-256 hash: +# 8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643 + +# This file is not installed; it's just used to run virtme from inside +# a source distribution. + +from virtme.commands import configkernel +exit(configkernel.main()) diff --git a/virtme/architectures.py b/virtme/architectures.py index 88aad6c..d06e412 100644 --- a/virtme/architectures.py +++ b/virtme/architectures.py @@ -9,6 +9,12 @@ import os class Arch(object): + def __init__(self, name): + self.qemuname = name + self.linuxname = name + + defconfig_target = 'defconfig' + @staticmethod def serial_dev_name(index): return 'ttyS%d' % index @@ -31,6 +37,10 @@ class Arch(object): def serial_console_args(): return [] + @staticmethod + def config_base(): + return [] + class Arch_unknown(Arch): @staticmethod def qemuargs(is_native): @@ -59,7 +69,32 @@ class Arch_x86(Arch): def serial_console_args(): return ['console=ttyS0'] + @staticmethod + def config_base(): + return ['CONFIG_SERIO=y', + 'CONFIG_PCI=y', + 'CONFIG_INPUT=y', + 'CONFIG_INPUT_KEYBOARD=y', + 'CONFIG_KEYBOARD_ATKBD=y', + 'CONFIG_SERIAL_8250=y', + 'CONFIG_SERIAL_8250_CONSOLE=y', + 'CONFIG_X86_VERBOSE_BOOTUP=y', + 'CONFIG_VGA_CONSOLE=y', + 'CONFIG_FB=y', + 'CONFIG_FB_VESA=y', + 'CONFIG_FRAMEBUFFER_CONSOLE=y', + 'CONFIG_RTC_CLASS=y', + 'CONFIG_RTC_HCTOSYS=y', + 'CONFIG_RTC_DRV_CMOS=y', + ] + class Arch_arm(Arch): + def __init__(self, name): + Arch.__init__(self, name) + + self.defconfig_target = 'versatile_defconfig' + + @staticmethod def qemuargs(is_native): ret = Arch.qemuargs(is_native) @@ -85,6 +120,13 @@ class Arch_arm(Arch): return ['console=ttyAMA0'] class Arch_aarch64(Arch): + def __init__(self, name): + Arch.__init__(self, name) + + self.qemuname = 'aarch64' + self.linuxname = 'arm64' + + @staticmethod def qemuargs(is_native): ret = Arch.qemuargs(is_native) @@ -117,4 +159,4 @@ ARCHES = { } def get(arch): - return ARCHES.get(arch, Arch_unknown) + return ARCHES.get(arch, Arch_unknown)(arch) diff --git a/virtme/commands/configkernel.py b/virtme/commands/configkernel.py new file mode 100644 index 0000000..d5af7b5 --- /dev/null +++ b/virtme/commands/configkernel.py @@ -0,0 +1,134 @@ +#!/usr/bin/python3 +# -*- mode: python -*- +# virtme-configkernel: Configure a kernel for virtme +# Copyright © 2014 Andy Lutomirski +# Licensed under the GPLv2, which is available in the virtme distribution +# as a file called LICENSE with SHA-256 hash: +# 8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643 + +import argparse +import tempfile +import os +import shutil +import subprocess +import multiprocessing +from .. import architectures + +uname = os.uname() + +def make_parser(): + parser = argparse.ArgumentParser( + description='Configure a kernel for virtme', + ) + + parser.add_argument('--arch', action='store', metavar='ARCHITECTURE', + default=uname.machine, + help='Target architecture') + + parser.add_argument('--allnoconfig', action='store_true', + help='Overwrite configuration with a virtme-suitable allnoconfig (unlikely to work)') + + parser.add_argument('--defconfig', action='store_true', + help='Overwrite configuration with a virtme-suitable defconfig') + + return parser + +_ARGPARSER = make_parser() + +def arg_fail(message): + print(message) + _ARGPARSER.print_usage() + sys.exit(1) + +_GENERIC_CONFIG = [ + '# Generic', + 'CONFIG_VIRTIO=y', + 'CONFIG_VIRTIO_PCI=y', + 'CONFIG_VIRTIO_MMIO=y', + 'CONFIG_NET=y', + 'CONFIG_NET_CORE=y', + 'CONFIG_NETDEVICES=y', + 'CONFIG_NETWORK_FILESYSTEMS=y', + 'CONFIG_INET=y', + 'CONFIG_NET_9P=y', + 'CONFIG_NET_9P_VIRTIO=y', + 'CONFIG_9P_FS=y', + 'CONFIG_VIRTIO_NET=y', + 'CONFIG_CMDLINE_OVERRIDE=n', + 'CONFIG_BINFMT_SCRIPT=y', + 'CONFIG_SHMEM=y', + 'CONFIG_TMPFS=y', + 'CONFIG_UNIX=y', + 'CONFIG_MODULE_SIG_FORCE=n', + 'CONFIG_DEVTMPFS=y', + 'CONFIG_TTY=y', + 'CONFIG_VT=y', + 'CONFIG_UNIX98_PTYS=y', + 'CONFIG_EARLY_PRINTK=y', + '', + '# virtio-scsi support', + 'CONFIG_BLOCK=y', + 'CONFIG_SCSI_LOWLEVEL=y', + 'CONFIG_SCSI=y', + 'CONFIG_SCSI_VIRTIO=y', + 'CONFIG_BLK_DEV_SD=y', + '', + '# virt-serial support', + 'CONFIG_VIRTIO_CONSOLE=y', + '', + '# watchdog (useful for test scripts)', + 'CONFIG_WATCHDOG=y', + 'CONFIG_WATCHDOG_CORE=y', + 'CONFIG_I6300ESB_WDT=y', +] + +def main(): + args = _ARGPARSER.parse_args() + + if not os.path.isfile('scripts/kconfig/merge_config.sh'): + print('virtme-configkernel must be run in a kernel source directory') + return 1 + + arch = architectures.get(args.arch) + + conf = (_GENERIC_CONFIG + + ['# Arch-specific options'] + + arch.config_base()) + + if args.arch == 'x86_64': + conf.append('CONFIG_64BIT=y') + elif args.arch == 'i386': + conf.append('CONFIG_64BIT=n') + + if shutil.which('%s-linux-gnu-gcc' % arch.qemuname): + conf.append('CONFIG_CROSS_COMPILE="%s-linux-gnu-"' % arch.qemuname) + + if args.allnoconfig and args.defconfig: + arg_fail('allnoconfig and defconfig are incompatible') + + if args.allnoconfig: + maketarget = 'allnoconfig' + updatetarget = 'silentoldconfig' + elif args.defconfig: + maketarget = arch.defconfig_target + updatetarget = 'olddefconfig' + else: + arg_fail('One of --allnoconfig and --defconfig must be specified') + + # TODO: Get rid of most of the noise and check the result. + + # Set up an initial config + subprocess.check_call(['make', 'ARCH=%s' % arch.linuxname, maketarget]) + + with open('.config', 'ab') as conffile: + conffile.write('\n'.join(conf).encode('utf-8')) + + subprocess.check_call(['make', 'ARCH=%s' % arch.linuxname, updatetarget]) + + print("Configured. Build with 'make ARCH=%s -j%d'" % + (arch.linuxname, multiprocessing.cpu_count())) + + return 0 + +if __name__ == '__main__': + exit(main()) |