aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/uml
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/uml')
-rw-r--r--target/linux/uml/Makefile42
-rw-r--r--target/linux/uml/README45
-rw-r--r--target/linux/uml/config/i386178
-rw-r--r--target/linux/uml/config/x86_64156
-rw-r--r--target/linux/uml/image/Makefile19
-rw-r--r--target/linux/uml/patches-4.1/001-um-Stop-abusing-__KERNEL__.patch94
-rw-r--r--target/linux/uml/patches-4.1/002-um-Remove-copy-paste-code-from-init.h.patch44
-rw-r--r--target/linux/uml/patches-4.1/101-mconsole-exec.patch211
-rw-r--r--target/linux/uml/patches-4.1/102-pseudo-random-mac.patch124
9 files changed, 913 insertions, 0 deletions
diff --git a/target/linux/uml/Makefile b/target/linux/uml/Makefile
new file mode 100644
index 0000000..715cdc7
--- /dev/null
+++ b/target/linux/uml/Makefile
@@ -0,0 +1,42 @@
+#
+# Copyright (C) 2006-2011 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/host.mk
+
+# UML only makes sense on linux
+ifeq ($(HOST_OS),Linux)
+
+ARCH:=$(shell uname -m | sed \
+ -e 's/i[3-9]86/i386/' \
+ -e 's/mipsel/mips/' \
+ -e 's/mipseb/mips/' \
+ -e 's/powerpc/ppc/' \
+ -e 's/sh[234]/sh/' \
+ -e 's/armeb/arm/' \
+)
+BOARD:=uml
+BOARDNAME:=User Mode Linux
+FEATURES:=ext4 audio
+MAINTAINER:=Florian Fainelli <florian@openwrt.org>
+
+KERNEL_PATCHVER:=4.1
+
+include $(INCLUDE_DIR)/target.mk
+
+define Kernel/Patch
+ mkdir -p $(LINUX_DIR)/arch/um/include/uapi
+ mv $(LINUX_DIR)/arch/um/include/asm $(LINUX_DIR)/arch/um/include/uapi/
+ $(Kernel/Patch/Default)
+endef
+
+LINUX_TARGET_CONFIG:=$(CURDIR)/config/$(ARCH)
+
+DEFAULT_PACKAGES += wpad-mini kmod-mac80211-hwsim
+
+endif
+
+$(eval $(call BuildTarget))
diff --git a/target/linux/uml/README b/target/linux/uml/README
new file mode 100644
index 0000000..85684ae
--- /dev/null
+++ b/target/linux/uml/README
@@ -0,0 +1,45 @@
+Openwrt inside a user mode linux. Why would we even want this many ask?
+
+There are potentially a lot of reasons, one obvious one to me, it allows
+folks to 'kick the tires' without actually flashing up any hardware. It's
+also a great environment for porting over packages, you can get a package
+fully functional in the uclibc root environment inside a uml without actually
+disturbing your 'real router', and then rebuild for a specific target once
+it's fully tested.
+
+This is a first stab at a build that 'just works' and there will be more
+cleanup to come. The simple directions are:-
+
+Configure for uml target
+Configure with an ext4 root file system
+build it all
+
+In your bin directory you will find a kernel and an ext4 root file system
+when it's finished. Just run it like this:-
+
+bin/uml/openwrt-uml-vmlinux ubd0=bin/uml/openwrt-uml-ext4.img
+
+The uml will start, and eventually the serial console of the uml will be at your
+console prompt. If you would like it in xterms, substitute con=xterm and con0=xterm.
+No networking is configured, but, it's a starting point. The resulting file system
+has just enough free space to start kicking the tires and playing in the world of
+'embedded routers' along with all the resource restrictions that come with that
+world.
+
+To configure networking and more, refer to the user mode linux documentation online.
+A quick start goes along this line. install the uml-utilities packages so you have
+the uml switch in and running, then add a command param to your uml start like this
+
+eth0=daemon,00:01:01:01:01:01,unix,/<your uml switch control socket here>
+
+With that in, and uml networking actually functional (can be a challenge at times),
+you should be able to ifconfig the interface and talk to the host side, or, if you
+bridged the uml switch to your host network, you should be able to run udhcp and be
+away with networking off to the world. Again, if you are unfamiliar with uml and
+uml networking, please read the docs and how-to stuff available on the net. It does
+take some fiddling to get it started and working right the first time, but after that,
+it opens up a whole new world of virtual machines.
+
+
+
+http://user-mode-linux.sourceforge.net/
diff --git a/target/linux/uml/config/i386 b/target/linux/uml/config/i386
new file mode 100644
index 0000000..9521706
--- /dev/null
+++ b/target/linux/uml/config/i386
@@ -0,0 +1,178 @@
+# CONFIG_3_LEVEL_PGTABLES is not set
+# CONFIG_64BIT is not set
+CONFIG_ARCH_DEFCONFIG="arch/um/configs/i386_defconfig"
+# CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
+CONFIG_ARCH_HAS_SC_SIGNALS=y
+# CONFIG_ARCH_HAS_SG_CHAIN is not set
+CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y
+CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
+CONFIG_BLK_DEV_COW_COMMON=y
+CONFIG_BLK_DEV_UBD=y
+CONFIG_BLK_DEV_UBD_SYNC=y
+CONFIG_CLONE_BACKWARDS=y
+CONFIG_CON_CHAN="xterm"
+CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_CYRIX_32=y
+CONFIG_CPU_SUP_INTEL=y
+CONFIG_CPU_SUP_TRANSMETA_32=y
+CONFIG_CPU_SUP_UMC_32=y
+CONFIG_CRAMFS=y
+# CONFIG_CRASHLOG is not set
+CONFIG_CRC16=y
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG2=y
+CONFIG_CRYPTO_WORKQUEUE=y
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+CONFIG_DNOTIFY=y
+# CONFIG_EARLY_PRINTK is not set
+# CONFIG_EMBEDDED is not set
+CONFIG_EXT4_FS=y
+CONFIG_FS_MBCACHE=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+CONFIG_GENERIC_CPU_DEVICES=y
+CONFIG_GENERIC_FIND_FIRST_BIT=y
+CONFIG_GENERIC_IO=y
+CONFIG_GENERIC_IRQ_SHOW=y
+# CONFIG_HAVE_64BIT_ALIGNED_ACCESS is not set
+CONFIG_HAVE_AOUT=y
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+# CONFIG_HAVE_ARCH_BITREVERSE is not set
+# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
+CONFIG_HAVE_FUTEX_CMPXCHG=y
+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+CONFIG_HAVE_NET_DSA=y
+CONFIG_HAVE_UID16=y
+CONFIG_HOSTAUDIO=m
+CONFIG_HOSTFS=y
+# CONFIG_HPPFS is not set
+CONFIG_HZ_PERIODIC=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_INIT_ENV_ARG_LIMIT=128
+CONFIG_IOSCHED_CFQ=y
+CONFIG_IRQ_WORK=y
+CONFIG_ISO9660_FS=y
+CONFIG_JBD2=y
+CONFIG_KALLSYMS=y
+CONFIG_KERNEL_STACK_ORDER=2
+CONFIG_LD_SCRIPT_STATIC=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_M486 is not set
+# CONFIG_M586 is not set
+# CONFIG_M586MMX is not set
+# CONFIG_M586TSC is not set
+# CONFIG_M686 is not set
+CONFIG_MAGIC_SYSRQ=y
+# CONFIG_MATOM is not set
+CONFIG_MCONSOLE=y
+# CONFIG_MCORE2 is not set
+# CONFIG_MCRUSOE is not set
+# CONFIG_MCYRIXIII is not set
+# CONFIG_MEFFICEON is not set
+# CONFIG_MELAN is not set
+# CONFIG_MGEODEGX1 is not set
+# CONFIG_MGEODE_LX is not set
+# CONFIG_MK6 is not set
+# CONFIG_MK7 is not set
+# CONFIG_MK8 is not set
+# CONFIG_MMAPPER is not set
+CONFIG_MODULES_USE_ELF_REL=y
+# CONFIG_MPENTIUM4 is not set
+CONFIG_MPENTIUMII=y
+# CONFIG_MPENTIUMIII is not set
+# CONFIG_MPENTIUMM is not set
+# CONFIG_MVIAC3_2 is not set
+# CONFIG_MVIAC7 is not set
+# CONFIG_MWINCHIP3D is not set
+# CONFIG_MWINCHIPC6 is not set
+CONFIG_NAMESPACES=y
+CONFIG_NEED_PER_CPU_KM=y
+# CONFIG_NET_NS is not set
+CONFIG_NLS=y
+# CONFIG_NOCONFIG_CHAN is not set
+CONFIG_NO_DMA=y
+CONFIG_NO_IOMEM=y
+# CONFIG_NSC_GPIO is not set
+CONFIG_NULL_CHAN=y
+CONFIG_OLD_SIGACTION=y
+CONFIG_OLD_SIGSUSPEND3=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_PGTABLE_LEVELS=2
+CONFIG_PORT_CHAN=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+CONFIG_PRINT_QUOTA_WARNING=y
+# CONFIG_PROCESSOR_SELECT is not set
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_PTY_CHAN=y
+CONFIG_QFMT_V1=y
+CONFIG_QFMT_V2=y
+CONFIG_QUOTA=y
+CONFIG_QUOTACTL=y
+# CONFIG_QUOTA_NETLINK_INTERFACE is not set
+CONFIG_QUOTA_TREE=y
+# CONFIG_RCU_STALL_COMMON is not set
+CONFIG_RD_BZIP2=y
+CONFIG_RD_GZIP=y
+CONFIG_RELAY=y
+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
+# CONFIG_SBC8360_WDT is not set
+# CONFIG_SCSI_DMA is not set
+CONFIG_SOFT_WATCHDOG=m
+CONFIG_SOUND=m
+CONFIG_SOUND_OSS_CORE=y
+CONFIG_SOUND_OSS_CORE_PRECLAIM=y
+CONFIG_SQUASHFS_EMBEDDED=y
+CONFIG_SRCU=y
+CONFIG_SSL=y
+CONFIG_SSL_CHAN="pty"
+CONFIG_STACKTRACE=y
+CONFIG_STATIC_LINK=y
+CONFIG_STDERR_CONSOLE=y
+CONFIG_TICK_CPU_ACCOUNTING=y
+# CONFIG_TRACE_IRQFLAGS_SUPPORT is not set
+CONFIG_TTY_CHAN=y
+CONFIG_UID16=y
+CONFIG_UML=y
+CONFIG_UML_NET=y
+CONFIG_UML_NET_DAEMON=y
+CONFIG_UML_NET_ETHERTAP=y
+CONFIG_UML_NET_MCAST=y
+# CONFIG_UML_NET_PCAP is not set
+# CONFIG_UML_NET_RANDOM_MAC is not set
+CONFIG_UML_NET_SLIP=y
+CONFIG_UML_NET_SLIRP=y
+CONFIG_UML_NET_TUNTAP=y
+# CONFIG_UML_NET_VDE is not set
+CONFIG_UML_RANDOM=y
+CONFIG_UML_SOUND=m
+CONFIG_UML_WATCHDOG=m
+CONFIG_UML_X86=y
+# CONFIG_USER_NS is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_WATCHDOG_CORE=y
+CONFIG_X86_32=y
+# CONFIG_X86_64 is not set
+CONFIG_X86_CMOV=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_GENERIC=y
+CONFIG_X86_INTEL_USERCOPY=y
+CONFIG_X86_INTERNODE_CACHE_SHIFT=6
+CONFIG_X86_L1_CACHE_SHIFT=6
+CONFIG_X86_MINIMUM_CPU_FAMILY=5
+CONFIG_X86_TSC=y
+CONFIG_X86_USE_PPRO_CHECKSUM=y
+CONFIG_XTERM_CHAN=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZONE_DMA_FLAG=0
diff --git a/target/linux/uml/config/x86_64 b/target/linux/uml/config/x86_64
new file mode 100644
index 0000000..be25a2e
--- /dev/null
+++ b/target/linux/uml/config/x86_64
@@ -0,0 +1,156 @@
+CONFIG_3_LEVEL_PGTABLES=y
+CONFIG_64BIT=y
+CONFIG_ARCH_DEFCONFIG="arch/um/configs/x86_64_defconfig"
+# CONFIG_ARCH_HAS_GCOV_PROFILE_ALL is not set
+# CONFIG_ARCH_HAS_SC_SIGNALS is not set
+# CONFIG_ARCH_HAS_SG_CHAIN is not set
+# CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA is not set
+CONFIG_BINFMT_MISC=m
+CONFIG_BLK_DEV_COW_COMMON=y
+CONFIG_BLK_DEV_UBD=y
+CONFIG_BLK_DEV_UBD_SYNC=y
+CONFIG_CON_CHAN="xterm"
+CONFIG_CON_ZERO_CHAN="fd:0,fd:1"
+CONFIG_CPU_SUP_AMD=y
+CONFIG_CPU_SUP_CENTAUR=y
+CONFIG_CPU_SUP_INTEL=y
+CONFIG_CRAMFS=y
+# CONFIG_CRASHLOG is not set
+CONFIG_CRC16=y
+# CONFIG_CRYPTO_AES_X86_64 is not set
+CONFIG_CRYPTO_CRC32C=y
+CONFIG_CRYPTO_HASH=y
+CONFIG_CRYPTO_HASH2=y
+CONFIG_CRYPTO_RNG2=y
+# CONFIG_CRYPTO_SALSA20_X86_64 is not set
+CONFIG_CRYPTO_SHA1=y
+# CONFIG_CRYPTO_SKEIN is not set
+# CONFIG_CRYPTO_TWOFISH_X86_64 is not set
+CONFIG_CRYPTO_WORKQUEUE=y
+CONFIG_DEBUG_BUGVERBOSE=y
+CONFIG_DEBUG_MEMORY_INIT=y
+CONFIG_DECOMPRESS_BZIP2=y
+CONFIG_DECOMPRESS_GZIP=y
+CONFIG_DEFAULT_CFQ=y
+# CONFIG_DEFAULT_DEADLINE is not set
+CONFIG_DEFAULT_IOSCHED="cfq"
+CONFIG_DNOTIFY=y
+# CONFIG_EARLY_PRINTK is not set
+CONFIG_EXT4_FS=y
+CONFIG_FS_MBCACHE=y
+CONFIG_GENERIC_BUG=y
+CONFIG_GENERIC_CLOCKEVENTS=y
+# CONFIG_GENERIC_CPU is not set
+CONFIG_GENERIC_CPU_DEVICES=y
+CONFIG_GENERIC_FIND_FIRST_BIT=y
+CONFIG_GENERIC_IO=y
+CONFIG_GENERIC_IRQ_SHOW=y
+CONFIG_HAVE_64BIT_ALIGNED_ACCESS=y
+CONFIG_HAVE_ARCH_AUDITSYSCALL=y
+# CONFIG_HAVE_ARCH_BITREVERSE is not set
+# CONFIG_HAVE_BOOTMEM_INFO_NODE is not set
+CONFIG_HAVE_FUTEX_CMPXCHG=y
+# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
+CONFIG_HAVE_NET_DSA=y
+CONFIG_HAVE_UID16=y
+CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
+CONFIG_HOSTAUDIO=m
+CONFIG_HOSTFS=y
+# CONFIG_HPPFS is not set
+CONFIG_HZ_PERIODIC=y
+CONFIG_INITRAMFS_SOURCE=""
+CONFIG_INIT_ENV_ARG_LIMIT=128
+CONFIG_IOSCHED_CFQ=y
+CONFIG_IRQ_WORK=y
+CONFIG_ISO9660_FS=y
+CONFIG_JBD2=y
+CONFIG_KALLSYMS=y
+CONFIG_KERNEL_STACK_ORDER=2
+CONFIG_LD_SCRIPT_STATIC=y
+CONFIG_LEGACY_PTYS=y
+CONFIG_LEGACY_PTY_COUNT=256
+# CONFIG_MATOM is not set
+CONFIG_MCONSOLE=y
+# CONFIG_MCORE2 is not set
+CONFIG_MK8=y
+# CONFIG_MMAPPER is not set
+CONFIG_MODULES_USE_ELF_RELA=y
+# CONFIG_MPSC is not set
+CONFIG_NAMESPACES=y
+CONFIG_NEED_PER_CPU_KM=y
+# CONFIG_NET_NS is not set
+CONFIG_NLS=y
+# CONFIG_NOCONFIG_CHAN is not set
+CONFIG_NO_DMA=y
+CONFIG_NO_IOMEM=y
+CONFIG_NULL_CHAN=y
+CONFIG_PAGEFLAGS_EXTENDED=y
+CONFIG_PGTABLE_LEVELS=3
+CONFIG_PHYS_ADDR_T_64BIT=y
+CONFIG_PORT_CHAN=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_POSIX_MQUEUE_SYSCTL=y
+# CONFIG_PRINT_QUOTA_WARNING is not set
+# CONFIG_PROCESSOR_SELECT is not set
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_PTY_CHAN=y
+CONFIG_QFMT_V1=y
+CONFIG_QFMT_V2=y
+CONFIG_QUOTA=y
+CONFIG_QUOTACTL=y
+# CONFIG_QUOTA_NETLINK_INTERFACE is not set
+CONFIG_QUOTA_TREE=y
+# CONFIG_RCU_STALL_COMMON is not set
+CONFIG_RD_BZIP2=y
+CONFIG_RD_GZIP=y
+CONFIG_RELAY=y
+# CONFIG_RWSEM_GENERIC_SPINLOCK is not set
+CONFIG_RWSEM_XCHGADD_ALGORITHM=y
+# CONFIG_SCSI_DMA is not set
+CONFIG_SOFT_WATCHDOG=m
+CONFIG_SOUND=m
+CONFIG_SOUND_OSS_CORE=y
+CONFIG_SOUND_OSS_CORE_PRECLAIM=y
+CONFIG_SQUASHFS_EMBEDDED=y
+CONFIG_SRCU=y
+CONFIG_SSL=y
+CONFIG_SSL_CHAN="pty"
+CONFIG_STACKTRACE=y
+CONFIG_STATIC_LINK=y
+CONFIG_STDERR_CONSOLE=y
+CONFIG_TICK_CPU_ACCOUNTING=y
+# CONFIG_TRACE_IRQFLAGS_SUPPORT is not set
+CONFIG_TTY_CHAN=y
+CONFIG_UID16=y
+CONFIG_UML=y
+CONFIG_UML_NET=y
+CONFIG_UML_NET_DAEMON=y
+CONFIG_UML_NET_ETHERTAP=y
+CONFIG_UML_NET_MCAST=y
+# CONFIG_UML_NET_PCAP is not set
+# CONFIG_UML_NET_RANDOM_MAC is not set
+CONFIG_UML_NET_SLIP=y
+CONFIG_UML_NET_SLIRP=y
+CONFIG_UML_NET_TUNTAP=y
+# CONFIG_UML_NET_VDE is not set
+CONFIG_UML_RANDOM=y
+CONFIG_UML_SOUND=m
+CONFIG_UML_WATCHDOG=m
+CONFIG_UML_X86=y
+# CONFIG_UNISYSSPAR is not set
+# CONFIG_USER_NS is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_WATCHDOG_CORE=y
+# CONFIG_X86_32 is not set
+CONFIG_X86_64=y
+CONFIG_X86_CMOV=y
+CONFIG_X86_CMPXCHG64=y
+CONFIG_X86_INTEL_USERCOPY=y
+CONFIG_X86_INTERNODE_CACHE_SHIFT=6
+CONFIG_X86_L1_CACHE_SHIFT=6
+CONFIG_X86_MINIMUM_CPU_FAMILY=64
+CONFIG_X86_TSC=y
+CONFIG_X86_USE_PPRO_CHECKSUM=y
+CONFIG_XTERM_CHAN=y
+CONFIG_ZLIB_INFLATE=y
+CONFIG_ZONE_DMA_FLAG=0
diff --git a/target/linux/uml/image/Makefile b/target/linux/uml/image/Makefile
new file mode 100644
index 0000000..5e7247e
--- /dev/null
+++ b/target/linux/uml/image/Makefile
@@ -0,0 +1,19 @@
+#
+# Copyright (C) 2006-2010 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+include $(TOPDIR)/rules.mk
+include $(INCLUDE_DIR)/image.mk
+
+define Image/Prepare
+ cp $(LINUX_DIR)/linux $(KDIR)/vmlinux.elf
+endef
+
+define Image/Build
+ cp $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-$(1).img
+ cp $(KDIR)/vmlinux.elf $(BIN_DIR)/$(IMG_PREFIX)-vmlinux
+endef
+
+$(eval $(call BuildImage))
diff --git a/target/linux/uml/patches-4.1/001-um-Stop-abusing-__KERNEL__.patch b/target/linux/uml/patches-4.1/001-um-Stop-abusing-__KERNEL__.patch
new file mode 100644
index 0000000..a46a5be
--- /dev/null
+++ b/target/linux/uml/patches-4.1/001-um-Stop-abusing-__KERNEL__.patch
@@ -0,0 +1,94 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 31 May 2015 19:50:57 +0200
+Subject: [PATCH] um: Stop abusing __KERNEL__
+
+Currently UML is abusing __KERNEL__ to distinguish between
+kernel and host code (os-Linux). It is better to use a custom
+define such that existing users of __KERNEL__ don't get confused.
+
+Signed-off-by: Richard Weinberger <richard@nod.at>
+---
+
+--- a/arch/um/drivers/mconsole.h
++++ b/arch/um/drivers/mconsole.h
+@@ -7,7 +7,7 @@
+ #ifndef __MCONSOLE_H__
+ #define __MCONSOLE_H__
+
+-#ifndef __KERNEL__
++#ifdef __UM_HOST__
+ #include <stdint.h>
+ #define u32 uint32_t
+ #endif
+--- a/arch/um/include/shared/init.h
++++ b/arch/um/include/shared/init.h
+@@ -40,7 +40,7 @@
+ typedef int (*initcall_t)(void);
+ typedef void (*exitcall_t)(void);
+
+-#ifndef __KERNEL__
++#ifdef __UM_HOST__
+ #ifndef __section
+ # define __section(S) __attribute__ ((__section__(#S)))
+ #endif
+@@ -131,7 +131,7 @@ extern struct uml_param __uml_setup_star
+ #define __uml_postsetup_call __used __section(.uml.postsetup.init)
+ #define __uml_exit_call __used __section(.uml.exitcall.exit)
+
+-#ifndef __KERNEL__
++#ifdef __UM_HOST__
+
+ #define __define_initcall(level,fn) \
+ static initcall_t __initcall_##fn __used \
+--- a/arch/um/include/shared/user.h
++++ b/arch/um/include/shared/user.h
+@@ -17,7 +17,7 @@
+ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+
+ /* This is to get size_t */
+-#ifdef __KERNEL__
++#ifndef __UM_HOST__
+ #include <linux/types.h>
+ #else
+ #include <stddef.h>
+--- a/arch/um/Makefile
++++ b/arch/um/Makefile
+@@ -68,9 +68,10 @@ KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -
+
+ KBUILD_AFLAGS += $(ARCH_INCLUDE)
+
+-USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -D__KERNEL__,,\
+- $(patsubst -I%,,$(KBUILD_CFLAGS)))) $(ARCH_INCLUDE) $(MODE_INCLUDE) \
+- $(filter -I%,$(CFLAGS)) -D_FILE_OFFSET_BITS=64 -idirafter include
++USER_CFLAGS = $(patsubst $(KERNEL_DEFINES),,$(patsubst -I%,,$(KBUILD_CFLAGS))) \
++ $(ARCH_INCLUDE) $(MODE_INCLUDE) $(filter -I%,$(CFLAGS)) \
++ -D_FILE_OFFSET_BITS=64 -idirafter include \
++ -D__KERNEL__ -D__UM_HOST__
+
+ #This will adjust *FLAGS accordingly to the platform.
+ include $(ARCH_DIR)/Makefile-os-$(OS)
+--- a/arch/x86/um/shared/sysdep/tls.h
++++ b/arch/x86/um/shared/sysdep/tls.h
+@@ -1,7 +1,7 @@
+ #ifndef _SYSDEP_TLS_H
+ #define _SYSDEP_TLS_H
+
+-# ifndef __KERNEL__
++#ifdef __UM_HOST__
+
+ /* Change name to avoid conflicts with the original one from <asm/ldt.h>, which
+ * may be named user_desc (but in 2.4 and in header matching its API was named
+@@ -22,11 +22,11 @@ typedef struct um_dup_user_desc {
+ #endif
+ } user_desc_t;
+
+-# else /* __KERNEL__ */
++#else /* __UM_HOST__ */
+
+ typedef struct user_desc user_desc_t;
+
+-# endif /* __KERNEL__ */
++#endif /* __UM_HOST__ */
+
+ extern int os_set_thread_area(user_desc_t *info, int pid);
+ extern int os_get_thread_area(user_desc_t *info, int pid);
diff --git a/target/linux/uml/patches-4.1/002-um-Remove-copy-paste-code-from-init.h.patch b/target/linux/uml/patches-4.1/002-um-Remove-copy-paste-code-from-init.h.patch
new file mode 100644
index 0000000..6733384
--- /dev/null
+++ b/target/linux/uml/patches-4.1/002-um-Remove-copy-paste-code-from-init.h.patch
@@ -0,0 +1,44 @@
+From: Richard Weinberger <richard@nod.at>
+Date: Sun, 31 May 2015 22:15:58 +0200
+Subject: [PATCH] um: Remove copy&paste code from init.h
+
+As we got rid of the __KERNEL__ abuse, we can directly
+include linux/compiler.h now.
+This also allows gcc 5 to build UML.
+
+Reported-by: Hans-Werner Hilse <hwhilse@gmail.com>
+Signed-off-by: Richard Weinberger <richard@nod.at>
+---
+
+--- a/arch/um/include/shared/init.h
++++ b/arch/um/include/shared/init.h
+@@ -40,28 +40,8 @@
+ typedef int (*initcall_t)(void);
+ typedef void (*exitcall_t)(void);
+
+-#ifdef __UM_HOST__
+-#ifndef __section
+-# define __section(S) __attribute__ ((__section__(#S)))
+-#endif
+-
+-#if __GNUC__ == 3
+-
+-#if __GNUC_MINOR__ >= 3
+-# define __used __attribute__((__used__))
+-#else
+-# define __used __attribute__((__unused__))
+-#endif
+-
+-#else
+-#if __GNUC__ == 4
+-# define __used __attribute__((__used__))
+-#endif
+-#endif
+-
+-#else
+ #include <linux/compiler.h>
+-#endif
++
+ /* These are for everybody (although not all archs will actually
+ discard it in modules) */
+ #define __init __section(.init.text)
diff --git a/target/linux/uml/patches-4.1/101-mconsole-exec.patch b/target/linux/uml/patches-4.1/101-mconsole-exec.patch
new file mode 100644
index 0000000..ac300a9
--- /dev/null
+++ b/target/linux/uml/patches-4.1/101-mconsole-exec.patch
@@ -0,0 +1,211 @@
+#
+# Minimalist mconsole exec patch
+#
+# 3.10 version (with bit more synchronous behavior) by fingon at iki dot fi
+# Adaptation to kernel 3.3.8 made by David Fernández (david at dit.upm.es) for
+# Starting point: mconsole-exec-2.6.30.patch for kernel 2.6.30
+# Author of original patch: Paolo Giarrusso, aka Blaisorblade
+# (http://www.user-mode-linux.org/~blaisorblade)
+#
+# Known misfeatures:
+#
+# - If output is too long, blocks (and breaks horribly)
+# (this misfeature from 3.10 patches, when minimalizing the patch;
+# workaround: redirect to a shared filesystem if long output is expected)
+#
+# - Nothing useful is done with stdin
+#
+--- a/arch/um/drivers/mconsole.h
++++ b/arch/um/drivers/mconsole.h
+@@ -85,6 +85,7 @@ extern void mconsole_cad(struct mc_reque
+ extern void mconsole_stop(struct mc_request *req);
+ extern void mconsole_go(struct mc_request *req);
+ extern void mconsole_log(struct mc_request *req);
++extern void mconsole_exec(struct mc_request *req);
+ extern void mconsole_proc(struct mc_request *req);
+ extern void mconsole_stack(struct mc_request *req);
+
+--- a/arch/um/drivers/mconsole_kern.c
++++ b/arch/um/drivers/mconsole_kern.c
+@@ -4,6 +4,7 @@
+ * Licensed under the GPL
+ */
+
++#include "linux/kmod.h"
+ #include <linux/console.h>
+ #include <linux/ctype.h>
+ #include <linux/string.h>
+@@ -24,6 +25,7 @@
+ #include <linux/fs.h>
+ #include <linux/mount.h>
+ #include <linux/file.h>
++#include <linux/completion.h>
+ #include <asm/uaccess.h>
+ #include <asm/switch_to.h>
+
+@@ -121,6 +123,59 @@ void mconsole_log(struct mc_request *req
+ mconsole_reply(req, "", 0, 0);
+ }
+
++void mconsole_exec(struct mc_request *req)
++{
++ struct subprocess_info *sub_info;
++ int res, len;
++ struct file *out;
++ char buf[MCONSOLE_MAX_DATA];
++
++ char *envp[] = {
++ "HOME=/", "TERM=linux",
++ "PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin",
++ NULL
++ };
++ char *argv[] = {
++ "/bin/sh", "-c",
++ req->request.data + strlen("exec "),
++ NULL
++ };
++
++ sub_info = call_usermodehelper_setup("/bin/sh", argv, envp, GFP_ATOMIC, NULL, NULL, NULL);
++ if (sub_info == NULL) {
++ mconsole_reply(req, "call_usermodehelper_setup failed", 1, 0);
++ return;
++ }
++ res = call_usermodehelper_stdoutpipe(sub_info, &out);
++ if (res < 0) {
++ kfree(sub_info);
++ mconsole_reply(req, "call_usermodehelper_stdoutpipe failed", 1, 0);
++ return;
++ }
++
++ res = call_usermodehelper_exec(sub_info, UMH_WAIT_PROC);
++ if (res < 0) {
++ kfree(sub_info);
++ mconsole_reply(req, "call_usermodehelper_exec failed", 1, 0);
++ return;
++ }
++
++ for (;;) {
++ len = out->f_op->read(out, buf, sizeof(buf), &out->f_pos);
++ if (len < 0) {
++ mconsole_reply(req, "reading output failed", 1, 0);
++ break;
++ }
++ if (len == 0)
++ break;
++ mconsole_reply_len(req, buf, len, 0, 1);
++ }
++ fput(out);
++
++ mconsole_reply_len(req, NULL, 0, 0, 0);
++}
++
++
+ void mconsole_proc(struct mc_request *req)
+ {
+ struct vfsmount *mnt = task_active_pid_ns(current)->proc_mnt;
+@@ -187,6 +242,7 @@ void mconsole_proc(struct mc_request *re
+ stop - pause the UML; it will do nothing until it receives a 'go' \n\
+ go - continue the UML after a 'stop' \n\
+ log <string> - make UML enter <string> into the kernel log\n\
++ exec <string> - pass <string> to /bin/sh -c synchronously\n\
+ proc <file> - returns the contents of the UML's /proc/<file>\n\
+ stack <pid> - returns the stack of the specified pid\n\
+ "
+--- a/arch/um/drivers/mconsole_user.c
++++ b/arch/um/drivers/mconsole_user.c
+@@ -30,6 +30,7 @@ static struct mconsole_command commands[
+ { "stop", mconsole_stop, MCONSOLE_PROC },
+ { "go", mconsole_go, MCONSOLE_INTR },
+ { "log", mconsole_log, MCONSOLE_INTR },
++ { "exec", mconsole_exec, MCONSOLE_PROC },
+ { "proc", mconsole_proc, MCONSOLE_PROC },
+ { "stack", mconsole_stack, MCONSOLE_INTR },
+ };
+--- a/arch/um/os-Linux/file.c
++++ b/arch/um/os-Linux/file.c
+@@ -534,6 +534,8 @@ int os_create_unix_socket(const char *fi
+
+ addr.sun_family = AF_UNIX;
+
++ if (len > sizeof(addr.sun_path))
++ len = sizeof(addr.sun_path);
+ snprintf(addr.sun_path, len, "%s", file);
+
+ err = bind(sock, (struct sockaddr *) &addr, sizeof(addr));
+--- a/include/linux/kmod.h
++++ b/include/linux/kmod.h
+@@ -62,6 +62,7 @@ struct subprocess_info {
+ int wait;
+ int retval;
+ int (*init)(struct subprocess_info *info, struct cred *new);
++ struct file *stdout;
+ void (*cleanup)(struct subprocess_info *info);
+ void *data;
+ };
+@@ -104,4 +105,6 @@ extern int usermodehelper_read_trylock(v
+ extern long usermodehelper_read_lock_wait(long timeout);
+ extern void usermodehelper_read_unlock(void);
+
++int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info, struct file **filp);
++
+ #endif /* __LINUX_KMOD_H__ */
+--- a/kernel/kmod.c
++++ b/kernel/kmod.c
+@@ -39,6 +39,7 @@
+ #include <linux/rwsem.h>
+ #include <linux/ptrace.h>
+ #include <linux/async.h>
++#include <linux/pipe_fs_i.h>
+ #include <asm/uaccess.h>
+
+ #include <trace/events/module.h>
+@@ -223,6 +224,28 @@ static int ____call_usermodehelper(void
+ flush_signal_handlers(current, 1);
+ spin_unlock_irq(&current->sighand->siglock);
+
++ /* Install output when needed */
++ if (sub_info->stdout) {
++ struct files_struct *f = current->files;
++ struct fdtable *fdt;
++
++ sys_close(1);
++ sys_close(2);
++ get_file(sub_info->stdout);
++ fd_install(1, sub_info->stdout);
++ fd_install(2, sub_info->stdout);
++ spin_lock(&f->file_lock);
++ fdt = files_fdtable(f);
++ __set_bit(1, fdt->open_fds);
++ __clear_bit(1, fdt->close_on_exec);
++ __set_bit(2, fdt->open_fds);
++ __clear_bit(2, fdt->close_on_exec);
++ spin_unlock(&f->file_lock);
++
++ /* disallow core files */
++ current->signal->rlim[RLIMIT_CORE] = (struct rlimit){0, 0};
++ }
++
+ /* We can run anywhere, unlike our parent keventd(). */
+ set_cpus_allowed_ptr(current, cpu_all_mask);
+
+@@ -522,6 +545,20 @@ struct subprocess_info *call_usermodehel
+ }
+ EXPORT_SYMBOL(call_usermodehelper_setup);
+
++int call_usermodehelper_stdoutpipe(struct subprocess_info *sub_info,
++ struct file **filp)
++{
++ struct file *f[2];
++
++ if (create_pipe_files(f, 0)<0)
++ return PTR_ERR(f);
++ sub_info->stdout = f[1];
++ *filp = f[0];
++ return 0;
++}
++EXPORT_SYMBOL(call_usermodehelper_stdoutpipe);
++
++
+ /**
+ * call_usermodehelper_exec - start a usermode application
+ * @sub_info: information about the subprocessa
diff --git a/target/linux/uml/patches-4.1/102-pseudo-random-mac.patch b/target/linux/uml/patches-4.1/102-pseudo-random-mac.patch
new file mode 100644
index 0000000..fc54f60
--- /dev/null
+++ b/target/linux/uml/patches-4.1/102-pseudo-random-mac.patch
@@ -0,0 +1,124 @@
+===============================================================================
+
+This patch makes MAC addresses of network interfaces predictable. In
+particular, it adds a small routine that computes MAC addresses of based on
+a SHA1 hash of the virtual machine name and interface ID.
+
+TECHNICAL INFORMATION:
+
+Applies to vanilla kernel 3.9.4.
+
+===============================================================================
+--- a/arch/um/Kconfig.net
++++ b/arch/um/Kconfig.net
+@@ -21,6 +21,19 @@ config UML_NET
+ enable at least one of the following transport options to actually
+ make use of UML networking.
+
++config UML_NET_RANDOM_MAC
++ bool "Use random MAC addresses for network interfaces"
++ default n
++ depends on UML_NET
++ help
++ Virtual network devices inside a User-Mode Linux instance must be
++ assigned a MAC (Ethernet) address. If none is specified on the UML
++ command line, one must be automatically computed. If this option is
++ enabled, a randomly generated address is used. Otherwise, if this
++ option is disabled, the address is generated from a SHA1 hash of
++ the umid of the UML instance and the interface name. The latter choice
++ is useful to make MAC addresses predictable.
++
+ config UML_NET_ETHERTAP
+ bool "Ethertap transport"
+ depends on UML_NET
+--- a/arch/um/drivers/net_kern.c
++++ b/arch/um/drivers/net_kern.c
+@@ -25,6 +25,13 @@
+ #include <net_kern.h>
+ #include <net_user.h>
+
++#include <crypto/sha.h>
++#include <linux/string.h>
++#include <linux/crypto.h>
++#include <linux/err.h>
++#include <linux/scatterlist.h>
++#include "os.h"
++
+ #define DRIVER_NAME "uml-netdev"
+
+ static DEFINE_SPINLOCK(opened_lock);
+@@ -295,11 +302,47 @@ static void uml_net_user_timer_expire(un
+ #endif
+ }
+
++#ifndef CONFIG_UML_NET_RANDOM_MAC
++
++/* Compute a SHA1 hash of the UML instance's id and
++ * * an interface name. */
++static int compute_hash(const char *umid, const char *ifname, char *hash) {
++ char vmif[1024];
++ struct scatterlist sg;
++ struct crypto_hash *tfm;
++ struct hash_desc desc;
++
++ strcpy (vmif, umid);
++ strcat (vmif, ifname);
++
++ tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC);
++ if (IS_ERR(tfm))
++ return 1;
++
++ desc.tfm = tfm;
++ desc.flags = 0;
++
++ sg_init_table(&sg, 1);
++ sg_set_buf(&sg, vmif, strlen(vmif));
++
++ if (crypto_hash_digest(&desc, &sg, strlen(vmif), hash)) {
++ crypto_free_hash(tfm);
++ return 1;
++ }
++
++ crypto_free_hash(tfm);
++
++ return 0;
++}
++
++#endif
++
+ static void setup_etheraddr(struct net_device *dev, char *str)
+ {
+ unsigned char *addr = dev->dev_addr;
+ char *end;
+ int i;
++ u8 hash[SHA1_DIGEST_SIZE];
+
+ if (str == NULL)
+ goto random;
+@@ -340,9 +383,26 @@ static void setup_etheraddr(struct net_d
+ return;
+
+ random:
++#ifdef CONFIG_UML_NET_RANDOM_MAC
+ printk(KERN_INFO
+ "Choosing a random ethernet address for device %s\n", dev->name);
+ eth_hw_addr_random(dev);
++#else
++ printk(KERN_INFO
++ "Computing a digest to use as ethernet address for device %s\n", dev->name);
++ if (compute_hash(get_umid(), dev->name, hash)) {
++ printk(KERN_WARNING
++ "Could not compute digest to use as ethernet address for device %s. "
++ "Using random address instead.\n", dev->name);
++ random_ether_addr(addr);
++ }
++ else {
++ for (i=0; i < 6; i++)
++ addr[i] = (hash[i] + hash[i+6]) % 0x100;
++ }
++ addr [0] &= 0xfe; /* clear multicast bit */
++ addr [0] |= 0x02; /* set local assignment bit (IEEE802) */
++#endif
+ }
+
+ static DEFINE_SPINLOCK(devices_lock);