/[qemu]/qemu/tests/testsig.c
ViewVC logotype

Diff of /qemu/tests/testsig.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by bellard, Mon Mar 24 21:58:34 2003 UTC revision 1.4 by bellard, Thu May 8 15:32:33 2003 UTC
# Line 26  void alarm_handler(int sig) Line 26  void alarm_handler(int sig)
26  #define REG_ESP ESP  #define REG_ESP ESP
27  #define REG_EIP EIP  #define REG_EIP EIP
28  #define REG_EFL EFL  #define REG_EFL EFL
29    #define REG_TRAPNO TRAPNO
30    #define REG_ERR ERR
31  #endif  #endif
32    
33  void dump_regs(struct ucontext *uc)  void dump_regs(struct ucontext *uc)
34  {  {
35      printf("EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n"      printf("EAX=%08x EBX=%08x ECX=%08x EDX=%08x\n"
36             "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n"             "ESI=%08x EDI=%08x EBP=%08x ESP=%08x\n"
37             "EFL=%08x EIP=%08x\n",             "EFL=%08x EIP=%08x trapno=%02x err=%08x\n",
38             uc->uc_mcontext.gregs[REG_EAX],             uc->uc_mcontext.gregs[REG_EAX],
39             uc->uc_mcontext.gregs[REG_EBX],             uc->uc_mcontext.gregs[REG_EBX],
40             uc->uc_mcontext.gregs[REG_ECX],             uc->uc_mcontext.gregs[REG_ECX],
# Line 42  void dump_regs(struct ucontext *uc) Line 44  void dump_regs(struct ucontext *uc)
44             uc->uc_mcontext.gregs[REG_EBP],             uc->uc_mcontext.gregs[REG_EBP],
45             uc->uc_mcontext.gregs[REG_ESP],             uc->uc_mcontext.gregs[REG_ESP],
46             uc->uc_mcontext.gregs[REG_EFL],             uc->uc_mcontext.gregs[REG_EFL],
47             uc->uc_mcontext.gregs[REG_EIP]);             uc->uc_mcontext.gregs[REG_EIP],
48               uc->uc_mcontext.gregs[REG_TRAPNO],
49               uc->uc_mcontext.gregs[REG_ERR]);
50  }  }
51    
52  void sig_handler(int sig, siginfo_t *info, void *puc)  void sig_handler(int sig, siginfo_t *info, void *puc)
# Line 58  void sig_handler(int sig, siginfo_t *inf Line 62  void sig_handler(int sig, siginfo_t *inf
62  }  }
63    
64  int v1;  int v1;
65    int tab[2];
66    
67  int main(int argc, char **argv)  int main(int argc, char **argv)
68  {  {
69      struct sigaction act;      struct sigaction act;
70      int i;      int val;
71            
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    
79      /* test division by zero reporting */      /* test division by zero reporting */
80      if (setjmp(jmp_env) == 0) {      if (setjmp(jmp_env) == 0) {
         act.sa_sigaction = sig_handler;  
         sigemptyset(&act.sa_mask);  
         act.sa_flags = SA_SIGINFO | SA_ONESHOT;  
         sigaction(SIGFPE, &act, NULL);  
           
81          /* now divide by zero */          /* now divide by zero */
82          v1 = 0;          v1 = 0;
83          v1 = 2 / v1;          v1 = 2 / v1;
# Line 78  int main(int argc, char **argv) Line 85  int main(int argc, char **argv)
85    
86      /* test illegal instruction reporting */      /* test illegal instruction reporting */
87      if (setjmp(jmp_env) == 0) {      if (setjmp(jmp_env) == 0) {
         act.sa_sigaction = sig_handler;  
         sigemptyset(&act.sa_mask);  
         act.sa_flags = SA_SIGINFO | SA_ONESHOT;  
         sigaction(SIGILL, &act, NULL);  
           
88          /* now execute an invalid instruction */          /* now execute an invalid instruction */
89          asm volatile("ud2");          asm volatile("ud2");
90      }      }
91            
92      /* test SEGV reporting */      /* test SEGV reporting */
93      if (setjmp(jmp_env) == 0) {      if (setjmp(jmp_env) == 0) {
         act.sa_sigaction = sig_handler;  
         sigemptyset(&act.sa_mask);  
         act.sa_flags = SA_SIGINFO | SA_ONESHOT;  
         sigaction(SIGSEGV, &act, NULL);  
           
94          /* now store in an invalid address */          /* now store in an invalid address */
95          *(char *)0x1234 = 1;          *(char *)0x1234 = 1;
96      }      }
97    
98        /* test SEGV reporting */
99        if (setjmp(jmp_env) == 0) {
100            /* read from an invalid address */
101            v1 = *(char *)0x1234;
102        }
103            
104      act.sa_handler = alarm_handler;      printf("segment GPF exception:\n");
105      sigemptyset(&act.sa_mask);      if (setjmp(jmp_env) == 0) {
106      act.sa_flags = 0;          /* load an invalid segment */
107      sigaction(SIGALRM, &act, NULL);          asm volatile ("movl %0, %%fs" : : "r" ((0x1234 << 3) | 0));
108      alarm(1);      }
109      for(i = 0;i < 2; i++) {  
110          sleep(1);      printf("INT exception:\n");
111        if (setjmp(jmp_env) == 0) {
112            asm volatile ("int $0xfd");
113        }
114    
115        printf("CLI exception:\n");
116        if (setjmp(jmp_env) == 0) {
117            asm volatile ("cli");
118        }
119    
120        printf("STI exception:\n");
121        if (setjmp(jmp_env) == 0) {
122            asm volatile ("cli");
123        }
124    
125        printf("INTO exception:\n");
126        if (setjmp(jmp_env) == 0) {
127            /* overflow exception */
128            asm volatile ("addl $1, %0 ; into" : : "r" (0x7fffffff));
129      }      }
130    
131        printf("BOUND exception:\n");
132        if (setjmp(jmp_env) == 0) {
133            /* bound exception */
134            tab[0] = 1;
135            tab[1] = 10;
136            asm volatile ("bound %0, %1" : : "r" (11), "m" (tab));
137        }
138    
139        printf("OUTB exception:\n");
140        if (setjmp(jmp_env) == 0) {
141            asm volatile ("outb %%al, %%dx" : : "d" (0x4321), "a" (0));
142        }
143    
144        printf("INB exception:\n");
145        if (setjmp(jmp_env) == 0) {
146            asm volatile ("inb %%dx, %%al" : "=a" (val) : "d" (0x4321));
147        }
148    
149        printf("REP OUTSB exception:\n");
150        if (setjmp(jmp_env) == 0) {
151            asm volatile ("rep outsb" : : "d" (0x4321), "S" (tab), "c" (1));
152        }
153    
154        printf("REP INSB exception:\n");
155        if (setjmp(jmp_env) == 0) {
156            asm volatile ("rep insb" : : "d" (0x4321), "D" (tab), "c" (1));
157        }
158    
159        printf("HLT exception:\n");
160        if (setjmp(jmp_env) == 0) {
161            asm volatile ("hlt" : : "d" (0x4321), "D" (tab), "c" (1));
162        }
163    
164    #if 0
165        {
166            int i;
167            act.sa_handler = alarm_handler;
168            sigemptyset(&act.sa_mask);
169            act.sa_flags = 0;
170            sigaction(SIGALRM, &act, NULL);
171            alarm(1);
172            for(i = 0;i < 2; i++) {
173                sleep(1);
174            }
175        }
176    #endif
177      return 0;      return 0;
178  }  }

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26