aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@amacapital.net>2014-09-09 17:53:58 -0700
committerAndy Lutomirski <luto@amacapital.net>2014-09-09 17:53:58 -0700
commit65d2ce31b08deda60956ac1aa7f31792a7644a51 (patch)
tree0318132b95e15c9710e33995e80d4ed1a709850c
parentd8f25458246c89885781ef049fdc43946c8ee536 (diff)
downloadvirtme-65d2ce31b08deda60956ac1aa7f31792a7644a51.tar.gz
virtme-configkernel: New command to automatically configure a kernel
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
-rw-r--r--prereqs.config31
-rwxr-xr-xsetup.py1
-rwxr-xr-xvirtme-configkernel13
-rw-r--r--virtme/architectures.py44
-rw-r--r--virtme/commands/configkernel.py134
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
diff --git a/setup.py b/setup.py
index f8efa19..3cca6a5 100755
--- a/setup.py
+++ b/setup.py
@@ -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())