aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--arch/um/Kconfig.i38614
-rw-r--r--arch/um/Kconfig.x86_6414
-rw-r--r--arch/um/defconfig3
-rw-r--r--arch/um/include/as-layout.h24
-rw-r--r--arch/um/include/sysdep-i386/stub.h11
-rw-r--r--arch/um/include/sysdep-x86_64/stub.h13
-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
-rw-r--r--arch/um/os-Linux/skas/mem.c8
-rw-r--r--arch/um/os-Linux/skas/process.c21
-rw-r--r--arch/um/sys-i386/stub.S9
-rw-r--r--arch/um/sys-i386/stub_segv.c4
-rw-r--r--arch/um/sys-x86_64/stub.S9
-rw-r--r--arch/um/sys-x86_64/stub_segv.c3
18 files changed, 81 insertions, 77 deletions
diff --git a/arch/um/Kconfig.i386 b/arch/um/Kconfig.i386
index d6cffb27fff8..9876d80d85dd 100644
--- a/arch/um/Kconfig.i386
+++ b/arch/um/Kconfig.i386
@@ -65,20 +65,6 @@ config 3_LEVEL_PGTABLES
65 However, this it experimental on 32-bit architectures, so if unsure say 65 However, this it experimental on 32-bit architectures, so if unsure say
66 N (on x86-64 it's automatically enabled, instead, as it's safe there). 66 N (on x86-64 it's automatically enabled, instead, as it's safe there).
67 67
68config STUB_CODE
69 hex
70 default 0xbfffe000 if !HOST_VMSPLIT_2G
71 default 0x7fffe000 if HOST_VMSPLIT_2G
72
73config STUB_DATA
74 hex
75 default 0xbffff000 if !HOST_VMSPLIT_2G
76 default 0x7ffff000 if HOST_VMSPLIT_2G
77
78config STUB_START
79 hex
80 default STUB_CODE
81
82config ARCH_HAS_SC_SIGNALS 68config ARCH_HAS_SC_SIGNALS
83 bool 69 bool
84 default y 70 default y
diff --git a/arch/um/Kconfig.x86_64 b/arch/um/Kconfig.x86_64
index f60e9e506424..d632e9a89cc3 100644
--- a/arch/um/Kconfig.x86_64
+++ b/arch/um/Kconfig.x86_64
@@ -17,24 +17,12 @@ config SEMAPHORE_SLEEPERS
17 17
18config TOP_ADDR 18config TOP_ADDR
19 hex 19 hex
20 default 0x80000000 20 default 0x7fc0000000
21 21
22config 3_LEVEL_PGTABLES 22config 3_LEVEL_PGTABLES
23 bool 23 bool
24 default y 24 default y
25 25
26config STUB_CODE
27 hex
28 default 0x7fbfffe000
29
30config STUB_DATA
31 hex
32 default 0x7fbffff000
33
34config STUB_START
35 hex
36 default STUB_CODE
37
38config ARCH_HAS_SC_SIGNALS 26config ARCH_HAS_SC_SIGNALS
39 bool 27 bool
40 default n 28 default n
diff --git a/arch/um/defconfig b/arch/um/defconfig
index 1cbbe980f106..f609edede065 100644
--- a/arch/um/defconfig
+++ b/arch/um/defconfig
@@ -59,9 +59,6 @@ CONFIG_SEMAPHORE_SLEEPERS=y
59# CONFIG_HOST_2G_2G is not set 59# CONFIG_HOST_2G_2G is not set
60CONFIG_TOP_ADDR=0xc0000000 60CONFIG_TOP_ADDR=0xc0000000
61# CONFIG_3_LEVEL_PGTABLES is not set 61# CONFIG_3_LEVEL_PGTABLES is not set
62CONFIG_STUB_CODE=0xbfffe000
63CONFIG_STUB_DATA=0xbffff000
64CONFIG_STUB_START=0xbfffe000
65CONFIG_ARCH_HAS_SC_SIGNALS=y 62CONFIG_ARCH_HAS_SC_SIGNALS=y
66CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y 63CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y
67CONFIG_GENERIC_HWEIGHT=y 64CONFIG_GENERIC_HWEIGHT=y
diff --git a/arch/um/include/as-layout.h b/arch/um/include/as-layout.h
index 2f16a1c7d616..a5cdf953e04a 100644
--- a/arch/um/include/as-layout.h
+++ b/arch/um/include/as-layout.h
@@ -6,6 +6,28 @@
6#ifndef __START_H__ 6#ifndef __START_H__
7#define __START_H__ 7#define __START_H__
8 8
9#include "uml-config.h"
10#include "kern_constants.h"
11
12/*
13 * Assembly doesn't want any casting, but C does, so define these
14 * without casts here, and define new symbols with casts inside the C
15 * section.
16 */
17#define ASM_STUB_CODE (UML_CONFIG_TOP_ADDR - 2 * UM_KERN_PAGE_SIZE)
18#define ASM_STUB_DATA (UML_CONFIG_TOP_ADDR - UM_KERN_PAGE_SIZE)
19#define ASM_STUB_START ASM_STUB_CODE
20
21/*
22 * This file is included by the assembly stubs, which just want the
23 * definitions above.
24 */
25#ifndef __ASSEMBLY__
26
27#define STUB_CODE ((unsigned long) ASM_STUB_CODE)
28#define STUB_DATA ((unsigned long) ASM_STUB_DATA)
29#define STUB_START ((unsigned long) ASM_STUB_START)
30
9#include "sysdep/ptrace.h" 31#include "sysdep/ptrace.h"
10 32
11struct cpu_task { 33struct cpu_task {
@@ -32,3 +54,5 @@ extern int linux_main(int argc, char **argv);
32extern void (*sig_info[])(int, struct uml_pt_regs *); 54extern void (*sig_info[])(int, struct uml_pt_regs *);
33 55
34#endif 56#endif
57
58#endif
diff --git a/arch/um/include/sysdep-i386/stub.h b/arch/um/include/sysdep-i386/stub.h
index 19c85f330fc1..8c097b87fca7 100644
--- a/arch/um/include/sysdep-i386/stub.h
+++ b/arch/um/include/sysdep-i386/stub.h
@@ -9,6 +9,7 @@
9#include <sys/mman.h> 9#include <sys/mman.h>
10#include <asm/ptrace.h> 10#include <asm/ptrace.h>
11#include <asm/unistd.h> 11#include <asm/unistd.h>
12#include "as-layout.h"
12#include "stub-data.h" 13#include "stub-data.h"
13#include "kern_constants.h" 14#include "kern_constants.h"
14#include "uml-config.h" 15#include "uml-config.h"
@@ -89,12 +90,12 @@ static inline void remap_stack(int fd, unsigned long offset)
89{ 90{
90 __asm__ volatile ("movl %%eax,%%ebp ; movl %0,%%eax ; int $0x80 ;" 91 __asm__ volatile ("movl %%eax,%%ebp ; movl %0,%%eax ; int $0x80 ;"
91 "movl %7, %%ebx ; movl %%eax, (%%ebx)" 92 "movl %7, %%ebx ; movl %%eax, (%%ebx)"
92 : : "g" (STUB_MMAP_NR), "b" (UML_CONFIG_STUB_DATA), 93 : : "g" (STUB_MMAP_NR), "b" (STUB_DATA),
93 "c" (UM_KERN_PAGE_SIZE), 94 "c" (UM_KERN_PAGE_SIZE),
94 "d" (PROT_READ | PROT_WRITE), 95 "d" (PROT_READ | PROT_WRITE),
95 "S" (MAP_FIXED | MAP_SHARED), "D" (fd), 96 "S" (MAP_FIXED | MAP_SHARED), "D" (fd),
96 "a" (offset), 97 "a" (offset),
97 "i" (&((struct stub_data *) UML_CONFIG_STUB_DATA)->err) 98 "i" (&((struct stub_data *) STUB_DATA)->err)
98 : "memory"); 99 : "memory");
99} 100}
100 101
diff --git a/arch/um/include/sysdep-x86_64/stub.h b/arch/um/include/sysdep-x86_64/stub.h
index 92e989f81761..655f9c2de3ac 100644
--- a/arch/um/include/sysdep-x86_64/stub.h
+++ b/arch/um/include/sysdep-x86_64/stub.h
@@ -9,6 +9,7 @@
9#include <sys/mman.h> 9#include <sys/mman.h>
10#include <asm/unistd.h> 10#include <asm/unistd.h>
11#include <sysdep/ptrace_user.h> 11#include <sysdep/ptrace_user.h>
12#include "as-layout.h"
12#include "stub-data.h" 13#include "stub-data.h"
13#include "kern_constants.h" 14#include "kern_constants.h"
14#include "uml-config.h" 15#include "uml-config.h"
@@ -94,13 +95,13 @@ static inline void remap_stack(long fd, unsigned long offset)
94{ 95{
95 __asm__ volatile ("movq %4,%%r10 ; movq %5,%%r8 ; " 96 __asm__ volatile ("movq %4,%%r10 ; movq %5,%%r8 ; "
96 "movq %6, %%r9; " __syscall "; movq %7, %%rbx ; " 97 "movq %6, %%r9; " __syscall "; movq %7, %%rbx ; "
97 "movq %%rax, (%%rbx)": 98 "movq %%rax, (%%rbx)":
98 : "a" (STUB_MMAP_NR), "D" (UML_CONFIG_STUB_DATA), 99 : "a" (STUB_MMAP_NR), "D" (STUB_DATA),
99 "S" (UM_KERN_PAGE_SIZE), 100 "S" (UM_KERN_PAGE_SIZE),
100 "d" (PROT_READ | PROT_WRITE), 101 "d" (PROT_READ | PROT_WRITE),
101 "g" (MAP_FIXED | MAP_SHARED), "g" (fd), 102 "g" (MAP_FIXED | MAP_SHARED), "g" (fd),
102 "g" (offset), 103 "g" (offset),
103 "i" (&((struct stub_data *) UML_CONFIG_STUB_DATA)->err) 104 "i" (&((struct stub_data *) STUB_DATA)->err)
104 : __syscall_clobber, "r10", "r8", "r9" ); 105 : __syscall_clobber, "r10", "r8", "r9" );
105} 106}
106 107
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}
diff --git a/arch/um/os-Linux/skas/mem.c b/arch/um/os-Linux/skas/mem.c
index d58d11179bb7..484e68f9f7ae 100644
--- a/arch/um/os-Linux/skas/mem.c
+++ b/arch/um/os-Linux/skas/mem.c
@@ -10,6 +10,7 @@
10#include <sys/mman.h> 10#include <sys/mman.h>
11#include "init.h" 11#include "init.h"
12#include "kern_constants.h" 12#include "kern_constants.h"
13#include "as-layout.h"
13#include "mm_id.h" 14#include "mm_id.h"
14#include "os.h" 15#include "os.h"
15#include "proc_mm.h" 16#include "proc_mm.h"
@@ -40,7 +41,7 @@ static unsigned long syscall_regs[MAX_REG_NR];
40static int __init init_syscall_regs(void) 41static int __init init_syscall_regs(void)
41{ 42{
42 get_safe_registers(syscall_regs); 43 get_safe_registers(syscall_regs);
43 syscall_regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + 44 syscall_regs[REGS_IP_INDEX] = STUB_CODE +
44 ((unsigned long) &batch_syscall_stub - 45 ((unsigned long) &batch_syscall_stub -
45 (unsigned long) &__syscall_stub_start); 46 (unsigned long) &__syscall_stub_start);
46 return 0; 47 return 0;
@@ -93,8 +94,7 @@ static inline long do_syscall_stub(struct mm_id * mm_idp, void **addr)
93 ret = *((unsigned long *) mm_idp->stack); 94 ret = *((unsigned long *) mm_idp->stack);
94 offset = *((unsigned long *) mm_idp->stack + 1); 95 offset = *((unsigned long *) mm_idp->stack + 1);
95 if (offset) { 96 if (offset) {
96 data = (unsigned long *)(mm_idp->stack + 97 data = (unsigned long *)(mm_idp->stack + offset - STUB_DATA);
97 offset - UML_CONFIG_STUB_DATA);
98 printk(UM_KERN_ERR "do_syscall_stub : ret = %ld, offset = %ld, " 98 printk(UM_KERN_ERR "do_syscall_stub : ret = %ld, offset = %ld, "
99 "data = %p\n", ret, offset, data); 99 "data = %p\n", ret, offset, data);
100 syscall = (unsigned long *)((unsigned long)data + data[0]); 100 syscall = (unsigned long *)((unsigned long)data + data[0]);
@@ -182,7 +182,7 @@ long syscall_stub_data(struct mm_id * mm_idp,
182 memcpy(stack + 1, data, data_count * sizeof(long)); 182 memcpy(stack + 1, data, data_count * sizeof(long));
183 183
184 *stub_addr = (void *)(((unsigned long)(stack + 1) & 184 *stub_addr = (void *)(((unsigned long)(stack + 1) &
185 ~UM_KERN_PAGE_MASK) + UML_CONFIG_STUB_DATA); 185 ~UM_KERN_PAGE_MASK) + STUB_DATA);
186 186
187 return 0; 187 return 0;
188} 188}
diff --git a/arch/um/os-Linux/skas/process.c b/arch/um/os-Linux/skas/process.c
index 8548f126d628..e60d6e6c5a58 100644
--- a/arch/um/os-Linux/skas/process.c
+++ b/arch/um/os-Linux/skas/process.c
@@ -191,22 +191,23 @@ static int userspace_tramp(void *stack)
191 int fd; 191 int fd;
192 unsigned long long offset; 192 unsigned long long offset;
193 fd = phys_mapping(to_phys(&__syscall_stub_start), &offset); 193 fd = phys_mapping(to_phys(&__syscall_stub_start), &offset);
194 addr = mmap64((void *) UML_CONFIG_STUB_CODE, UM_KERN_PAGE_SIZE, 194 addr = mmap64((void *) STUB_CODE, UM_KERN_PAGE_SIZE,
195 PROT_EXEC, MAP_FIXED | MAP_PRIVATE, fd, offset); 195 PROT_EXEC, MAP_FIXED | MAP_PRIVATE, fd, offset);
196 if (addr == MAP_FAILED) { 196 if (addr == MAP_FAILED) {
197 printk(UM_KERN_ERR "mapping mmap stub failed, " 197 printk(UM_KERN_ERR "mapping mmap stub at 0x%lx failed, "
198 "errno = %d\n", errno); 198 "errno = %d\n", STUB_CODE, errno);
199 exit(1); 199 exit(1);
200 } 200 }
201 201
202 if (stack != NULL) { 202 if (stack != NULL) {
203 fd = phys_mapping(to_phys(stack), &offset); 203 fd = phys_mapping(to_phys(stack), &offset);
204 addr = mmap((void *) UML_CONFIG_STUB_DATA, 204 addr = mmap((void *) STUB_DATA,
205 UM_KERN_PAGE_SIZE, PROT_READ | PROT_WRITE, 205 UM_KERN_PAGE_SIZE, PROT_READ | PROT_WRITE,
206 MAP_FIXED | MAP_SHARED, fd, offset); 206 MAP_FIXED | MAP_SHARED, fd, offset);
207 if (addr == MAP_FAILED) { 207 if (addr == MAP_FAILED) {
208 printk(UM_KERN_ERR "mapping segfault stack " 208 printk(UM_KERN_ERR "mapping segfault stack "
209 "failed, errno = %d\n", errno); 209 "at 0x%lx failed, errno = %d\n",
210 STUB_DATA, errno);
210 exit(1); 211 exit(1);
211 } 212 }
212 } 213 }
@@ -214,11 +215,11 @@ static int userspace_tramp(void *stack)
214 if (!ptrace_faultinfo && (stack != NULL)) { 215 if (!ptrace_faultinfo && (stack != NULL)) {
215 struct sigaction sa; 216 struct sigaction sa;
216 217
217 unsigned long v = UML_CONFIG_STUB_CODE + 218 unsigned long v = STUB_CODE +
218 (unsigned long) stub_segv_handler - 219 (unsigned long) stub_segv_handler -
219 (unsigned long) &__syscall_stub_start; 220 (unsigned long) &__syscall_stub_start;
220 221
221 set_sigstack((void *) UML_CONFIG_STUB_DATA, UM_KERN_PAGE_SIZE); 222 set_sigstack((void *) STUB_DATA, UM_KERN_PAGE_SIZE);
222 sigemptyset(&sa.sa_mask); 223 sigemptyset(&sa.sa_mask);
223 sigaddset(&sa.sa_mask, SIGIO); 224 sigaddset(&sa.sa_mask, SIGIO);
224 sigaddset(&sa.sa_mask, SIGWINCH); 225 sigaddset(&sa.sa_mask, SIGWINCH);
@@ -382,10 +383,10 @@ static int __init init_thread_regs(void)
382{ 383{
383 get_safe_registers(thread_regs); 384 get_safe_registers(thread_regs);
384 /* Set parent's instruction pointer to start of clone-stub */ 385 /* Set parent's instruction pointer to start of clone-stub */
385 thread_regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + 386 thread_regs[REGS_IP_INDEX] = STUB_CODE +
386 (unsigned long) stub_clone_handler - 387 (unsigned long) stub_clone_handler -
387 (unsigned long) &__syscall_stub_start; 388 (unsigned long) &__syscall_stub_start;
388 thread_regs[REGS_SP_INDEX] = UML_CONFIG_STUB_DATA + UM_KERN_PAGE_SIZE - 389 thread_regs[REGS_SP_INDEX] = STUB_DATA + UM_KERN_PAGE_SIZE -
389 sizeof(void *); 390 sizeof(void *);
390#ifdef __SIGNAL_FRAMESIZE 391#ifdef __SIGNAL_FRAMESIZE
391 thread_regs[REGS_SP_INDEX] -= __SIGNAL_FRAMESIZE; 392 thread_regs[REGS_SP_INDEX] -= __SIGNAL_FRAMESIZE;
@@ -443,7 +444,7 @@ int copy_context_skas0(unsigned long new_stack, int pid)
443 * child's stack and check it. 444 * child's stack and check it.
444 */ 445 */
445 wait_stub_done(pid); 446 wait_stub_done(pid);
446 if (child_data->err != UML_CONFIG_STUB_DATA) 447 if (child_data->err != STUB_DATA)
447 panic("copy_context_skas0 - stub-child reports error %ld\n", 448 panic("copy_context_skas0 - stub-child reports error %ld\n",
448 child_data->err); 449 child_data->err);
449 450
diff --git a/arch/um/sys-i386/stub.S b/arch/um/sys-i386/stub.S
index 6a70d9ab5c29..e730772c401b 100644
--- a/arch/um/sys-i386/stub.S
+++ b/arch/um/sys-i386/stub.S
@@ -1,4 +1,5 @@
1#include "uml-config.h" 1#include "uml-config.h"
2#include "as-layout.h"
2 3
3 .globl syscall_stub 4 .globl syscall_stub
4.section .__syscall_stub, "x" 5.section .__syscall_stub, "x"
@@ -6,7 +7,7 @@
6 .globl batch_syscall_stub 7 .globl batch_syscall_stub
7batch_syscall_stub: 8batch_syscall_stub:
8 /* load pointer to first operation */ 9 /* load pointer to first operation */
9 mov $(UML_CONFIG_STUB_DATA+8), %esp 10 mov $(ASM_STUB_DATA+8), %esp
10 11
11again: 12again:
12 /* load length of additional data */ 13 /* load length of additional data */
@@ -14,12 +15,12 @@ again:
14 15
15 /* if(length == 0) : end of list */ 16 /* if(length == 0) : end of list */
16 /* write possible 0 to header */ 17 /* write possible 0 to header */
17 mov %eax, UML_CONFIG_STUB_DATA+4 18 mov %eax, ASM_STUB_DATA+4
18 cmpl $0, %eax 19 cmpl $0, %eax
19 jz done 20 jz done
20 21
21 /* save current pointer */ 22 /* save current pointer */
22 mov %esp, UML_CONFIG_STUB_DATA+4 23 mov %esp, ASM_STUB_DATA+4
23 24
24 /* skip additional data */ 25 /* skip additional data */
25 add %eax, %esp 26 add %eax, %esp
@@ -45,7 +46,7 @@ again:
45 46
46done: 47done:
47 /* save return value */ 48 /* save return value */
48 mov %eax, UML_CONFIG_STUB_DATA 49 mov %eax, ASM_STUB_DATA
49 50
50 /* stop */ 51 /* stop */
51 int3 52 int3
diff --git a/arch/um/sys-i386/stub_segv.c b/arch/um/sys-i386/stub_segv.c
index 2355dc19c46c..b3999cb76bfd 100644
--- a/arch/um/sys-i386/stub_segv.c
+++ b/arch/um/sys-i386/stub_segv.c
@@ -6,6 +6,7 @@
6#include <signal.h> 6#include <signal.h>
7#include <sys/select.h> /* The only way I can see to get sigset_t */ 7#include <sys/select.h> /* The only way I can see to get sigset_t */
8#include <asm/unistd.h> 8#include <asm/unistd.h>
9#include "as-layout.h"
9#include "uml-config.h" 10#include "uml-config.h"
10#include "sysdep/stub.h" 11#include "sysdep/stub.h"
11#include "sysdep/sigcontext.h" 12#include "sysdep/sigcontext.h"
@@ -17,8 +18,7 @@ stub_segv_handler(int sig)
17 struct sigcontext *sc = (struct sigcontext *) (&sig + 1); 18 struct sigcontext *sc = (struct sigcontext *) (&sig + 1);
18 int pid; 19 int pid;
19 20
20 GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA), 21 GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA), sc);
21 sc);
22 22
23 pid = stub_syscall0(__NR_getpid); 23 pid = stub_syscall0(__NR_getpid);
24 stub_syscall2(__NR_kill, pid, SIGUSR1); 24 stub_syscall2(__NR_kill, pid, SIGUSR1);
diff --git a/arch/um/sys-x86_64/stub.S b/arch/um/sys-x86_64/stub.S
index 03c279735784..4afe204a6af7 100644
--- a/arch/um/sys-x86_64/stub.S
+++ b/arch/um/sys-x86_64/stub.S
@@ -1,4 +1,5 @@
1#include "uml-config.h" 1#include "uml-config.h"
2#include "as-layout.h"
2 3
3 .globl syscall_stub 4 .globl syscall_stub
4.section .__syscall_stub, "x" 5.section .__syscall_stub, "x"
@@ -7,18 +8,18 @@ syscall_stub:
7 /* We don't have 64-bit constants, so this constructs the address 8 /* We don't have 64-bit constants, so this constructs the address
8 * we need. 9 * we need.
9 */ 10 */
10 movq $(UML_CONFIG_STUB_DATA >> 32), %rbx 11 movq $(ASM_STUB_DATA >> 32), %rbx
11 salq $32, %rbx 12 salq $32, %rbx
12 movq $(UML_CONFIG_STUB_DATA & 0xffffffff), %rcx 13 movq $(ASM_STUB_DATA & 0xffffffff), %rcx
13 or %rcx, %rbx 14 or %rcx, %rbx
14 movq %rax, (%rbx) 15 movq %rax, (%rbx)
15 int3 16 int3
16 17
17 .globl batch_syscall_stub 18 .globl batch_syscall_stub
18batch_syscall_stub: 19batch_syscall_stub:
19 mov $(UML_CONFIG_STUB_DATA >> 32), %rbx 20 mov $(ASM_STUB_DATA >> 32), %rbx
20 sal $32, %rbx 21 sal $32, %rbx
21 mov $(UML_CONFIG_STUB_DATA & 0xffffffff), %rax 22 mov $(ASM_STUB_DATA & 0xffffffff), %rax
22 or %rax, %rbx 23 or %rax, %rbx
23 /* load pointer to first operation */ 24 /* load pointer to first operation */
24 mov %rbx, %rsp 25 mov %rbx, %rsp
diff --git a/arch/um/sys-x86_64/stub_segv.c b/arch/um/sys-x86_64/stub_segv.c
index 652fa34c2cd3..3afb590f0072 100644
--- a/arch/um/sys-x86_64/stub_segv.c
+++ b/arch/um/sys-x86_64/stub_segv.c
@@ -6,6 +6,7 @@
6#include <stddef.h> 6#include <stddef.h>
7#include <signal.h> 7#include <signal.h>
8#include <asm/unistd.h> 8#include <asm/unistd.h>
9#include "as-layout.h"
9#include "uml-config.h" 10#include "uml-config.h"
10#include "sysdep/sigcontext.h" 11#include "sysdep/sigcontext.h"
11#include "sysdep/faultinfo.h" 12#include "sysdep/faultinfo.h"
@@ -33,7 +34,7 @@ stub_segv_handler(int sig)
33 int pid; 34 int pid;
34 35
35 __asm__ __volatile__("movq %%rdx, %0" : "=g" (uc) :); 36 __asm__ __volatile__("movq %%rdx, %0" : "=g" (uc) :);
36 GET_FAULTINFO_FROM_SC(*((struct faultinfo *) UML_CONFIG_STUB_DATA), 37 GET_FAULTINFO_FROM_SC(*((struct faultinfo *) STUB_DATA),
37 &uc->uc_mcontext); 38 &uc->uc_mcontext);
38 39
39 pid = stub_syscall0(__NR_getpid); 40 pid = stub_syscall0(__NR_getpid);