diff options
Diffstat (limited to 'arch/um/kernel')
| -rw-r--r-- | arch/um/kernel/Makefile | 4 | ||||
| -rw-r--r-- | arch/um/kernel/dtb.c | 41 | ||||
| -rw-r--r-- | arch/um/kernel/exec.c | 1 | ||||
| -rw-r--r-- | arch/um/kernel/initrd.c | 48 | ||||
| -rw-r--r-- | arch/um/kernel/ksyms.c | 2 | ||||
| -rw-r--r-- | arch/um/kernel/load_file.c | 61 | ||||
| -rw-r--r-- | arch/um/kernel/mem.c | 3 | ||||
| -rw-r--r-- | arch/um/kernel/process.c | 6 | ||||
| -rw-r--r-- | arch/um/kernel/skas/uaccess.c | 26 | ||||
| -rw-r--r-- | arch/um/kernel/syscall.c | 28 | ||||
| -rw-r--r-- | arch/um/kernel/trap.c | 9 | ||||
| -rw-r--r-- | arch/um/kernel/um_arch.c | 3 | ||||
| -rw-r--r-- | arch/um/kernel/um_arch.h | 14 | 
13 files changed, 134 insertions, 112 deletions
| diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile index 1d18e4e46989..1c2d4b29a3d4 100644 --- a/arch/um/kernel/Makefile +++ b/arch/um/kernel/Makefile @@ -16,11 +16,13 @@ extra-y := vmlinux.lds  obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \  	physmem.o process.o ptrace.o reboot.o sigio.o \ -	signal.o syscall.o sysrq.o time.o tlb.o trap.o \ +	signal.o sysrq.o time.o tlb.o trap.o \  	um_arch.o umid.o maccess.o kmsg_dump.o capflags.o skas/ +obj-y += load_file.o  obj-$(CONFIG_BLK_DEV_INITRD) += initrd.o  obj-$(CONFIG_GPROF)	+= gprof_syms.o +obj-$(CONFIG_OF) += dtb.o  obj-$(CONFIG_EARLY_PRINTK) += early_printk.o  obj-$(CONFIG_STACKTRACE) += stacktrace.o  obj-$(CONFIG_GENERIC_PCI_IOMAP) += ioport.o diff --git a/arch/um/kernel/dtb.c b/arch/um/kernel/dtb.c new file mode 100644 index 000000000000..ca69d72025f3 --- /dev/null +++ b/arch/um/kernel/dtb.c @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0-only + +#include <linux/init.h> +#include <linux/of_fdt.h> +#include <linux/printk.h> +#include <linux/memblock.h> +#include <init.h> + +#include "um_arch.h" + +static char *dtb __initdata; + +void uml_dtb_init(void) +{ +	long long size; +	void *area; + +	area = uml_load_file(dtb, &size); +	if (!area) +		return; + +	if (!early_init_dt_scan(area)) { +		pr_err("invalid DTB %s\n", dtb); +		memblock_free(area, size); +		return; +	} + +	unflatten_device_tree(); +	early_init_fdt_scan_reserved_mem(); +} + +static int __init uml_dtb_setup(char *line, int *add) +{ +	dtb = line; +	return 0; +} + +__uml_setup("dtb=", uml_dtb_setup, +"dtb=<file>\n" +"    Boot the kernel with the devicetree blob from the specified file.\n" +); diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c index 4d8498100341..c85e40c72779 100644 --- a/arch/um/kernel/exec.c +++ b/arch/um/kernel/exec.c @@ -16,6 +16,7 @@  #include <linux/uaccess.h>  #include <as-layout.h>  #include <mem_user.h> +#include <registers.h>  #include <skas.h>  #include <os.h> diff --git a/arch/um/kernel/initrd.c b/arch/um/kernel/initrd.c index c1981ffb7179..47b8cb1a1156 100644 --- a/arch/um/kernel/initrd.c +++ b/arch/um/kernel/initrd.c @@ -10,37 +10,21 @@  #include <init.h>  #include <os.h> +#include "um_arch.h" +  /* Changed by uml_initrd_setup, which is a setup */  static char *initrd __initdata = NULL; -static int load_initrd(char *filename, void *buf, int size);  int __init read_initrd(void)  { +	unsigned long long size;  	void *area; -	long long size; -	int err; - -	if (initrd == NULL) -		return 0; -	err = os_file_size(initrd, &size); -	if (err) +	if (!initrd)  		return 0; -	/* -	 * This is necessary because alloc_bootmem craps out if you -	 * ask for no memory. -	 */ -	if (size == 0) { -		printk(KERN_ERR "\"%s\" is a zero-size initrd\n", initrd); -		return 0; -	} - -	area = memblock_alloc(size, SMP_CACHE_BYTES); +	area = uml_load_file(initrd, &size);  	if (!area) -		panic("%s: Failed to allocate %llu bytes\n", __func__, size); - -	if (load_initrd(initrd, area, size) == -1)  		return 0;  	initrd_start = (unsigned long) area; @@ -59,25 +43,3 @@ __uml_setup("initrd=", uml_initrd_setup,  "    This is used to boot UML from an initrd image.  The argument is the\n"  "    name of the file containing the image.\n\n"  ); - -static int load_initrd(char *filename, void *buf, int size) -{ -	int fd, n; - -	fd = os_open_file(filename, of_read(OPENFLAGS()), 0); -	if (fd < 0) { -		printk(KERN_ERR "Opening '%s' failed - err = %d\n", filename, -		       -fd); -		return -1; -	} -	n = os_read_file(fd, buf, size); -	if (n != size) { -		printk(KERN_ERR "Read of %d bytes from '%s' failed, " -		       "err = %d\n", size, -		       filename, -n); -		return -1; -	} - -	os_close_file(fd); -	return 0; -} diff --git a/arch/um/kernel/ksyms.c b/arch/um/kernel/ksyms.c index b1e5634398d0..3a85bde3e173 100644 --- a/arch/um/kernel/ksyms.c +++ b/arch/um/kernel/ksyms.c @@ -6,7 +6,7 @@  #include <linux/module.h>  #include <os.h> -EXPORT_SYMBOL(set_signals); +EXPORT_SYMBOL(um_set_signals);  EXPORT_SYMBOL(signals_enabled);  EXPORT_SYMBOL(os_stat_fd); diff --git a/arch/um/kernel/load_file.c b/arch/um/kernel/load_file.c new file mode 100644 index 000000000000..5cecd0e291fb --- /dev/null +++ b/arch/um/kernel/load_file.c @@ -0,0 +1,61 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) + */ +#include <linux/memblock.h> +#include <os.h> + +#include "um_arch.h" + +static int __init __uml_load_file(const char *filename, void *buf, int size) +{ +	int fd, n; + +	fd = os_open_file(filename, of_read(OPENFLAGS()), 0); +	if (fd < 0) { +		printk(KERN_ERR "Opening '%s' failed - err = %d\n", filename, +		       -fd); +		return -1; +	} +	n = os_read_file(fd, buf, size); +	if (n != size) { +		printk(KERN_ERR "Read of %d bytes from '%s' failed, " +		       "err = %d\n", size, +		       filename, -n); +		return -1; +	} + +	os_close_file(fd); +	return 0; +} + +void *uml_load_file(const char *filename, unsigned long long *size) +{ +	void *area; +	int err; + +	*size = 0; + +	if (!filename) +		return NULL; + +	err = os_file_size(filename, size); +	if (err) +		return NULL; + +	if (*size == 0) { +		printk(KERN_ERR "\"%s\" is empty\n", filename); +		return NULL; +	} + +	area = memblock_alloc(*size, SMP_CACHE_BYTES); +	if (!area) +		panic("%s: Failed to allocate %llu bytes\n", __func__, *size); + +	if (__uml_load_file(filename, area, *size)) { +		memblock_free(area, *size); +		return NULL; +	} + +	return area; +} diff --git a/arch/um/kernel/mem.c b/arch/um/kernel/mem.c index 0039771eb01c..15295c3237a0 100644 --- a/arch/um/kernel/mem.c +++ b/arch/um/kernel/mem.c @@ -85,8 +85,7 @@ static void __init one_md_table_init(pud_t *pud)  		      __func__, PAGE_SIZE, PAGE_SIZE);  	set_pud(pud, __pud(_KERNPG_TABLE + (unsigned long) __pa(pmd_table))); -	if (pmd_table != pmd_offset(pud, 0)) -		BUG(); +	BUG_ON(pmd_table != pmd_offset(pud, 0));  #endif  } diff --git a/arch/um/kernel/process.c b/arch/um/kernel/process.c index 82107373ac7e..4a420778ed87 100644 --- a/arch/um/kernel/process.c +++ b/arch/um/kernel/process.c @@ -31,6 +31,7 @@  #include <kern_util.h>  #include <os.h>  #include <skas.h> +#include <registers.h>  #include <linux/time-internal.h>  /* @@ -263,11 +264,6 @@ int clear_user_proc(void __user *buf, int size)  	return clear_user(buf, size);  } -int cpu(void) -{ -	return current_thread_info()->cpu; -} -  static atomic_t using_sysemu = ATOMIC_INIT(0);  int sysemu_supported; diff --git a/arch/um/kernel/skas/uaccess.c b/arch/um/kernel/skas/uaccess.c index a509be911026..aaee96f07172 100644 --- a/arch/um/kernel/skas/uaccess.c +++ b/arch/um/kernel/skas/uaccess.c @@ -146,11 +146,6 @@ static int copy_chunk_from_user(unsigned long from, int len, void *arg)  unsigned long raw_copy_from_user(void *to, const void __user *from, unsigned long n)  { -	if (uaccess_kernel()) { -		memcpy(to, (__force void*)from, n); -		return 0; -	} -  	return buffer_op((unsigned long) from, n, 0, copy_chunk_from_user, &to);  }  EXPORT_SYMBOL(raw_copy_from_user); @@ -166,11 +161,6 @@ static int copy_chunk_to_user(unsigned long to, int len, void *arg)  unsigned long raw_copy_to_user(void __user *to, const void *from, unsigned long n)  { -	if (uaccess_kernel()) { -		memcpy((__force void *) to, from, n); -		return 0; -	} -  	return buffer_op((unsigned long) to, n, 1, copy_chunk_to_user, &from);  }  EXPORT_SYMBOL(raw_copy_to_user); @@ -196,12 +186,6 @@ long strncpy_from_user(char *dst, const char __user *src, long count)  	if (!access_ok(src, 1))  		return -EFAULT; - -	if (uaccess_kernel()) { -		strncpy(dst, (__force void *) src, count); -		return strnlen(dst, count); -	} -  	n = buffer_op((unsigned long) src, count, 0, strncpy_chunk_from_user,  		      &ptr);  	if (n != 0) @@ -218,11 +202,6 @@ static int clear_chunk(unsigned long addr, int len, void *unused)  unsigned long __clear_user(void __user *mem, unsigned long len)  { -	if (uaccess_kernel()) { -		memset((__force void*)mem, 0, len); -		return 0; -	} -  	return buffer_op((unsigned long) mem, len, 1, clear_chunk, NULL);  }  EXPORT_SYMBOL(__clear_user); @@ -245,10 +224,6 @@ long strnlen_user(const char __user *str, long len)  	if (!access_ok(str, 1))  		return -EFAULT; - -	if (uaccess_kernel()) -		return strnlen((__force char*)str, len) + 1; -  	n = buffer_op((unsigned long) str, len, 0, strnlen_chunk, &count);  	if (n == 0)  		return count + 1; @@ -348,7 +323,6 @@ EXPORT_SYMBOL(arch_futex_atomic_op_inuser);   * 0 - On success   * -EFAULT - User access resulted in a page fault   * -EAGAIN - Atomic operation was unable to complete due to contention - * -ENOSYS - Function not implemented (only if !HAVE_FUTEX_CMPXCHG)   */  int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, diff --git a/arch/um/kernel/syscall.c b/arch/um/kernel/syscall.c deleted file mode 100644 index eed54c53fbbb..000000000000 --- a/arch/um/kernel/syscall.c +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -/* - * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) - */ - -#include <linux/file.h> -#include <linux/fs.h> -#include <linux/mm.h> -#include <linux/sched.h> -#include <linux/utsname.h> -#include <linux/syscalls.h> -#include <asm/current.h> -#include <asm/mman.h> -#include <linux/uaccess.h> -#include <asm/unistd.h> - -long old_mmap(unsigned long addr, unsigned long len, -	      unsigned long prot, unsigned long flags, -	      unsigned long fd, unsigned long offset) -{ -	long err = -EINVAL; -	if (offset & ~PAGE_MASK) -		goto out; - -	err = ksys_mmap_pgoff(addr, len, prot, flags, fd, offset >> PAGE_SHIFT); - out: -	return err; -} diff --git a/arch/um/kernel/trap.c b/arch/um/kernel/trap.c index c32efb09db21..d1d5d0be0308 100644 --- a/arch/um/kernel/trap.c +++ b/arch/um/kernel/trap.c @@ -87,12 +87,10 @@ good_area:  			}  			BUG();  		} -		if (flags & FAULT_FLAG_ALLOW_RETRY) { -			if (fault & VM_FAULT_RETRY) { -				flags |= FAULT_FLAG_TRIED; +		if (fault & VM_FAULT_RETRY) { +			flags |= FAULT_FLAG_TRIED; -				goto retry; -			} +			goto retry;  		}  		pmd = pmd_off(mm, address); @@ -127,7 +125,6 @@ out_of_memory:  	pagefault_out_of_memory();  	return 0;  } -EXPORT_SYMBOL(handle_page_fault);  static void show_segv_info(struct uml_pt_regs *regs)  { diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 54447690de11..abceeabe29b9 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c @@ -29,6 +29,8 @@  #include <mem_user.h>  #include <os.h> +#include "um_arch.h" +  #define DEFAULT_COMMAND_LINE_ROOT "root=98:0"  #define DEFAULT_COMMAND_LINE_CONSOLE "console=tty" @@ -407,6 +409,7 @@ void __init setup_arch(char **cmdline_p)  	stack_protections((unsigned long) &init_thread_info);  	setup_physmem(uml_physmem, uml_reserved, physmem_size, highmem);  	mem_total_pages(physmem_size, iomem_size, highmem); +	uml_dtb_init();  	read_initrd();  	paging_init(); diff --git a/arch/um/kernel/um_arch.h b/arch/um/kernel/um_arch.h new file mode 100644 index 000000000000..1e07fb7ee35e --- /dev/null +++ b/arch/um/kernel/um_arch.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef __UML_ARCH_H__ +#define __UML_ARCH_H__ + +extern void * __init uml_load_file(const char *filename, unsigned long long *size); + +#ifdef CONFIG_OF +extern void __init uml_dtb_init(void); +#else +static inline void uml_dtb_init(void) { } +#endif + +#endif |