From: Nicolas I. <nic...@m4...> - 2014-10-12 11:03:21
|
arch/um/kernel/dyn.lds.S and arch/um/kernel/uml.lds.S define some UML-specific symbols. These symbols are used in the kernel part of UML with extern declarations. Move these declarations to a new header, asm/sections.h, like other architectures do. Signed-off-by: Nicolas Iooss <nic...@m4...> --- arch/um/include/asm/Kbuild | 1 - arch/um/include/asm/sections.h | 9 +++++++++ arch/um/kernel/physmem.c | 3 +-- arch/um/kernel/skas/mmu.c | 3 +-- arch/um/kernel/um_arch.c | 2 -- 5 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 arch/um/include/asm/sections.h diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild index 244b12c8cb39..21fd5c647442 100644 --- a/arch/um/include/asm/Kbuild +++ b/arch/um/include/asm/Kbuild @@ -23,7 +23,6 @@ generic-y += pci.h generic-y += percpu.h generic-y += preempt.h generic-y += scatterlist.h -generic-y += sections.h generic-y += switch_to.h generic-y += topology.h generic-y += trace_clock.h diff --git a/arch/um/include/asm/sections.h b/arch/um/include/asm/sections.h new file mode 100644 index 000000000000..3a6ebcc65519 --- /dev/null +++ b/arch/um/include/asm/sections.h @@ -0,0 +1,9 @@ +#ifndef __UM_SECTIONS_H +#define __UM_SECTIONS_H + +#include <asm-generic/sections.h> + +extern char __binary_start; +extern int __syscall_stub_start, __syscall_stub_end; + +#endif diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c index 30fdd5d0067b..db05c067665a 100644 --- a/arch/um/kernel/physmem.c +++ b/arch/um/kernel/physmem.c @@ -8,6 +8,7 @@ #include <linux/mm.h> #include <linux/pfn.h> #include <asm/page.h> +#include <asm/sections.h> #include <as-layout.h> #include <init.h> #include <kern.h> @@ -75,8 +76,6 @@ void map_memory(unsigned long virt, unsigned long phys, unsigned long len, } } -extern int __syscall_stub_start; - void __init setup_physmem(unsigned long start, unsigned long reserve_end, unsigned long len, unsigned long long highmem) { diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c index 007d5503f49b..d2a0a4c0cd91 100644 --- a/arch/um/kernel/skas/mmu.c +++ b/arch/um/kernel/skas/mmu.c @@ -8,12 +8,11 @@ #include <linux/slab.h> #include <asm/pgalloc.h> #include <asm/pgtable.h> +#include <asm/sections.h> #include <as-layout.h> #include <os.h> #include <skas.h> -extern int __syscall_stub_start; - static int init_stub_pte(struct mm_struct *mm, unsigned long proc, unsigned long kernel) { diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 016adf0985d5..02c21f6e0983 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c @@ -259,8 +259,6 @@ EXPORT_SYMBOL(end_iomem); #define MIN_VMALLOC (32 * 1024 * 1024) -extern char __binary_start; - int __init linux_main(int argc, char **argv) { unsigned long avail, diff; -- 2.1.1 |
From: Nicolas I. <nic...@m4...> - 2014-10-12 11:03:31
|
The linker script defines some variables which are declared either with type char[] in include/asm-generic/sections.h or with a meaningless integer type in arch/um/include/asm/sections.h. Fix this inconsistency by declaring every variable char[]. Signed-off-by: Nicolas Iooss <nic...@m4...> --- arch/um/include/asm/sections.h | 4 ++-- arch/um/kernel/physmem.c | 4 ++-- arch/um/kernel/skas/mmu.c | 4 ++-- arch/um/kernel/um_arch.c | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/arch/um/include/asm/sections.h b/arch/um/include/asm/sections.h index 3a6ebcc65519..cafcf684d947 100644 --- a/arch/um/include/asm/sections.h +++ b/arch/um/include/asm/sections.h @@ -3,7 +3,7 @@ #include <asm-generic/sections.h> -extern char __binary_start; -extern int __syscall_stub_start, __syscall_stub_end; +extern char __binary_start[]; +extern char __syscall_stub_start[], __syscall_stub_end[]; #endif diff --git a/arch/um/kernel/physmem.c b/arch/um/kernel/physmem.c index db05c067665a..c833a5dec1e7 100644 --- a/arch/um/kernel/physmem.c +++ b/arch/um/kernel/physmem.c @@ -100,8 +100,8 @@ void __init setup_physmem(unsigned long start, unsigned long reserve_end, * Special kludge - This page will be mapped in to userspace processes * from physmem_fd, so it needs to be written out there. */ - os_seek_file(physmem_fd, __pa(&__syscall_stub_start)); - os_write_file(physmem_fd, &__syscall_stub_start, PAGE_SIZE); + os_seek_file(physmem_fd, __pa(__syscall_stub_start)); + os_write_file(physmem_fd, __syscall_stub_start, PAGE_SIZE); os_fsync_file(physmem_fd); bootmap_size = init_bootmem(pfn, pfn + delta); diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c index d2a0a4c0cd91..e40ce29bdc2c 100644 --- a/arch/um/kernel/skas/mmu.c +++ b/arch/um/kernel/skas/mmu.c @@ -108,7 +108,7 @@ void uml_setup_stubs(struct mm_struct *mm) return; ret = init_stub_pte(mm, STUB_CODE, - (unsigned long) &__syscall_stub_start); + (unsigned long) __syscall_stub_start); if (ret) goto out; @@ -116,7 +116,7 @@ void uml_setup_stubs(struct mm_struct *mm) if (ret) goto out; - mm->context.stub_pages[0] = virt_to_page(&__syscall_stub_start); + mm->context.stub_pages[0] = virt_to_page(__syscall_stub_start); mm->context.stub_pages[1] = virt_to_page(mm->context.id.stack); /* dup_mmap already holds mmap_sem */ diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c index 02c21f6e0983..5dd632203dca 100644 --- a/arch/um/kernel/um_arch.c +++ b/arch/um/kernel/um_arch.c @@ -313,7 +313,7 @@ int __init linux_main(int argc, char **argv) physmem_size += UML_ROUND_UP(brk_start) - UML_ROUND_UP(&_end); } - uml_physmem = (unsigned long) &__binary_start & PAGE_MASK; + uml_physmem = (unsigned long) __binary_start & PAGE_MASK; /* Reserve up to 4M after the current brk */ uml_reserved = ROUND_4M(brk_start) + (1 << 22); -- 2.1.1 |
From: Nicolas I. <nic...@m4...> - 2014-10-12 11:03:33
|
When declaring __syscall_stub_start, use the same type in UML userspace code as in arch/um/include/asm/sections.h. While at it, also declare batch_syscall_stub as char[]. Signed-off-by: Nicolas Iooss <nic...@m4...> --- arch/um/os-Linux/skas/mem.c | 6 +++--- arch/um/os-Linux/skas/process.c | 11 +++++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c index 689b18db798f..abb02becca80 100644 --- a/arch/um/os-Linux/skas/mem.c +++ b/arch/um/os-Linux/skas/mem.c @@ -19,7 +19,7 @@ #include <sysdep/ptrace.h> #include <sysdep/stub.h> -extern unsigned long batch_syscall_stub, __syscall_stub_start; +extern char batch_syscall_stub[], __syscall_stub_start[]; extern void wait_stub_done(int pid); @@ -39,8 +39,8 @@ static int __init init_syscall_regs(void) { get_safe_registers(syscall_regs, NULL); syscall_regs[REGS_IP_INDEX] = STUB_CODE + - ((unsigned long) &batch_syscall_stub - - (unsigned long) &__syscall_stub_start); + ((unsigned long) batch_syscall_stub - + (unsigned long) __syscall_stub_start); return 0; } diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c index 908579f2b0ab..fa934d0c8932 100644 --- a/arch/um/os-Linux/skas/process.c +++ b/arch/um/os-Linux/skas/process.c @@ -193,7 +193,7 @@ static void handle_trap(int pid, struct uml_pt_regs *regs, handle_syscall(regs); } -extern int __syscall_stub_start; +extern char __syscall_stub_start[]; static int userspace_tramp(void *stack) { @@ -218,7 +218,7 @@ static int userspace_tramp(void *stack) */ int fd; unsigned long long offset; - fd = phys_mapping(to_phys(&__syscall_stub_start), &offset); + fd = phys_mapping(to_phys(__syscall_stub_start), &offset); addr = mmap64((void *) STUB_CODE, UM_KERN_PAGE_SIZE, PROT_EXEC, MAP_FIXED | MAP_PRIVATE, fd, offset); if (addr == MAP_FAILED) { @@ -245,7 +245,7 @@ static int userspace_tramp(void *stack) unsigned long v = STUB_CODE + (unsigned long) stub_segv_handler - - (unsigned long) &__syscall_stub_start; + (unsigned long) __syscall_stub_start; set_sigstack((void *) STUB_DATA, UM_KERN_PAGE_SIZE); sigemptyset(&sa.sa_mask); @@ -474,7 +474,7 @@ static int __init init_thread_regs(void) /* Set parent's instruction pointer to start of clone-stub */ thread_regs[REGS_IP_INDEX] = STUB_CODE + (unsigned long) stub_clone_handler - - (unsigned long) &__syscall_stub_start; + (unsigned long) __syscall_stub_start; thread_regs[REGS_SP_INDEX] = STUB_DATA + UM_KERN_PAGE_SIZE - sizeof(void *); #ifdef __SIGNAL_FRAMESIZE @@ -582,8 +582,7 @@ int map_stub_pages(int fd, unsigned long code, unsigned long data, struct proc_mm_op mmop; int n; unsigned long long code_offset; - int code_fd = phys_mapping(to_phys((void *) &__syscall_stub_start), - &code_offset); + int code_fd = phys_mapping(to_phys(__syscall_stub_start), &code_offset); mmop = ((struct proc_mm_op) { .op = MM_MMAP, .u = -- 2.1.1 |
From: Richard W. <ri...@no...> - 2015-05-31 20:10:28
|
Am 12.10.2014 um 13:02 schrieb Nicolas Iooss: > When declaring __syscall_stub_start, use the same type in UML userspace > code as in arch/um/include/asm/sections.h. > > While at it, also declare batch_syscall_stub as char[]. > > Signed-off-by: Nicolas Iooss <nic...@m4...> > --- > arch/um/os-Linux/skas/mem.c | 6 +++--- > arch/um/os-Linux/skas/process.c | 11 +++++------ > 2 files changed, 8 insertions(+), 9 deletions(-) > > diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c > index 689b18db798f..abb02becca80 100644 > --- a/arch/um/os-Linux/skas/mem.c > +++ b/arch/um/os-Linux/skas/mem.c > @@ -19,7 +19,7 @@ > #include <sysdep/ptrace.h> > #include <sysdep/stub.h> > > -extern unsigned long batch_syscall_stub, __syscall_stub_start; > +extern char batch_syscall_stub[], __syscall_stub_start[]; > > extern void wait_stub_done(int pid); > > @@ -39,8 +39,8 @@ static int __init init_syscall_regs(void) > { > get_safe_registers(syscall_regs, NULL); > syscall_regs[REGS_IP_INDEX] = STUB_CODE + > - ((unsigned long) &batch_syscall_stub - > - (unsigned long) &__syscall_stub_start); > + ((unsigned long) batch_syscall_stub - > + (unsigned long) __syscall_stub_start); > return 0; > } > > diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c > index 908579f2b0ab..fa934d0c8932 100644 > --- a/arch/um/os-Linux/skas/process.c > +++ b/arch/um/os-Linux/skas/process.c > @@ -193,7 +193,7 @@ static void handle_trap(int pid, struct uml_pt_regs *regs, > handle_syscall(regs); > } > > -extern int __syscall_stub_start; > +extern char __syscall_stub_start[]; > > static int userspace_tramp(void *stack) > { > @@ -218,7 +218,7 @@ static int userspace_tramp(void *stack) > */ > int fd; > unsigned long long offset; > - fd = phys_mapping(to_phys(&__syscall_stub_start), &offset); > + fd = phys_mapping(to_phys(__syscall_stub_start), &offset); > addr = mmap64((void *) STUB_CODE, UM_KERN_PAGE_SIZE, > PROT_EXEC, MAP_FIXED | MAP_PRIVATE, fd, offset); > if (addr == MAP_FAILED) { > @@ -245,7 +245,7 @@ static int userspace_tramp(void *stack) > > unsigned long v = STUB_CODE + > (unsigned long) stub_segv_handler - > - (unsigned long) &__syscall_stub_start; > + (unsigned long) __syscall_stub_start; > > set_sigstack((void *) STUB_DATA, UM_KERN_PAGE_SIZE); > sigemptyset(&sa.sa_mask); > @@ -474,7 +474,7 @@ static int __init init_thread_regs(void) > /* Set parent's instruction pointer to start of clone-stub */ > thread_regs[REGS_IP_INDEX] = STUB_CODE + > (unsigned long) stub_clone_handler - > - (unsigned long) &__syscall_stub_start; > + (unsigned long) __syscall_stub_start; > thread_regs[REGS_SP_INDEX] = STUB_DATA + UM_KERN_PAGE_SIZE - > sizeof(void *); > #ifdef __SIGNAL_FRAMESIZE > @@ -582,8 +582,7 @@ int map_stub_pages(int fd, unsigned long code, unsigned long data, > struct proc_mm_op mmop; > int n; > unsigned long long code_offset; > - int code_fd = phys_mapping(to_phys((void *) &__syscall_stub_start), > - &code_offset); > + int code_fd = phys_mapping(to_phys(__syscall_stub_start), &code_offset); > > mmop = ((struct proc_mm_op) { .op = MM_MMAP, > .u = Thank you Nicoals, all three patches are now in my 4.2 queue! Special thanks to Thomas Meyer for exhuming this patches. :-) Thanks, //richard |