提交 c539ab73 编写于 作者: J Jeff Dike 提交者: Linus Torvalds

uml: remove PAGE_SIZE from libc code

Distros seem to be removing PAGE_SIZE from asm/page.h.  So, the libc side of
UML should stop using it.

I replace it with UM_KERN_PAGE_SIZE, which is defined to be the same as
PAGE_SIZE on the kernel side of the house.  I could also use getpagesize(),
but it's more important that UML have the same value of PAGE_SIZE everywhere.
It's conceivable that it could be built with a larger PAGE_SIZE, and use of
getpagesize() would break that badly.

PAGE_MASK got the same treatment, as it is closely tied to PAGE_SIZE.
Signed-off-by: NJeff Dike <jdike@linux.intel.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 f5a9c77d
...@@ -9,6 +9,7 @@ OFFSET(HOST_TASK_REGS, task_struct, thread.regs); ...@@ -9,6 +9,7 @@ OFFSET(HOST_TASK_REGS, task_struct, thread.regs);
OFFSET(HOST_TASK_PID, task_struct, pid); OFFSET(HOST_TASK_PID, task_struct, pid);
DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE); DEFINE(UM_KERN_PAGE_SIZE, PAGE_SIZE);
DEFINE(UM_KERN_PAGE_MASK, PAGE_MASK);
DEFINE(UM_NSEC_PER_SEC, NSEC_PER_SEC); DEFINE(UM_NSEC_PER_SEC, NSEC_PER_SEC);
DEFINE_STR(UM_KERN_EMERG, KERN_EMERG); DEFINE_STR(UM_KERN_EMERG, KERN_EMERG);
......
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include "uml-config.h" #include "uml-config.h"
#include "os.h" #include "os.h"
#include "um_malloc.h" #include "um_malloc.h"
#include "kern_constants.h"
/* Set in main, unchanged thereafter */ /* Set in main, unchanged thereafter */
char *linux_prog; char *linux_prog;
...@@ -232,7 +233,8 @@ void *__wrap_malloc(int size) ...@@ -232,7 +233,8 @@ void *__wrap_malloc(int size)
if(!CAN_KMALLOC()) if(!CAN_KMALLOC())
return __real_malloc(size); return __real_malloc(size);
else if(size <= PAGE_SIZE) /* finding contiguos pages can be hard*/ else if(size <= UM_KERN_PAGE_SIZE)
/* finding contiguous pages can be hard*/
ret = um_kmalloc(size); ret = um_kmalloc(size);
else ret = um_vmalloc(size); else ret = um_vmalloc(size);
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "sysdep/ptrace.h" #include "sysdep/ptrace.h"
#include "sysdep/stub.h" #include "sysdep/stub.h"
#include "init.h" #include "init.h"
#include "kern_constants.h"
extern unsigned long batch_syscall_stub, __syscall_stub_start; extern unsigned long batch_syscall_stub, __syscall_stub_start;
...@@ -149,8 +150,8 @@ long run_syscall_stub(struct mm_id * mm_idp, int syscall, ...@@ -149,8 +150,8 @@ long run_syscall_stub(struct mm_id * mm_idp, int syscall,
*stack = 0; *stack = 0;
multi_op_count++; multi_op_count++;
if(!done && ((((unsigned long) stack) & ~PAGE_MASK) < if(!done && ((((unsigned long) stack) & ~UM_KERN_PAGE_MASK) <
PAGE_SIZE - 10 * sizeof(long))){ UM_KERN_PAGE_SIZE - 10 * sizeof(long))){
*addr = stack; *addr = stack;
return 0; return 0;
} }
...@@ -168,8 +169,8 @@ long syscall_stub_data(struct mm_id * mm_idp, ...@@ -168,8 +169,8 @@ long syscall_stub_data(struct mm_id * mm_idp,
/* If *addr still is uninitialized, it *must* contain NULL. /* If *addr still is uninitialized, it *must* contain NULL.
* Thus in this case do_syscall_stub correctly won't be called. * Thus in this case do_syscall_stub correctly won't be called.
*/ */
if((((unsigned long) *addr) & ~PAGE_MASK) >= if((((unsigned long) *addr) & ~UM_KERN_PAGE_MASK) >=
PAGE_SIZE - (10 + data_count) * sizeof(long)) { UM_KERN_PAGE_SIZE - (10 + data_count) * sizeof(long)) {
ret = do_syscall_stub(mm_idp, addr); ret = do_syscall_stub(mm_idp, addr);
/* in case of error, don't overwrite data on stack */ /* in case of error, don't overwrite data on stack */
if(ret) if(ret)
...@@ -183,8 +184,8 @@ long syscall_stub_data(struct mm_id * mm_idp, ...@@ -183,8 +184,8 @@ long syscall_stub_data(struct mm_id * mm_idp,
memcpy(stack + 1, data, data_count * sizeof(long)); memcpy(stack + 1, data, data_count * sizeof(long));
*stub_addr = (void *)(((unsigned long)(stack + 1) & ~PAGE_MASK) + *stub_addr = (void *)(((unsigned long)(stack + 1) &
UML_CONFIG_STUB_DATA); ~UM_KERN_PAGE_MASK) + UML_CONFIG_STUB_DATA);
return 0; return 0;
} }
......
...@@ -252,11 +252,12 @@ int start_userspace(unsigned long stub_stack) ...@@ -252,11 +252,12 @@ int start_userspace(unsigned long stub_stack)
unsigned long sp; unsigned long sp;
int pid, status, n, flags; int pid, status, n, flags;
stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, stack = mmap(NULL, UM_KERN_PAGE_SIZE,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if(stack == MAP_FAILED) if(stack == MAP_FAILED)
panic("start_userspace : mmap failed, errno = %d", errno); panic("start_userspace : mmap failed, errno = %d", errno);
sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); sp = (unsigned long) stack + UM_KERN_PAGE_SIZE - sizeof(void *);
flags = CLONE_FILES | SIGCHLD; flags = CLONE_FILES | SIGCHLD;
if(proc_mm) flags |= CLONE_VM; if(proc_mm) flags |= CLONE_VM;
...@@ -279,7 +280,7 @@ int start_userspace(unsigned long stub_stack) ...@@ -279,7 +280,7 @@ int start_userspace(unsigned long stub_stack)
panic("start_userspace : PTRACE_OLDSETOPTIONS failed, errno=%d\n", panic("start_userspace : PTRACE_OLDSETOPTIONS failed, errno=%d\n",
errno); errno);
if(munmap(stack, PAGE_SIZE) < 0) if(munmap(stack, UM_KERN_PAGE_SIZE) < 0)
panic("start_userspace : munmap failed, errno = %d\n", errno); panic("start_userspace : munmap failed, errno = %d\n", errno);
return(pid); return(pid);
...@@ -365,7 +366,7 @@ static int __init init_thread_regs(void) ...@@ -365,7 +366,7 @@ static int __init init_thread_regs(void)
thread_regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE + thread_regs[REGS_IP_INDEX] = UML_CONFIG_STUB_CODE +
(unsigned long) stub_clone_handler - (unsigned long) stub_clone_handler -
(unsigned long) &__syscall_stub_start; (unsigned long) &__syscall_stub_start;
thread_regs[REGS_SP_INDEX] = UML_CONFIG_STUB_DATA + PAGE_SIZE - thread_regs[REGS_SP_INDEX] = UML_CONFIG_STUB_DATA + UM_KERN_PAGE_SIZE -
sizeof(void *); sizeof(void *);
#ifdef __SIGNAL_FRAMESIZE #ifdef __SIGNAL_FRAMESIZE
thread_regs[REGS_SP_INDEX] -= __SIGNAL_FRAMESIZE; thread_regs[REGS_SP_INDEX] -= __SIGNAL_FRAMESIZE;
...@@ -453,7 +454,7 @@ void map_stub_pages(int fd, unsigned long code, ...@@ -453,7 +454,7 @@ void map_stub_pages(int fd, unsigned long code,
.u = .u =
{ .mmap = { .mmap =
{ .addr = code, { .addr = code,
.len = PAGE_SIZE, .len = UM_KERN_PAGE_SIZE,
.prot = PROT_EXEC, .prot = PROT_EXEC,
.flags = MAP_FIXED | MAP_PRIVATE, .flags = MAP_FIXED | MAP_PRIVATE,
.fd = code_fd, .fd = code_fd,
...@@ -476,7 +477,7 @@ void map_stub_pages(int fd, unsigned long code, ...@@ -476,7 +477,7 @@ void map_stub_pages(int fd, unsigned long code,
.u = .u =
{ .mmap = { .mmap =
{ .addr = data, { .addr = data,
.len = PAGE_SIZE, .len = UM_KERN_PAGE_SIZE,
.prot = PROT_READ | PROT_WRITE, .prot = PROT_READ | PROT_WRITE,
.flags = MAP_FIXED | MAP_SHARED, .flags = MAP_FIXED | MAP_SHARED,
.fd = map_fd, .fd = map_fd,
......
...@@ -107,11 +107,12 @@ static int start_ptraced_child(void **stack_out) ...@@ -107,11 +107,12 @@ static int start_ptraced_child(void **stack_out)
unsigned long sp; unsigned long sp;
int pid, n, status; int pid, n, status;
stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, stack = mmap(NULL, UM_KERN_PAGE_SIZE,
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if(stack == MAP_FAILED) if(stack == MAP_FAILED)
fatal_perror("check_ptrace : mmap failed"); fatal_perror("check_ptrace : mmap failed");
sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); sp = (unsigned long) stack + UM_KERN_PAGE_SIZE - sizeof(void *);
pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL); pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL);
if(pid < 0) if(pid < 0)
fatal_perror("start_ptraced_child : clone failed"); fatal_perror("start_ptraced_child : clone failed");
...@@ -153,7 +154,7 @@ static int stop_ptraced_child(int pid, void *stack, int exitcode, ...@@ -153,7 +154,7 @@ static int stop_ptraced_child(int pid, void *stack, int exitcode,
ret = -1; ret = -1;
} }
if(munmap(stack, PAGE_SIZE) < 0) if(munmap(stack, UM_KERN_PAGE_SIZE) < 0)
fatal_perror("check_ptrace : munmap failed"); fatal_perror("check_ptrace : munmap failed");
return ret; return ret;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册