54ae36f24b
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>
102 lines
2.1 KiB
C
102 lines
2.1 KiB
C
/*
|
|
* Copyright (C) 2004 Jeff Dike (jdike@addtoit.com)
|
|
* Licensed under the GPL
|
|
*/
|
|
|
|
#ifndef __SYSDEP_STUB_H
|
|
#define __SYSDEP_STUB_H
|
|
|
|
#include <sys/mman.h>
|
|
#include <asm/ptrace.h>
|
|
#include <asm/unistd.h>
|
|
#include "as-layout.h"
|
|
#include "stub-data.h"
|
|
#include "kern_constants.h"
|
|
#include "uml-config.h"
|
|
|
|
extern void stub_segv_handler(int sig);
|
|
extern void stub_clone_handler(void);
|
|
|
|
#define STUB_SYSCALL_RET EAX
|
|
#define STUB_MMAP_NR __NR_mmap2
|
|
#define MMAP_OFFSET(o) ((o) >> UM_KERN_PAGE_SHIFT)
|
|
|
|
static inline long stub_syscall0(long syscall)
|
|
{
|
|
long ret;
|
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall));
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline long stub_syscall1(long syscall, long arg1)
|
|
{
|
|
long ret;
|
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1));
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline long stub_syscall2(long syscall, long arg1, long arg2)
|
|
{
|
|
long ret;
|
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1),
|
|
"c" (arg2));
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline long stub_syscall3(long syscall, long arg1, long arg2, long arg3)
|
|
{
|
|
long ret;
|
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1),
|
|
"c" (arg2), "d" (arg3));
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline long stub_syscall4(long syscall, long arg1, long arg2, long arg3,
|
|
long arg4)
|
|
{
|
|
long ret;
|
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1),
|
|
"c" (arg2), "d" (arg3), "S" (arg4));
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline long stub_syscall5(long syscall, long arg1, long arg2, long arg3,
|
|
long arg4, long arg5)
|
|
{
|
|
long ret;
|
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1),
|
|
"c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5));
|
|
|
|
return ret;
|
|
}
|
|
|
|
static inline void trap_myself(void)
|
|
{
|
|
__asm("int3");
|
|
}
|
|
|
|
static inline void remap_stack(int fd, unsigned long offset)
|
|
{
|
|
__asm__ volatile ("movl %%eax,%%ebp ; movl %0,%%eax ; int $0x80 ;"
|
|
"movl %7, %%ebx ; movl %%eax, (%%ebx)"
|
|
: : "g" (STUB_MMAP_NR), "b" (STUB_DATA),
|
|
"c" (UM_KERN_PAGE_SIZE),
|
|
"d" (PROT_READ | PROT_WRITE),
|
|
"S" (MAP_FIXED | MAP_SHARED), "D" (fd),
|
|
"a" (offset),
|
|
"i" (&((struct stub_data *) STUB_DATA)->err)
|
|
: "memory");
|
|
}
|
|
|
|
#endif
|