1 /* x86 variant of the amd64-solaris/context_gpr.c test. */ 2 3 #include <assert.h> 4 #include <signal.h> 5 #include <stdio.h> 6 #include <stdlib.h> 7 #include <unistd.h> 8 #include <sys/syscall.h> 9 #include <sys/ucontext.h> 10 11 static siginfo_t si; 12 static ucontext_t uc; 13 /* x0 is always zero, but is visible to Valgrind as uninitialised. */ 14 static int x0; 15 16 static void sighandler(int sig, siginfo_t *sip, ucontext_t *ucp) 17 { 18 si = *sip; 19 uc = *ucp; 20 21 ucp->uc_mcontext.gregs[ECX] = x0; 22 } 23 24 int main(void) 25 { 26 struct sigaction sa; 27 pid_t pid; 28 int eax, ebx, ecx, edx, esi, edi; 29 int y0; 30 31 /* Uninitialised, but we know px[0] is 0x0. */ 32 int *px = malloc(sizeof(*px)); 33 x0 = px[0]; 34 35 /* Uninitialised, but we know py[0] is 0x0. */ 36 int *py = malloc(sizeof(*py)); 37 y0 = py[0]; 38 39 sa.sa_handler = sighandler; 40 sa.sa_flags = SA_SIGINFO; 41 if (sigfillset(&sa.sa_mask)) { 42 perror("sigfillset"); 43 return 1; 44 } 45 if (sigaction(SIGUSR1, &sa, NULL)) { 46 perror("sigaction"); 47 return 1; 48 } 49 50 pid = getpid(); 51 52 __asm__ __volatile__( 53 /* Set values in general purpose registers. */ 54 "movl %[y0], %%ebx\n" 55 "movl $0xf1, %%ecx\n" 56 "movl $0xf2, %%edx\n" 57 "movl $0xf3, %%esi\n" 58 "movl $0xf4, %%edi\n" 59 60 /* Prepare syscall parameters. */ 61 "pushl %[sig]\n" 62 "pushl %[pid]\n" 63 "pushl $0xdeadbeef\n" 64 "movl %[scall], %%eax\n" 65 66 /* Trigger the signal handler. */ 67 "int $0x91\n" 68 "addl $12, %%esp\n" 69 : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx), "=S" (esi), 70 "=D" (edi) 71 : [scall] "i" (SYS_kill), [pid] "a" (pid), [sig] "i" (SIGUSR1), 72 [y0] "m" (y0) 73 : "cc", "memory"); 74 75 printf("Values in the signal handler:\n"); 76 printf(" eax=%#x, edx=%#x, esi=%#x, edi=%#x\n", 77 uc.uc_mcontext.gregs[EAX], uc.uc_mcontext.gregs[EDX], 78 uc.uc_mcontext.gregs[ESI], uc.uc_mcontext.gregs[EDI]); 79 /* Check that ebx contains an uninitialised value (origin is py[0]). */ 80 if (uc.uc_mcontext.gregs[EBX]) 81 assert(0); 82 83 printf("Values after the return from the signal handler:\n"); 84 printf(" eax=%#x, edx=%#x, esi=%#x, edi=%#x\n", eax, edx, esi, edi); 85 /* Check that ebx and ecx contain uninitialised values (origin is py[0] 86 and px[0], respectively). */ 87 if (ebx || ecx) 88 assert(0); 89 90 return 0; 91 } 92 93