2006-06-26 13:57:41 +02:00
# ifndef _ASM_I386_UNWIND_H
# define _ASM_I386_UNWIND_H
/*
* Copyright ( C ) 2002 - 2006 Novell , Inc .
* Jan Beulich < jbeulich @ novell . com >
* This code is released under version 2 of the GNU GPL .
*/
# ifdef CONFIG_STACK_UNWIND
# include <linux/sched.h>
# include <asm/fixmap.h>
# include <asm/ptrace.h>
# include <asm/uaccess.h>
struct unwind_frame_info
{
struct pt_regs regs ;
struct task_struct * task ;
} ;
# define UNW_PC(frame) (frame)->regs.eip
# define UNW_SP(frame) (frame)->regs.esp
# ifdef CONFIG_FRAME_POINTER
# define UNW_FP(frame) (frame)->regs.ebp
# define FRAME_RETADDR_OFFSET 4
# define FRAME_LINK_OFFSET 0
# define STACK_BOTTOM(tsk) STACK_LIMIT((tsk)->thread.esp0)
# define STACK_TOP(tsk) ((tsk)->thread.esp0)
# endif
# define STACK_LIMIT(ptr) (((ptr) - 1) & ~(THREAD_SIZE - 1))
# define UNW_REGISTER_INFO \
PTREGS_INFO ( eax ) , \
PTREGS_INFO ( ecx ) , \
PTREGS_INFO ( edx ) , \
PTREGS_INFO ( ebx ) , \
PTREGS_INFO ( esp ) , \
PTREGS_INFO ( ebp ) , \
PTREGS_INFO ( esi ) , \
PTREGS_INFO ( edi ) , \
PTREGS_INFO ( eip )
static inline void arch_unw_init_frame_info ( struct unwind_frame_info * info ,
/*const*/ struct pt_regs * regs )
{
if ( user_mode_vm ( regs ) )
info - > regs = * regs ;
else {
memcpy ( & info - > regs , regs , offsetof ( struct pt_regs , esp ) ) ;
info - > regs . esp = ( unsigned long ) & regs - > esp ;
info - > regs . xss = __KERNEL_DS ;
}
}
static inline void arch_unw_init_blocked ( struct unwind_frame_info * info )
{
memset ( & info - > regs , 0 , sizeof ( info - > regs ) ) ;
info - > regs . eip = info - > task - > thread . eip ;
info - > regs . xcs = __KERNEL_CS ;
__get_user ( info - > regs . ebp , ( long * ) info - > task - > thread . esp ) ;
info - > regs . esp = info - > task - > thread . esp ;
info - > regs . xss = __KERNEL_DS ;
info - > regs . xds = __USER_DS ;
info - > regs . xes = __USER_DS ;
}
2006-06-26 13:57:47 +02:00
extern asmlinkage int arch_unwind_init_running ( struct unwind_frame_info * ,
asmlinkage int ( * callback ) ( struct unwind_frame_info * ,
void * arg ) ,
void * arg ) ;
2006-06-26 13:57:41 +02:00
static inline int arch_unw_user_mode ( const struct unwind_frame_info * info )
{
#if 0 /* This can only work when selector register and EFLAGS saves/restores
are properly annotated ( and tracked in UNW_REGISTER_INFO ) . */
return user_mode_vm ( & info - > regs ) ;
# else
return info - > regs . eip < PAGE_OFFSET
[PATCH] vdso: randomize the i386 vDSO by moving it into a vma
Move the i386 VDSO down into a vma and thus randomize it.
Besides the security implications, this feature also helps debuggers, which
can COW a vma-backed VDSO just like a normal DSO and can thus do
single-stepping and other debugging features.
It's good for hypervisors (Xen, VMWare) too, which typically live in the same
high-mapped address space as the VDSO, hence whenever the VDSO is used, they
get lots of guest pagefaults and have to fix such guest accesses up - which
slows things down instead of speeding things up (the primary purpose of the
VDSO).
There's a new CONFIG_COMPAT_VDSO (default=y) option, which provides support
for older glibcs that still rely on a prelinked high-mapped VDSO. Newer
distributions (using glibc 2.3.3 or later) can turn this option off. Turning
it off is also recommended for security reasons: attackers cannot use the
predictable high-mapped VDSO page as syscall trampoline anymore.
There is a new vdso=[0|1] boot option as well, and a runtime
/proc/sys/vm/vdso_enabled sysctl switch, that allows the VDSO to be turned
on/off.
(This version of the VDSO-randomization patch also has working ELF
coredumping, the previous patch crashed in the coredumping code.)
This code is a combined work of the exec-shield VDSO randomization
code and Gerd Hoffmann's hypervisor-centric VDSO patch. Rusty Russell
started this patch and i completed it.
[akpm@osdl.org: cleanups]
[akpm@osdl.org: compile fix]
[akpm@osdl.org: compile fix 2]
[akpm@osdl.org: compile fix 3]
[akpm@osdl.org: revernt MAXMEM change]
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Arjan van de Ven <arjan@infradead.org>
Cc: Gerd Hoffmann <kraxel@suse.de>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Cc: Zachary Amsden <zach@vmware.com>
Cc: Andi Kleen <ak@muc.de>
Cc: Jan Beulich <jbeulich@novell.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-06-27 02:53:50 -07:00
| | ( info - > regs . eip > = __fix_to_virt ( FIX_VDSO )
& & info - > regs . eip < __fix_to_virt ( FIX_VDSO ) + PAGE_SIZE )
2006-06-26 13:57:41 +02:00
| | info - > regs . esp < PAGE_OFFSET ;
# endif
}
# else
# define UNW_PC(frame) ((void)(frame), 0)
static inline int arch_unw_user_mode ( const void * info )
{
return 0 ;
}
# endif
# endif /* _ASM_I386_UNWIND_H */