8 #include <sys/ucontext.h>
12 void alarm_handler(int sig
)
14 printf("alarm signal=%d\n", sig
);
29 #define REG_TRAPNO TRAPNO
33 void dump_regs(struct ucontext
*uc
)
35 printf("EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n"
36 "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n"
37 "EFL=%08x EIP=%08x trapno=%02x err=%08x\n",
38 uc
->uc_mcontext
.gregs
[REG_EAX
],
39 uc
->uc_mcontext
.gregs
[REG_EBX
],
40 uc
->uc_mcontext
.gregs
[REG_ECX
],
41 uc
->uc_mcontext
.gregs
[REG_EDX
],
42 uc
->uc_mcontext
.gregs
[REG_ESI
],
43 uc
->uc_mcontext
.gregs
[REG_EDI
],
44 uc
->uc_mcontext
.gregs
[REG_EBP
],
45 uc
->uc_mcontext
.gregs
[REG_ESP
],
46 uc
->uc_mcontext
.gregs
[REG_EFL
],
47 uc
->uc_mcontext
.gregs
[REG_EIP
],
48 uc
->uc_mcontext
.gregs
[REG_TRAPNO
],
49 uc
->uc_mcontext
.gregs
[REG_ERR
]);
52 void sig_handler(int sig
, siginfo_t
*info
, void *puc
)
54 struct ucontext
*uc
= puc
;
56 printf("%s: si_signo=%d si_errno=%d si_code=%d si_addr=0x%08lx\n",
57 strsignal(info
->si_signo
),
58 info
->si_signo
, info
->si_errno
, info
->si_code
,
59 (unsigned long)info
->si_addr
);
67 int main(int argc
, char **argv
)
72 act
.sa_sigaction
= sig_handler
;
73 sigemptyset(&act
.sa_mask
);
74 act
.sa_flags
= SA_SIGINFO
;
75 sigaction(SIGFPE
, &act
, NULL
);
76 sigaction(SIGILL
, &act
, NULL
);
77 sigaction(SIGSEGV
, &act
, NULL
);
78 sigaction(SIGTRAP
, &act
, NULL
);
80 /* test division by zero reporting */
81 if (setjmp(jmp_env
) == 0) {
82 /* now divide by zero */
87 /* test illegal instruction reporting */
88 if (setjmp(jmp_env
) == 0) {
89 /* now execute an invalid instruction */
93 /* test SEGV reporting */
94 if (setjmp(jmp_env
) == 0) {
95 /* now store in an invalid address */
99 /* test SEGV reporting */
100 if (setjmp(jmp_env
) == 0) {
101 /* read from an invalid address */
102 v1
= *(char *)0x1234;
105 printf("segment GPF exception:\n");
106 if (setjmp(jmp_env
) == 0) {
107 /* load an invalid segment */
108 asm volatile ("movl %0, %%fs" : : "r" ((0x1234 << 3) | 0));
111 printf("INT exception:\n");
112 if (setjmp(jmp_env
) == 0) {
113 asm volatile ("int $0xfd");
116 printf("INT3 exception:\n");
117 if (setjmp(jmp_env
) == 0) {
118 asm volatile ("int3");
121 printf("CLI exception:\n");
122 if (setjmp(jmp_env
) == 0) {
123 asm volatile ("cli");
126 printf("STI exception:\n");
127 if (setjmp(jmp_env
) == 0) {
128 asm volatile ("cli");
131 printf("INTO exception:\n");
132 if (setjmp(jmp_env
) == 0) {
133 /* overflow exception */
134 asm volatile ("addl $1, %0 ; into" : : "r" (0x7fffffff));
137 printf("BOUND exception:\n");
138 if (setjmp(jmp_env
) == 0) {
139 /* bound exception */
142 asm volatile ("bound %0, %1" : : "r" (11), "m" (tab
));
145 printf("OUTB exception:\n");
146 if (setjmp(jmp_env
) == 0) {
147 asm volatile ("outb %%al, %%dx" : : "d" (0x4321), "a" (0));
150 printf("INB exception:\n");
151 if (setjmp(jmp_env
) == 0) {
152 asm volatile ("inb %%dx, %%al" : "=a" (val
) : "d" (0x4321));
155 printf("REP OUTSB exception:\n");
156 if (setjmp(jmp_env
) == 0) {
157 asm volatile ("rep outsb" : : "d" (0x4321), "S" (tab
), "c" (1));
160 printf("REP INSB exception:\n");
161 if (setjmp(jmp_env
) == 0) {
162 asm volatile ("rep insb" : : "d" (0x4321), "D" (tab
), "c" (1));
165 printf("HLT exception:\n");
166 if (setjmp(jmp_env
) == 0) {
167 asm volatile ("hlt");
170 printf("single step exception:\n");
172 if (setjmp(jmp_env
) == 0) {
173 asm volatile ("pushf\n"
174 "orl $0x00100, (%%esp)\n"
176 "movl $0xabcd, %0\n" : "=m" (val
) : : "cc", "memory");
178 printf("val=0x%x\n", val
);
183 act
.sa_handler
= alarm_handler
;
184 sigemptyset(&act
.sa_mask
);
186 sigaction(SIGALRM
, &act
, NULL
);
188 for(i
= 0;i
< 2; i
++) {