From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:48441) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RvnEQ-0004hd-FZ for qemu-devel@nongnu.org; Fri, 10 Feb 2012 04:57:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RvnEM-0002AE-EG for qemu-devel@nongnu.org; Fri, 10 Feb 2012 04:57:30 -0500 MIME-Version: 1.0 Sender: alex.barcelo@gmail.com In-Reply-To: References: From: Alex Barcelo Date: Fri, 10 Feb 2012 10:57:05 +0100 Message-ID: Content-Type: text/plain; charset=ISO-8859-1 Subject: Re: [Qemu-devel] [TRIVIAL v2] Bad zero comparison for sas_ss_flags on powerpc List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel Cc: qemu-trivial@nongnu.org, Riku Voipio // Test source and desired /real output: #include #include #include #include void handler(int sig) { unsigned int a; // to prevent uninitialized stack, normally a = 0 if ( a>10 ) a = 0; a = a + 1; printf ("new value: %d\n" , a ); if (a > 7) _exit(a); return; } int main() { int ret; char * stackA = malloc(SIGSTKSZ); char * stackB = malloc(SIGSTKSZ); stack_t ssA = { .ss_size = SIGSTKSZ, .ss_sp = stackA, }; stack_t ssB = { .ss_size = SIGSTKSZ, .ss_sp = stackB, }; struct sigaction sa = { .sa_handler = handler, .sa_flags = SA_ONSTACK }; // no error checking, only debug output ret = sigfillset(&sa.sa_mask); printf ( "Sigfillset: %d\n" , ret ); ret = sigaction(SIGUSR1, &sa, 0); printf ( "Sigaction: %d\n" , ret ); while (1) { printf ("On stack A -- " ); ret = sigaltstack(&ssA, 0); printf ( "sigaltstack return: %d -- " , ret ); kill(0, SIGUSR1); sleep(1); printf (" -- " ); kill(0, SIGUSR1); sleep(1); printf ("On stack B -- " ); ret = sigaltstack(&ssB, 0); printf ( "sigaltstack return: %d -- " , ret ); kill(0, SIGUSR1); sleep(1); } } /* Desired output: Sigfillset: 0 Sigaction: 0 On stack A -- sigaltstack return: 0 -- new value: 1 -- new value: 2 On stack B -- sigaltstack return: 0 -- new value: 1 On stack A -- sigaltstack return: 0 -- new value: 3 -- new value: 4 On stack B -- sigaltstack return: 0 -- new value: 2 On stack A -- sigaltstack return: 0 -- new value: 5 -- new value: 6 On stack B -- sigaltstack return: 0 -- new value: 3 On stack A -- sigaltstack return: 0 -- new value: 7 -- new value: 8 Output for ppc without patch: Sigfillset: 0 Sigaction: 0 On stack A -- sigaltstack return: 0 -- new value: 1 -- new value: 2 On stack B -- sigaltstack return: 0 -- new value: 3 // WRONG!! On stack A -- sigaltstack return: 0 -- new value: 4 -- new value: 5 // WRONG AGAIN! ... */