Initial commit

This commit is contained in:
domenico
2025-06-24 15:51:28 +02:00
commit 22031d9dab
6862 changed files with 1462554 additions and 0 deletions

41
target/linux/uml/Makefile Normal file
View File

@@ -0,0 +1,41 @@
#
# 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
# 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:=squashfs ext4 audio source-only
MAINTAINER:=Florian Fainelli <florian@openwrt.org>
KERNEL_PATCHVER:=4.9
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 mkf2fs e2fsprogs
endif
$(eval $(call BuildTarget))

46
target/linux/uml/README Normal file
View File

@@ -0,0 +1,46 @@
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/targets/uml/generic/lede-uml-vmlinux
ubd0=bin/targets/uml/generic/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/

View File

@@ -0,0 +1,4 @@
# Copyright (c) 2013 The Linux Foundation. All rights reserved.
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
tty0::askfirst:/usr/libexec/login.sh

View File

@@ -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_LOOP=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_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_F2FS_CHECK_FS is not set
CONFIG_F2FS_FS=y
# CONFIG_F2FS_FS_SECURITY is not set
CONFIG_F2FS_FS_XATTR=y
CONFIG_F2FS_STAT_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_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_JFFS2_CMODE_PRIORITY is not set
# CONFIG_JFFS2_FS is not set
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_OF is not set
CONFIG_OLD_SIGACTION=y
CONFIG_OLD_SIGSUSPEND3=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_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_SCHED_INFO 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_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

View File

@@ -0,0 +1,153 @@
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_LOOP=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_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_F2FS_CHECK_FS is not set
CONFIG_F2FS_FS=y
# CONFIG_F2FS_FS_SECURITY is not set
CONFIG_F2FS_FS_XATTR=y
CONFIG_F2FS_STAT_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_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_JFFS2_FS is not set
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_OF is not set
CONFIG_PGTABLE_LEVELS=3
CONFIG_PHYS_ADDR_T_64BIT=y
CONFIG_PORT_CHAN=y
CONFIG_POSIX_MQUEUE=y
CONFIG_POSIX_MQUEUE_SYSCTL=y
# CONFIG_PROCESSOR_SELECT is not set
CONFIG_PROC_PAGE_MONITOR=y
CONFIG_PTY_CHAN=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_SCHED_INFO 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_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 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

View File

@@ -0,0 +1,35 @@
#
# 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/squashfs
dd if=/dev/zero of=$(KDIR)/root.squashfs bs=1024k count=0 seek=$(CONFIG_TARGET_ROOTFS_PARTSIZE)
endef
define Image/Build
$(call Image/Build/$(1))
cp $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_PREFIX)-$(1).img
cp $(KDIR)/vmlinux.elf $(BIN_DIR)/$(IMG_PREFIX)-vmlinux
endef
$(eval $(call BuildImage))
# UML requires linking against several glibc static libraries: libutil, librt
# and libpthread, check that here. We do not check against libpthread
# specifically because getting something to build that references a libpthread
# symbol is pretty involved and Linux distributions package these 3 libraries
# in the same package.
$(eval $(call TestHostCommand,glibc-static, \
Please install a static glibc package. (Missing libutil.a, librt.a or libpthread.a), \
echo 'int main(int argc, char **argv) { login(0); timer_gettime(0, 0); return 0; }' | \
gcc -include utmp.h -x c -o $(TMP_DIR)/a.out - -static -lutil -lrt))

View File

