SKAS4 - Guest support for using PTRACE_GETSIGINFO
RFC PATCH 6/11 SKAS4 - Guest support for using PTRACE_GETSIGINFO
The nastiness in arch/um/include/siginfo_segv.h is defining the new siginfo_t structure in place of the old one, which requires using CPP to rename the old one out of the way.
arch/um/include/siginfo_segv.h new file +133 -0
@@ -0,0 +1,133 @@ +/* +* Copyright (C) 2002- 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) +* Licensed under the GPL +*/ + +#ifndef __SIGINFO_SIGSEGV_H_ +#define __SIGINFO_SIGSEGV_H_ + +/* +* Provide signal.h, except for replacing siginfo_t with one that has +* the CPU trap number and error code in the SIGSEGV case. +*/ + +#include <time.h> + +/* Rename the signal.h siginfo and siginfo_t out of the way */ +#define siginfo old_siginfo +#define siginfo_t old_siginfo_t + +#include <signal.h> + +#undef siginfo +#undef siginfo_t + +#define __ARCH_SI_TRAPNO +#define __ARCH_SI_ERROR + +/* The new siginfo_t, plus associated definitions */ + +/* +* This is the size (including padding) of the part of the +* struct siginfo that is before the union. +*/ +#ifndef __ARCH_SI_PREAMBLE_SIZE +#define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int)) +#endif + +#define SI_MAX_SIZE 128 +#ifndef SI_PAD_SIZE +#define SI_PAD_SIZE ((SI_MAX_SIZE - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int)) +#endif + +#ifndef __ARCH_SI_UID_T +#define __ARCH_SI_UID_T uid_t +#endif + +/* +* The default "si_band" type is "long", as specified by POSIX. +* However, some architectures want to override this to "int" +* for historical compatibility reasons, so we allow that. +*/ +#ifndef __ARCH_SI_BAND_T +#define __ARCH_SI_BAND_T long +#endif + +#define __user + +typedef struct siginfo { +int si_signo; +int si_errno; +int si_code; + +union { +int _pad[SI_PAD_SIZE ]; + +/* kill() */ +struct { +pid_t _pid;/* sender's pid */ +__ARCH_SI_UID_T _uid;/* sender's uid */ + } _kill; + +/* POSIX.1b timers */ +struct { +timer_t _tid;/* timer id */ +int _overrun;/* overrun count */ +char _pad[sizeof ( __ARCH_SI_UID_T) -sizeof (int )]; +sigval_t _sigval;/* same as below */ +int _sys_private;/* not to be passed to user */ + } _timer; + +/* POSIX.1b signals */ +struct { +pid_t _pid;/* sender's pid */ +__ARCH_SI_UID_T _uid;/* sender's uid */ +sigval_t _sigval; + } _rt; + +/* SIGCHLD */ +struct { +pid_t _pid;/* which child */ +__ARCH_SI_UID_T _uid;/* sender's uid */ +int _status;/* exit code */ +clock_t _utime; +clock_t _stime; + } _sigchld; + +/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */ +struct { +void __user *_addr;/* faulting insn/memory ref. */ +#ifdef __ARCH_SI_TRAPNO +int _trapno;/* TRAP # which caused the signal */ +#endif +#ifdef __ARCH_SI_ERROR +int _error;/* CPU error code */ +#endif + } _sigfault; + +/* SIGPOLL */ +struct { +__ARCH_SI_BAND_T _band;/* POLL_IN, POLL_OUT, POLL_MSG */ +int _fd; + } _sigpoll; + } _sifields; +}siginfo_t ; + +#ifdef __ARCH_SI_TRAPNO +#define si_trapno _sifields._sigfault._trapno +#endif +#ifdef __ARCH_SI_ERROR +#define si_error _sifields._sigfault._error +#endif + +#undef si_addr +#define si_addr _sifields._sigfault._addr + +#define GET_FAULTINFO_FROM_SI (fi, si) \ + { \ + (fi).cr2 = (unsigned long) (si).si_addr; \ + (fi).error_code = (si).si_error; \ + (fi).trap_no = (si).si_trapno; \ + } + +#endif
arch/um/include/skas/skas.h +2 -0
@@ -8,6 +8,8 @@#include "sysdep/ptrace.h" +extern int have_siginfo_segv; +extern int userspace_pid[];extern int proc_mm, ptrace_faultinfo, ptrace_ldt;extern int skas_needs_stub;
arch/um/os-Linux/skas/process.c +16 -1
@@ -3,6 +3,9 @@* Licensed under the GPL */ +/* Include this first, before anything else includes <signal.h> */ +#include "siginfo_segv.h" +#include <stdlib.h> #include <unistd.h> #include <sched.h>
@@ -91,11 +94,23 @@ bad_wait:extern unsigned long current_stub_stack (void ); +#ifndef PTRACE_GETSIGINFO +#define PTRACE_GETSIGINFO 0x4202 +#endif +void get_skas_faultinfo (int pid,struct faultinfo * fi) { +siginfo_t si;int err; -if (ptrace_faultinfo) { +if (have_siginfo_segv){ + err =ptrace (PTRACE_GETSIGINFO , pid,0 , &si); +if (err) +printk ("PTRACE_GETSIGINFO failed, err = %d\n" , errno); + +GET_FAULTINFO_FROM_SI (*fi, si); + } +else if (ptrace_faultinfo) { err =ptrace (PTRACE_FAULTINFO , pid,0 , fi);if (err) panic("get_skas_faultinfo - PTRACE_FAULTINFO failed, "
arch/um/os-Linux/start_up.c +140 -0
176 lines not on this page · raw message
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel