diff options
author | Jeff Dike <jdike@addtoit.com> | 2007-10-16 04:27:33 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-16 12:43:09 -0400 |
commit | 54ae36f24b103e521dd683f66fe72b0584ccb7e2 (patch) | |
tree | 1504968363c0935479ebd28e710562d8046dd884 /arch | |
parent | 605c1e57690fddbd11347ec6788ff77c527994dd (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')
-rw-r--r-- | arch/um/Kconfig.i386 | 14 | ||||
-rw-r--r-- | arch/um/Kconfig.x86_64 | 14 | ||||
-rw-r--r-- | arch/um/defconfig | 3 | ||||
-rw-r--r-- | arch/um/include/as-layout.h | 24 | ||||
-rw-r--r-- | arch/um/include/sysdep-i386/stub.h | 11 | ||||
-rw-r--r-- | arch/um/include/sysdep-x86_64/stub.h | 13 | ||||
-rw-r--r-- | arch/um/kernel/exec.c | 3 | ||||
-rw-r--r-- | arch/um/kernel/skas/clone.c | 6 | ||||
-rw-r--r-- | arch/um/kernel/skas/mmu.c | 5 | ||||
-rw-r--r-- | arch/um/kernel/skas/process.c | 2 | ||||
-rw-r--r-- | arch/um/kernel/tlb.c | 6 | ||||
-rw-r--r-- | arch/um/kernel/um_arch.c | 3 | ||||
-rw-r--r-- | arch/um/os-Linux/skas/mem.c | 8 | ||||
-rw-r--r-- | arch/um/os-Linux/skas/process.c | 21 | ||||
-rw-r--r-- | arch/um/sys-i386/stub.S | 9 | ||||
-rw-r--r-- | arch/um/sys-i386/stub_segv.c | 4 | ||||
-rw-r--r-- | arch/um/sys-x86_64/stub.S | 9 | ||||
-rw-r--r-- | arch/um/sys-x86_64/stub_segv.c | 3 |
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 | ||
68 | config STUB_CODE | ||
69 | hex | ||
70 | default 0xbfffe000 if !HOST_VMSPLIT_2G | ||
71 | default 0x7fffe000 if HOST_VMSPLIT_2G | ||
72 | |||
73 | config STUB_DATA | ||
74 | hex | ||
75 | default 0xbffff000 if !HOST_VMSPLIT_2G | ||
76 | default 0x7ffff000 if HOST_VMSPLIT_2G | ||
77 | |||
78 | config STUB_START | ||
79 | hex | ||
80 | default STUB_CODE | ||
81 | |||
82 | config ARCH_HAS_SC_SIGNALS | 68 | config 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 | ||
18 | config TOP_ADDR | 18 | config TOP_ADDR |
19 | hex | 19 | hex |
20 | default 0x80000000 | 20 | default 0x7fc0000000 |
21 | 21 | ||
22 | config 3_LEVEL_PGTABLES | 22 | config 3_LEVEL_PGTABLES |
23 | bool | 23 | bool |
24 | default y | 24 | default y |
25 | 25 | ||
26 | config STUB_CODE | ||
27 | hex | ||
28 | default 0x7fbfffe000 | ||
29 | |||
30 | config STUB_DATA | ||
31 | hex | ||
32 | default 0x7fbffff000 | ||
33 | |||
34 | config STUB_START | ||
35 | hex | ||
36 | default STUB_CODE | ||
37 | |||
38 | config ARCH_HAS_SC_SIGNALS | 26 | config 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 |
60 | CONFIG_TOP_ADDR=0xc0000000 | 60 | CONFIG_TOP_ADDR=0xc0000000 |
61 | # CONFIG_3_LEVEL_PGTABLES is not set | 61 | # CONFIG_3_LEVEL_PGTABLES is not set |
62 | CONFIG_STUB_CODE=0xbfffe000 | ||
63 | CONFIG_STUB_DATA=0xbffff000 | ||
64 | CONFIG_STUB_START=0xbfffe000 | ||
65 | CONFIG_ARCH_HAS_SC_SIGNALS=y | 62 | CONFIG_ARCH_HAS_SC_SIGNALS=y |
66 | CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y | 63 | CONFIG_ARCH_REUSE_HOST_VSYSCALL_AREA=y |
67 | CONFIG_GENERIC_HWEIGHT=y | 64 | CONFIG_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 | ||
11 | struct cpu_task { | 33 | struct cpu_task { |
@@ -32,3 +54,5 @@ extern int linux_main(int argc, char **argv); | |||
32 | extern void (*sig_info[])(int, struct uml_pt_regs *); | 54 | extern 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 @@ | |||
18 | void flush_thread(void) | 19 | void 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(¤t->thread.arch); | 25 | arch_flush_thread(¤t->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 @@ | |||
21 | void __attribute__ ((__section__ (".__syscall_stub"))) | 22 | void __attribute__ ((__section__ (".__syscall_stub"))) |
22 | stub_clone_handler(void) | 23 | stub_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) | |||
485 | static void fix_range(struct mm_struct *mm, unsigned long start_addr, | 485 | static 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]; | |||
40 | static int __init init_syscall_regs(void) | 41 | static 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 |
7 | batch_syscall_stub: | 8 | batch_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 | ||
11 | again: | 12 | again: |
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 | ||
46 | done: | 47 | done: |
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 |
18 | batch_syscall_stub: | 19 | batch_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); |