@@ -0,0 +1,130 @@
From f44f1e7da7c8e3f4575d5d61c4df978496903fcc Mon Sep 17 00:00:00 2001
From: Florian Fainelli <f.fainelli@gmail.com>
Date: Tue, 23 May 2017 17:32:31 -0700
Subject: [PATCH] um: Avoid longjmp/setjmp symbol clashes with libpthread.a
[ Upstream commit f44f1e7da7c8e3f4575d5d61c4df978496903fcc ]
Building a statically linked UML kernel on a Centos 6.9 host resulted in
the following linking failure (GCC 4.4, glibc-2.12):
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libpthread.a(libpthread.o):
In function `siglongjmp':
(.text+0x8490): multiple definition of `longjmp'
arch/x86/um/built-in.o:/local/users/fainelli/openwrt/trunk/build_dir/target-x86_64_musl/linux-uml/linux-4.4.69/arch/x86/um/setjmp_64.S:44:
first defined here
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/libpthread.a(libpthread.o):
In function `sem_open':
(.text+0x77cd): warning: the use of `mktemp' is dangerous, better use
`mkstemp'
collect2: ld returned 1 exit status
make[4]: *** [vmlinux] Error 1
Adopt a solution similar to the one done for vmap where we define
longjmp/setjmp to be kernel_longjmp/setjmp. In the process, make sure we
do rename the functions in arch/x86/um/setjmp_*.S accordingly.
Fixes: a7df4716d195 ("um: link with -lpthread")
Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
---
arch/um/Makefile | 4 ++++
arch/x86/um/setjmp_32.S | 16 ++++++++--------
arch/x86/um/setjmp_64.S | 16 ++++++++--------
3 files changed, 20 insertions(+), 16 deletions(-)
--- a/arch/um/Makefile
+++ b/arch/um/Makefile
@@ -59,10 +59,14 @@ KBUILD_CPPFLAGS += -I$(srctree)/$(HOST_D
# Same things for in6addr_loopback and mktime - found in libc. For these two we
# only get link-time error, luckily.
#
+# -Dlongjmp=kernel_longjmp prevents anything from referencing the libpthread.a
+# embedded copy of longjmp, same thing for setjmp.
+#
# These apply to USER_CFLAGS to.
KBUILD_CFLAGS += $(CFLAGS) $(CFLAGS-y) -D__arch_um__ \
$(ARCH_INCLUDE) $(MODE_INCLUDE) -Dvmap=kernel_vmap \
+ -Dlongjmp=kernel_longjmp -Dsetjmp=kernel_setjmp \
-Din6addr_loopback=kernel_in6addr_loopback \
-Din6addr_any=kernel_in6addr_any -Dstrrchr=kernel_strrchr
--- a/arch/x86/um/setjmp_32.S
+++ b/arch/x86/um/setjmp_32.S
@@ -16,9 +16,9 @@
.text
.align 4
- .globl setjmp
- .type setjmp, @function
-setjmp:
+ .globl kernel_setjmp
+ .type kernel_setjmp, @function
+kernel_setjmp:
#ifdef _REGPARM
movl %eax,%edx
#else
@@ -35,13 +35,13 @@ setjmp:
movl %ecx,20(%edx) # Return address
ret
- .size setjmp,.-setjmp
+ .size kernel_setjmp,.-kernel_setjmp
.text
.align 4
- .globl longjmp
- .type longjmp, @function
-longjmp:
+ .globl kernel_longjmp
+ .type kernel_longjmp, @function
+kernel_longjmp:
#ifdef _REGPARM
xchgl %eax,%edx
#else
@@ -55,4 +55,4 @@ longjmp:
movl 16(%edx),%edi
jmp *20(%edx)
- .size longjmp,.-longjmp
+ .size kernel_longjmp,.-kernel_longjmp
--- a/arch/x86/um/setjmp_64.S
+++ b/arch/x86/um/setjmp_64.S
@@ -18,9 +18,9 @@
.text
.align 4
- .globl setjmp
- .type setjmp, @function
-setjmp:
+ .globl kernel_setjmp
+ .type kernel_setjmp, @function
+kernel_setjmp:
pop %rsi # Return address, and adjust the stack
xorl %eax,%eax # Return value
movq %rbx,(%rdi)
@@ -34,13 +34,13 @@ setjmp:
movq %rsi,56(%rdi) # Return address
ret
- .size setjmp,.-setjmp
+ .size kernel_setjmp,.-kernel_setjmp
.text
.align 4
- .globl longjmp
- .type longjmp, @function
-longjmp:
+ .globl kernel_longjmp
+ .type kernel_longjmp, @function
+kernel_longjmp:
movl %esi,%eax # Return value (int)
movq (%rdi),%rbx
movq 8(%rdi),%rsp
@@ -51,4 +51,4 @@ longjmp:
movq 48(%rdi),%r15
jmp *56(%rdi)
- .size longjmp,.-longjmp
+ .size kernel_longjmp,.-kernel_longjmp

View File

@@ -0,0 +1,29 @@
From 61e8d462457f202bf0c6393133425ad387825e22 Mon Sep 17 00:00:00 2001
From: Richard Weinberger <richard@nod.at>
Date: Thu, 6 Jul 2017 09:35:27 +0200
Subject: [PATCH] um: Correctly check for PTRACE_GETRESET/SETREGSET
[ Upstream commit 61e8d462457f202bf0c6393133425ad387825e22 ]
When checking for PTRACE_GETRESET/SETREGSET, make sure that
the correct header file is included. We need linux/ptrace.h
which contains all ptrace UAPI related defines.
Otherwise #if defined(PTRACE_GETRESET) is always false.
Cc: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
---
arch/x86/um/user-offsets.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/arch/x86/um/user-offsets.c
+++ b/arch/x86/um/user-offsets.c
@@ -5,7 +5,7 @@
#include <sys/mman.h>
#include <sys/user.h>
#define __FRAME_OFFSETS
-#include <asm/ptrace.h>
+#include <linux/ptrace.h>
#include <asm/types.h>
#ifdef __i386__

View File

@@ -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
@@ -555,6 +555,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;
};
@@ -102,4 +103,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
@@ -40,6 +40,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_exec_asyn
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};
+ }
+
/*
* Initial kernel threads share ther FS with init, in order to
* get the init root directory. But we've now created a new
@@ -549,6 +572,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

View File

@@ -0,0 +1,131 @@
===============================================================================
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,14 @@
#include <net_kern.h>
#include <net_user.h>
+#include <crypto/sha.h>
+#include <crypto/hash.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 +303,53 @@ 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)
+{
+ struct ahash_request *desc;
+ struct crypto_ahash *tfm;
+ struct scatterlist sg;
+ char vmif[1024];
+ int ret;
+
+ strcpy (vmif, umid);
+ strcat (vmif, ifname);
+
+ tfm = crypto_alloc_ahash("sha1", 0, CRYPTO_ALG_ASYNC);
+ if (IS_ERR(tfm))
+ return -ENOMEM;
+
+ desc = ahash_request_alloc(tfm, GFP_KERNEL);
+ if (!desc) {
+ ret = -ENOMEM;
+ goto out;
+ }
+
+ crypto_ahash_clear_flags(tfm, ~0);
+
+ sg_init_table(&sg, 1);
+ sg_set_buf(&sg, vmif, strlen(vmif));
+
+ ahash_request_set_crypt(desc, &sg, hash, strlen(vmif));
+
+ ret = crypto_ahash_digest(desc);
+out:
+ crypto_free_ahash(tfm);
+
+ return ret;
+}
+
+#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 +390,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) < 0) {
+ 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);