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: Jeff Dike <jdike@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
f5a9c77df4
commit
c539ab7307
5 changed files with 22 additions and 16 deletions
|
@ -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 @@
|
||||||
#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)
|
||||||
|
|
||||||
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 @@
|
||||||
#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,
|
||||||
*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,
|
||||||
/* 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,
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
.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,
|
||||||
.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)
|
||||||
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,
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue