i386 page fault clobbers error code in trap frame
Kip Macy
kip.macy at gmail.com
Sat Jul 29 19:58:53 UTC 2006
Looking at siginfo it isn't clear that there is a "right way" to
provide SIGSEGV, eva, and the error code.
_fault._trapno should contain the machine's error code and si_signo
should contain SIGSEGV, and si_addr contains the faulting pc. Maybe
one could abuse si_code to contain eva. Sorry for asking a question
that has already been answered but where is eva being put currently?
typedef struct __siginfo {
int si_signo; /* signal number */
int si_errno; /* errno association */
/*
* Cause of signal, one of the SI_ macros or signal-specific
* values, i.e. one of the FPE_... values for SIGFPE. This
* value is equivalent to the second argument to an old-style
* FreeBSD signal handler.
*/
int si_code; /* signal code */
__pid_t si_pid; /* sending process */
__uid_t si_uid; /* sender's ruid */
int si_status; /* exit value */
void *si_addr; /* faulting instruction */
union sigval si_value; /* signal value */
union {
struct {
int _trapno;/* machine specific trap code */
} _fault;
/* .... */
On 7/29/06, Tijl Coosemans <tijl at ulyssis.org> wrote:
> I'm refering to the following two lines in sys/i386/i386/trap.c
>
> /* kludge to pass faulting virtual address to sendsig */
> frame->tf_err = eva;
>
> Isn't there some other way to do this? Wouldn't the address still be
> available in %cr2 inside sendsig? Or could there have been other page
> faults by then?
>
> The reason I'm asking this is that Wine wants to know the error code in
> case of a page fault (the No eXec bit (AMD) and the read/write bit
> specifically).
>
>
>
More information about the freebsd-hackers
mailing list