2006-01-08 12:01:31 +03:00
/*
2005-04-17 02:20:36 +04:00
* Copyright ( C ) 2002 - 2003 Jeff Dike ( jdike @ addtoit . com )
* Licensed under the GPL
*/
# include <signal.h>
# include <errno.h>
# include "kern_util.h"
2007-05-07 01:51:08 +04:00
# include "as-layout.h"
2005-04-17 02:20:36 +04:00
# include "task.h"
# include "sigcontext.h"
[PATCH] uml: S390 preparation, abstract host page fault data
This patch removes the arch-specific fault/trap-infos from thread and
skas-regs.
It adds a new struct faultinfo, that is arch-specific defined in
sysdep/faultinfo.h.
The structure is inserted in thread.arch and thread.regs.skas and
thread.regs.tt
Now, segv and other trap-handlers can copy the contents from regs.X.faultinfo
to thread.arch.faultinfo with one simple assignment.
Also, the number of macros necessary is reduced to
FAULT_ADDRESS(struct faultinfo)
extracts the faulting address from faultinfo
FAULT_WRITE(struct faultinfo)
extracts the "is_write" flag
SEGV_IS_FIXABLE(struct faultinfo)
is true for the fixable segvs, i.e. (TRAP == 14)
on i386
UPT_FAULTINFO(regs)
result is (struct faultinfo *) to the faultinfo
in regs->skas.faultinfo
GET_FAULTINFO_FROM_SC(struct faultinfo, struct sigcontext *)
copies the relevant parts of the sigcontext to
struct faultinfo.
On SIGSEGV, call user_signal() instead of handle_segv(), if the architecture
provides the information needed in PTRACE_FAULTINFO, or if PTRACE_FAULTINFO is
missing, because segv-stub will provide the info.
The benefit of the change is, that in case of a non-fixable SIGSEGV, we can
give user processes a SIGSEGV, instead of possibly looping on pagefault
handling.
Since handle_segv() sikked arch_fixup() implicitly by passing ip==0 to segv(),
I changed segv() to call arch_fixup() only, if !is_user.
Signed-off-by: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-06 03:15:31 +04:00
# include "skas.h"
# include "ptrace_user.h"
# include "sysdep/ptrace.h"
# include "sysdep/ptrace_user.h"
2006-01-08 12:01:29 +03:00
# include "os.h"
2005-04-17 02:20:36 +04:00
void sig_handler_common_skas ( int sig , void * sc_ptr )
{
struct sigcontext * sc = sc_ptr ;
struct skas_regs * r ;
2006-01-08 12:01:31 +03:00
void ( * handler ) ( int , union uml_pt_regs * ) ;
2005-04-17 02:20:36 +04:00
int save_errno = errno ;
int save_user ;
/* This is done because to allow SIGSEGV to be delivered inside a SEGV
* handler . This can happen in copy_user , and if SEGV is disabled ,
* the process will die .
* XXX Figure out why this is better than SA_NODEFER
*/
if ( sig = = SIGSEGV )
change_sig ( SIGSEGV , 1 ) ;
r = & TASK_REGS ( get_current ( ) ) - > skas ;
save_user = r - > is_user ;
r - > is_user = 0 ;
2006-01-08 12:01:33 +03:00
if ( sig = = SIGFPE | | sig = = SIGSEGV | |
sig = = SIGBUS | | sig = = SIGILL | |
sig = = SIGTRAP ) {
GET_FAULTINFO_FROM_SC ( r - > faultinfo , sc ) ;
}
2005-04-17 02:20:36 +04:00
change_sig ( SIGUSR1 , 1 ) ;
2006-01-08 12:01:31 +03:00
handler = sig_info [ sig ] ;
/* unblock SIGALRM, SIGVTALRM, SIGIO if sig isn't IRQ signal */
if ( sig ! = SIGIO & & sig ! = SIGWINCH & &
sig ! = SIGVTALRM & & sig ! = SIGALRM )
unblock_signals ( ) ;
handler ( sig , ( union uml_pt_regs * ) r ) ;
2005-04-17 02:20:36 +04:00
errno = save_errno ;
r - > is_user = save_user ;
}
[PATCH] uml: S390 preparation, abstract host page fault data
This patch removes the arch-specific fault/trap-infos from thread and
skas-regs.
It adds a new struct faultinfo, that is arch-specific defined in
sysdep/faultinfo.h.
The structure is inserted in thread.arch and thread.regs.skas and
thread.regs.tt
Now, segv and other trap-handlers can copy the contents from regs.X.faultinfo
to thread.arch.faultinfo with one simple assignment.
Also, the number of macros necessary is reduced to
FAULT_ADDRESS(struct faultinfo)
extracts the faulting address from faultinfo
FAULT_WRITE(struct faultinfo)
extracts the "is_write" flag
SEGV_IS_FIXABLE(struct faultinfo)
is true for the fixable segvs, i.e. (TRAP == 14)
on i386
UPT_FAULTINFO(regs)
result is (struct faultinfo *) to the faultinfo
in regs->skas.faultinfo
GET_FAULTINFO_FROM_SC(struct faultinfo, struct sigcontext *)
copies the relevant parts of the sigcontext to
struct faultinfo.
On SIGSEGV, call user_signal() instead of handle_segv(), if the architecture
provides the information needed in PTRACE_FAULTINFO, or if PTRACE_FAULTINFO is
missing, because segv-stub will provide the info.
The benefit of the change is, that in case of a non-fixable SIGSEGV, we can
give user processes a SIGSEGV, instead of possibly looping on pagefault
handling.
Since handle_segv() sikked arch_fixup() implicitly by passing ip==0 to segv(),
I changed segv() to call arch_fixup() only, if !is_user.
Signed-off-by: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-06 03:15:31 +04:00
extern int ptrace_faultinfo ;
void user_signal ( int sig , union uml_pt_regs * regs , int pid )
2005-04-17 02:20:36 +04:00
{
2006-01-08 12:01:31 +03:00
void ( * handler ) ( int , union uml_pt_regs * ) ;
2006-01-08 12:01:33 +03:00
int segv = ( ( sig = = SIGFPE ) | | ( sig = = SIGSEGV ) | | ( sig = = SIGBUS ) | |
( sig = = SIGILL ) | | ( sig = = SIGTRAP ) ) ;
2005-04-17 02:20:36 +04:00
[PATCH] uml: S390 preparation, abstract host page fault data
This patch removes the arch-specific fault/trap-infos from thread and
skas-regs.
It adds a new struct faultinfo, that is arch-specific defined in
sysdep/faultinfo.h.
The structure is inserted in thread.arch and thread.regs.skas and
thread.regs.tt
Now, segv and other trap-handlers can copy the contents from regs.X.faultinfo
to thread.arch.faultinfo with one simple assignment.
Also, the number of macros necessary is reduced to
FAULT_ADDRESS(struct faultinfo)
extracts the faulting address from faultinfo
FAULT_WRITE(struct faultinfo)
extracts the "is_write" flag
SEGV_IS_FIXABLE(struct faultinfo)
is true for the fixable segvs, i.e. (TRAP == 14)
on i386
UPT_FAULTINFO(regs)
result is (struct faultinfo *) to the faultinfo
in regs->skas.faultinfo
GET_FAULTINFO_FROM_SC(struct faultinfo, struct sigcontext *)
copies the relevant parts of the sigcontext to
struct faultinfo.
On SIGSEGV, call user_signal() instead of handle_segv(), if the architecture
provides the information needed in PTRACE_FAULTINFO, or if PTRACE_FAULTINFO is
missing, because segv-stub will provide the info.
The benefit of the change is, that in case of a non-fixable SIGSEGV, we can
give user processes a SIGSEGV, instead of possibly looping on pagefault
handling.
Since handle_segv() sikked arch_fixup() implicitly by passing ip==0 to segv(),
I changed segv() to call arch_fixup() only, if !is_user.
Signed-off-by: Bodo Stroesser <bstroesser@fujitsu-siemens.com>
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-05-06 03:15:31 +04:00
if ( segv )
get_skas_faultinfo ( pid , & regs - > skas . faultinfo ) ;
2006-01-08 12:01:31 +03:00
handler = sig_info [ sig ] ;
handler ( sig , ( union uml_pt_regs * ) regs ) ;
2005-04-17 02:20:36 +04:00
unblock_signals ( ) ;
}