mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-11 09:56:29 +00:00
70 lines
1.4 KiB
C
70 lines
1.4 KiB
C
#include <features.h>
|
|
#include <fpu_control.h>
|
|
#include <signal.h>
|
|
#include <sys/types.h>
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ucontext.h>
|
|
#include <unistd.h>
|
|
|
|
void handle_SIG(int sig)
|
|
{
|
|
double d;
|
|
|
|
_FPU_SETCW(0);
|
|
d = 7;
|
|
asm volatile ("":: "f" (d));
|
|
printf("Got signal %d\n", sig);
|
|
if (sig == SIGSEGV) {
|
|
printf("SIGSEGV, exiting...\n");
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
void handle_rt_SIG(int sig, siginfo_t *info, void *uc)
|
|
{
|
|
double d;
|
|
|
|
_FPU_SETCW(0);
|
|
d = 8;
|
|
asm volatile ("":: "f" (d));
|
|
printf("Got signal %d\n", sig);
|
|
printf("si_signo: %d\n", info->si_signo);
|
|
printf("si_errno: %d\n", info->si_errno);
|
|
printf("si_code: %d\n", info->si_code);
|
|
if (sig == SIGSEGV) {
|
|
printf("SIGSEGV, exiting...\n");
|
|
exit(0);
|
|
}
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
// char *a;
|
|
struct sigaction sa;
|
|
double d1,d2,d3,d4,d5;
|
|
|
|
_FPU_SETCW(1);
|
|
d1 = d2 = d3 = d4 = d5 = 1;
|
|
sa.sa_sigaction=handle_rt_SIG;
|
|
sa.sa_flags =SA_SIGINFO;
|
|
sigemptyset(&sa.sa_mask);
|
|
sigaction(SIGALRM, &sa, NULL);
|
|
signal(SIGUSR1, handle_SIG);
|
|
signal(SIGSEGV, handle_SIG);
|
|
kill(getpid(), SIGALRM);
|
|
printf("One!\n");
|
|
kill(getpid(), SIGUSR1);
|
|
printf("floating point is now: %f %f %f %f %f\n", d1, d2, d3, d4, d5);
|
|
{
|
|
int fpc;
|
|
_FPU_GETCW(fpc);
|
|
printf("fpc= %d\n", fpc);
|
|
}
|
|
printf("Good Bye!\n");
|
|
// a = (char *) 0x12345678;
|
|
// *a = 1;
|
|
exit(0);
|
|
}
|