aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/kernel
diff options
context:
space:
mode:
authorJeff Dike <jdike@addtoit.com>2007-10-16 04:27:33 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-10-16 12:43:09 -0400
commit54ae36f24b103e521dd683f66fe72b0584ccb7e2 (patch)
tree1504968363c0935479ebd28e710562d8046dd884 /arch/um/kernel
parent605c1e57690fddbd11347ec6788ff77c527994dd (diff)
uml: fix stub address calculations
The calculation of CONFIG_STUB_CODE and CONFIG_STUB_DATA didn't take into account anything but 3G/1G and 2G/2G, leaving the other vmsplits out in the cold. I'd rather not duplicate the four known host vmsplit cases for each of these symbols. I'd also like to calculate them based on the highest userspace address. The Kconfig language seems not to allow calculation of hex constants, so I moved this to as-layout.h. CONFIG_STUB_CODE, CONFIG_STUB_DATA, and CONFIG_STUB_START are now gone. In their place are STUB_CODE, STUB_DATA, and STUB_START in as-layout.h. i386 and x86_64 seem to differ as to whether an unadorned constant is an int or a long, so I cast them to unsigned long so they can be printed consistently. However, they are also used in stub.S, where C types don't work so well. So, there are ASM_ versions of these constants for use in stub.S. I also ifdef-ed the non-asm-friendly portion of as-layout.h. With this in place, most of the rest of this patch is changing CONFIG_STUB_* to STUB_*, except in stub.S, where they are changed to ASM_STUB_*. defconfig has the old symbols deleted. I also print these addresses out in case there is any problem mapping them on the host. The two stub.S files had some trailing whitespace, so that is cleaned up here. [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: Jeff Dike <jdike@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/um/kernel')
-rw-r--r--arch/um/kernel/exec.c3
-rw-r--r--arch/um/kernel/skas/clone.c6
-rw-r--r--arch/um/kernel/skas/mmu.c5
-rw-r--r--arch/um/kernel/skas/process.c2
-rw-r--r--arch/um/kernel/tlb.c6
-rw-r--r--arch/um/kernel/um_arch.c3
6 files changed, 14 insertions, 11 deletions
diff --git a/arch/um/kernel/exec.c b/arch/um/kernel/exec.c
index 7c77adecd919..8196450451cd 100644
--- a/arch/um/kernel/exec.c
+++ b/arch/um/kernel/exec.c
@@ -11,6 +11,7 @@
11#include "asm/current.h" 11#include "asm/current.h"
12#include "asm/processor.h" 12#include "asm/processor.h"
13#include "asm/uaccess.h" 13#include "asm/uaccess.h"
14#include "as-layout.h"
14#include "mem_user.h" 15#include "mem_user.h"
15#include "skas.h" 16#include "skas.h"
16#include "os.h" 17#include "os.h"
@@ -18,7 +19,7 @@
18void flush_thread(void) 19void flush_thread(void)
19{ 20{
20 void *data = NULL; 21 void *data = NULL;
21 unsigned long end = proc_mm ? task_size : CONFIG_STUB_START; 22 unsigned long end = proc_mm ? task_size : STUB_START;
22 int ret; 23 int ret;
23 24
24 arch_flush_thread(&current->thread.arch); 25 arch_flush_thread(&current->thread.arch);
diff --git a/arch/um/kernel/skas/clone.c b/arch/um/kernel/skas/clone.c
index 47b812b3bca8..d119f4f7d897 100644
--- a/arch/um/kernel/skas/clone.c
+++ b/arch/um/kernel/skas/clone.c
@@ -4,6 +4,7 @@
4#include <sys/time.h> 4#include <sys/time.h>
5#include <asm/unistd.h> 5#include <asm/unistd.h>
6#include <asm/page.h> 6#include <asm/page.h>
7#include "as-layout.h"
7#include "ptrace_user.h" 8#include "ptrace_user.h"
8#include "skas.h" 9#include "skas.h"
9#include "stub-data.h" 10#include "stub-data.h"
@@ -21,12 +22,11 @@
21void __attribute__ ((__section__ (".__syscall_stub"))) 22void __attribute__ ((__section__ (".__syscall_stub")))
22stub_clone_handler(void) 23stub_clone_handler(void)
23{ 24{
24 struct stub_data *data = (struct stub_data *) UML_CONFIG_STUB_DATA; 25 struct stub_data *data = (struct stub_data *) STUB_DATA;
25 long err; 26 long err;
26 27
27 err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD, 28 err = stub_syscall2(__NR_clone, CLONE_PARENT | CLONE_FILES | SIGCHLD,
28 UML_CONFIG_STUB_DATA + UM_KERN_PAGE_SIZE / 2 - 29 STUB_DATA + UM_KERN_PAGE_SIZE / 2 - sizeof(void *));
29 sizeof(void *));
30 if(err != 0) 30 if(err != 0)
31 goto out; 31 goto out;
32 32
diff --git a/arch/um/kernel/skas/mmu.c b/arch/um/kernel/skas/mmu.c
index ae79888cf520..f859ec306cd5 100644
--- a/arch/um/kernel/skas/mmu.c
+++ b/arch/um/kernel/skas/mmu.c
@@ -7,6 +7,7 @@
7#include "linux/sched.h" 7#include "linux/sched.h"
8#include "asm/pgalloc.h" 8#include "asm/pgalloc.h"
9#include "asm/pgtable.h" 9#include "asm/pgtable.h"
10#include "as-layout.h"
10#include "os.h" 11#include "os.h"
11#include "skas.h" 12#include "skas.h"
12 13
@@ -83,12 +84,12 @@ int init_new_context(struct task_struct *task, struct mm_struct *mm)
83 */ 84 */
84 mm->pgd[USER_PTRS_PER_PGD] = __pgd(0); 85 mm->pgd[USER_PTRS_PER_PGD] = __pgd(0);
85 86
86 ret = init_stub_pte(mm, CONFIG_STUB_CODE, 87 ret = init_stub_pte(mm, STUB_CODE,
87 (unsigned long) &__syscall_stub_start); 88 (unsigned long) &__syscall_stub_start);
88 if (ret) 89 if (ret)
89 goto out_free; 90 goto out_free;
90 91
91 ret = init_stub_pte(mm, CONFIG_STUB_DATA, stack); 92 ret = init_stub_pte(mm, STUB_DATA, stack);
92 if (ret) 93 if (ret)
93 goto out_free; 94 goto out_free;
94 95
diff --git a/arch/um/kernel/skas/process.c b/arch/um/kernel/skas/process.c
index 0297e63f9725..fce389c2342f 100644
--- a/arch/um/kernel/skas/process.c
+++ b/arch/um/kernel/skas/process.c
@@ -18,7 +18,7 @@ int new_mm(unsigned long stack)
18 return fd; 18 return fd;
19 19
20 if (skas_needs_stub) 20 if (skas_needs_stub)
21 map_stub_pages(fd, CONFIG_STUB_CODE, CONFIG_STUB_DATA, stack); 21 map_stub_pages(fd, STUB_CODE, STUB_DATA, stack);
22 22
23 return fd; 23 return fd;
24} 24}
diff --git a/arch/um/kernel/tlb.c b/arch/um/kernel/tlb.c
index 942f20ea888a..f4a0e407eee4 100644
--- a/arch/um/kernel/tlb.c
+++ b/arch/um/kernel/tlb.c
@@ -485,8 +485,8 @@ void __flush_tlb_one(unsigned long addr)
485static void fix_range(struct mm_struct *mm, unsigned long start_addr, 485static void fix_range(struct mm_struct *mm, unsigned long start_addr,
486 unsigned long end_addr, int force) 486 unsigned long end_addr, int force)
487{ 487{
488 if (!proc_mm && (end_addr > CONFIG_STUB_START)) 488 if (!proc_mm && (end_addr > STUB_START))
489 end_addr = CONFIG_STUB_START; 489 end_addr = STUB_START;
490 490
491 fix_range_common(mm, start_addr, end_addr, force); 491 fix_range_common(mm, start_addr, end_addr, force);
492} 492}
@@ -510,7 +510,7 @@ void flush_tlb_mm(struct mm_struct *mm)
510 if (atomic_read(&mm->mm_users) == 0) 510 if (atomic_read(&mm->mm_users) == 0)
511 return; 511 return;
512 512
513 end = proc_mm ? task_size : CONFIG_STUB_START; 513 end = proc_mm ? task_size : STUB_START;
514 fix_range(mm, 0, end, 0); 514 fix_range(mm, 0, end, 0);
515} 515}
516 516
diff --git a/arch/um/kernel/um_arch.c b/arch/um/kernel/um_arch.c
index 1993e5e12256..f1c71393f578 100644
--- a/arch/um/kernel/um_arch.c
+++ b/arch/um/kernel/um_arch.c
@@ -242,7 +242,8 @@ static unsigned long set_task_sizes_skas(unsigned long *task_size_out)
242 242
243 if (!skas_needs_stub) 243 if (!skas_needs_stub)
244 *task_size_out = host_task_size; 244 *task_size_out = host_task_size;
245 else *task_size_out = CONFIG_STUB_START & PGDIR_MASK; 245 else
246 *task_size_out = STUB_START & PGDIR_MASK;
246 247
247 return host_task_size; 248 return host_task_size;
248} 249}