Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 23bbd586 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds
Browse files

[PATCH] uml: fix static binary segfault



When UML is built as a static binary, it segfaults when run.  The reason is
that a memory hole that is present in dynamic binaries isn't there in static
binaries, and it contains essential stuff.

This fix removes the code which maps some anonymous memory into that hole and
cleans up some related code.

Signed-off-by: default avatarJeff Dike <jdike@addtoit.com>
Cc: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 8633c233
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -29,8 +29,7 @@ extern void flush_tlb_mm_skas(struct mm_struct *mm);
extern void force_flush_all_skas(void);
extern long execute_syscall_skas(void *r);
extern void before_mem_skas(unsigned long unused);
extern unsigned long set_task_sizes_skas(unsigned long *host_size_out,
					 unsigned long *task_size_out);
extern unsigned long set_task_sizes_skas(unsigned long *task_size_out);
extern int start_uml_skas(void);
extern int external_pid_skas(struct task_struct *task);
extern int thread_pid_skas(struct task_struct *task);
+1 −2
Original line number Diff line number Diff line
@@ -30,8 +30,7 @@ extern void flush_tlb_mm_tt(struct mm_struct *mm);
extern void force_flush_all_tt(void);
extern long execute_syscall_tt(void *r);
extern void before_mem_tt(unsigned long brk_start);
extern unsigned long set_task_sizes_tt(unsigned long *host_size_out,
				       unsigned long *task_size_out);
extern unsigned long set_task_sizes_tt(unsigned long *task_size_out);
extern int start_uml_tt(void);
extern int external_pid_tt(struct task_struct *task);
extern int thread_pid_tt(struct task_struct *task);
+0 −11
Original line number Diff line number Diff line
@@ -24,8 +24,6 @@
#include "init.h"
#include "kern_constants.h"

extern char __binary_start;

/* Changed during early boot */
unsigned long *empty_zero_page = NULL;
unsigned long *empty_bad_page = NULL;
@@ -65,8 +63,6 @@ static void setup_highmem(unsigned long highmem_start,

void mem_init(void)
{
	unsigned long start;

	max_low_pfn = (high_physmem - uml_physmem) >> PAGE_SHIFT;

        /* clear the zero-page */
@@ -81,13 +77,6 @@ void mem_init(void)
	free_bootmem(__pa(brk_end), uml_reserved - brk_end);
	uml_reserved = brk_end;

	/* Fill in any hole at the start of the binary */
	start = (unsigned long) &__binary_start & PAGE_MASK;
	if(uml_physmem != start){
		map_memory(uml_physmem, __pa(uml_physmem), start - uml_physmem,
			   1, 1, 0);
	}

	/* this will put all low memory onto the freelists */
	totalram_pages = free_all_bootmem();
	totalhigh_pages = highmem >> PAGE_SHIFT;
+1 −1
Original line number Diff line number Diff line
@@ -317,7 +317,7 @@ void map_memory(unsigned long virt, unsigned long phys, unsigned long len,
	}
}

extern int __syscall_stub_start, __binary_start;
extern int __syscall_stub_start;

void setup_physmem(unsigned long start, unsigned long reserve_end,
		   unsigned long len, unsigned long long highmem)
+5 −6
Original line number Diff line number Diff line
@@ -9,20 +9,19 @@
#include "mem_user.h"
#include "skas.h"

unsigned long set_task_sizes_skas(unsigned long *host_size_out,
				  unsigned long *task_size_out)
unsigned long set_task_sizes_skas(unsigned long *task_size_out)
{
	/* Round up to the nearest 4M */
	unsigned long top = ROUND_4M((unsigned long) &host_size_out);
	unsigned long host_task_size = ROUND_4M((unsigned long)
						&host_task_size);

#ifdef CONFIG_HOST_TASK_SIZE
	*host_size_out = ROUND_4M(CONFIG_HOST_TASK_SIZE);
	*task_size_out = CONFIG_HOST_TASK_SIZE;
#else
	*host_size_out = top;
	if (!skas_needs_stub)
		*task_size_out = top;
		*task_size_out = host_task_size;
	else *task_size_out = CONFIG_STUB_START & PGDIR_MASK;
#endif
	return ((unsigned long) set_task_sizes_skas) & ~0xffffff;
	return host_task_size;
}
Loading