about summary refs log tree commit diff
path: root/sysdeps/mach/hurd/x86_64/bits/sigcontext.h
blob: 3a3b34bc0a9827751c26934c0f4864bd56ab7a6e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* Machine-dependent signal context structure for GNU Hurd.  x86_64 version.
   Copyright (C) 1991-2023 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <https://www.gnu.org/licenses/>.  */

#ifndef _BITS_SIGCONTEXT_H
#define _BITS_SIGCONTEXT_H 1

#if !defined _SIGNAL_H && !defined _SYS_UCONTEXT_H
# error "Never use <bits/sigcontext.h> directly; include <signal.h> instead."
#endif

/* Signal handlers are actually called:
   void handler (int sig, int code, struct sigcontext *scp);  */

#include <bits/types/__sigset_t.h>
#include <mach/machine/fp_reg.h>

/* State of this thread when the signal was taken.  */
struct sigcontext
  {
    /* These first members are machine-independent.  */

    int sc_onstack;		/* Nonzero if running on sigstack.  */
    __sigset_t sc_mask;		/* Blocked signals to restore.  */

    /* MiG reply port this thread is using.  */
    unsigned int sc_reply_port;

    /* Port this thread is doing an interruptible RPC on.  */
    unsigned int sc_intr_port;

    /* Error code associated with this signal (interpreted as `error_t').  */
    int sc_error;

    /* All following members are machine-dependent.  The rest of this
       structure is written to be laid out identically to:
       {
	 struct i386_thread_state basic;
	 struct i386_float_state fpu;
       }
       trampoline.c knows this, so it must be changed if this changes.  */

#define sc_i386_thread_state sc_gs /* Beginning of correspondence.  */
    /* Segment registers.  */
    int sc_gs;
    int sc_fs;
    int sc_es;
    int sc_ds;

    long sc_r8;
    long sc_r9;
    long sc_r10;
    long sc_r11;
    long sc_r12;
    long sc_r13;
    long sc_r14;
    long sc_r15;
    long sc_rdi;
    long sc_rsi;
    long sc_rbp;
    long sc_rsp;		/* Not used; sc_ursp is used instead.  */
    long sc_rbx;
    long sc_rdx;
    long sc_rcx;
    long sc_rax;
    long sc_rip;		/* Instruction pointer.  */

    int sc_cs;			/* Code segment register.  */

    long sc_rfl;		/* Processor flags.  */

    long sc_ursp;		/* This stack pointer is used.  */
    int sc_ss;			/* Stack segment register.  */

    /* Following mimics struct i386_float_state.  Structures and symbolic
       values can be found in <mach/i386/fp_reg.h>.  */
#define sc_i386_float_state sc_fpkind
    int sc_fpkind;		/* FP_NO, FP_387, etc.  */
    int sc_fpused;		/* If zero, ignore rest of float state.  */
    struct i386_fp_save sc_fpsave;
    struct i386_fp_regs sc_fpregs;
    int sc_fpexcsr;		/* FPSR including exception bits.  */
  };

/* Traditional BSD names for some members.  */
#define sc_sp	sc_ursp		/* Stack pointer.  */
#define sc_fp	sc_rbp		/* Frame pointer.  */
#define sc_pc	sc_rip		/* Process counter.  */
#define sc_ps	sc_rfl


/* The deprecated sigcode values below are passed as an extra, non-portable
   argument to regular signal handlers.  You should use SA_SIGINFO handlers
   instead, which use the standard POSIX signal codes.  */

/* Codes for SIGFPE.  */
#define FPE_INTOVF_TRAP		0x1 /* integer overflow */
#define FPE_INTDIV_FAULT	0x2 /* integer divide by zero */
#define FPE_FLTOVF_FAULT	0x3 /* floating overflow */
#define FPE_FLTDIV_FAULT	0x4 /* floating divide by zero */
#define FPE_FLTUND_FAULT	0x5 /* floating underflow */
#define FPE_SUBRNG_FAULT	0x7 /* BOUNDS instruction failed */
#define FPE_FLTDNR_FAULT	0x8 /* denormalized operand */
#define FPE_FLTINX_FAULT	0x9 /* floating loss of precision */
#define FPE_EMERR_FAULT		0xa /* mysterious emulation error 33 */
#define FPE_EMBND_FAULT		0xb /* emulation BOUNDS instruction failed */

/* Codes for SIGILL.  */
#define ILL_INVOPR_FAULT	0x1 /* invalid operation */
#define ILL_STACK_FAULT		0x2 /* fault on microkernel stack access */
#define ILL_FPEOPR_FAULT	0x3 /* invalid floating operation */

/* Codes for SIGTRAP.  */
#define DBG_SINGLE_TRAP		0x1 /* single step */
#define DBG_BRKPNT_FAULT	0x2 /* breakpoint instruction */

#endif /* bits/sigcontext.h */