From owner-freebsd-hackers@FreeBSD.ORG Fri Feb 15 07:40:14 2008 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 9B29616A418 for ; Fri, 15 Feb 2008 07:40:14 +0000 (UTC) (envelope-from st@anti-virus.by) Received: from tux.vba.com.by (vbaltd.vba.com.by [193.232.92.242]) by mx1.freebsd.org (Postfix) with ESMTP id F382113C442 for ; Fri, 15 Feb 2008 07:40:13 +0000 (UTC) (envelope-from st@anti-virus.by) Received: from st.vba.com.by (unknown [192.168.234.44]) by tux.vba.com.by (Postfix) with ESMTP id 85ABDC6423 for ; Fri, 15 Feb 2008 09:40:11 +0200 (EET) Date: Fri, 15 Feb 2008 09:40:09 +0200 From: Sergei Trofimovich To: freebsd-hackers@freebsd.org Message-ID: <20080215094009.07079ef0@st.vba.com.by> In-Reply-To: <49BA5EE4-D845-4F74-A61D-3CD2AAB41E53@0x58.com> References: <20080214174645.5bdb2879@st.vba.com.by> <49BA5EE4-D845-4F74-A61D-3CD2AAB41E53@0x58.com> Organization: VBA Ltd. X-Mailer: Claws Mail 3.0.2 (GTK+ 2.12.5; x86_64-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Mailman-Approved-At: Fri, 15 Feb 2008 12:12:35 +0000 Subject: Re: x86: sigaltstack problems X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 15 Feb 2008 07:40:14 -0000 On Thu, 14 Feb 2008 11:40:21 -0700 Bert JW Regeer wrote: > On Feb 14, 2008, at 08:46 , Sergei Trofimovich wrote: > > > Attached file causes segfaults on freebsd 4,5,6 > > but keeps alive in linux. > > > > IANIAML, so please CC me explicitly. > > > > Thanks! > > You did not attach any files. > > Bert JW Regeer Sorry, something stripped it out. (copy of file is here - http://rafb.net/p/OYjAUQ55.html) The question is: Is it okay the program segfaults? I thought sigaltstack is the way not to mess our (possible invalid) stack. IANIAML, so please CC me explicitly. ////////////////////////////////////////////////////// //main.c: ////////////////////////////////////////////////////// #include #include #include #include #include #include #include volatile int alarmed = 0; void alarm_handler(int signo) { alarmed = 1; } #define EMIT_ASM_CALL(aflag) \ asm volatile( \ "nop \t\n" \ /* backup and mess esp */ \ "movl %%esp, %%ebp \t\n" \ "xorl %%eax, %%eax \t\n" \ "movl %%eax, %%esp \t\n" \ \ "while_not_alarmed: \t\n" \ "movl %0, %%eax \t\n" \ "test %%eax, %%eax \t\n" \ \ /* loop on volatile var */ \ "jz while_not_alarmed \t\n" \ \ /* restore esp */ \ "movl %%ebp, %%esp \t\n" \ "nop \t\n" \ : \ : "m"(aflag) \ : "%eax", "%ebp", "%esp","cc" /* we mess up EFLAGS */); int main () { /* alternate stack not to segfault on signal arrival */ stack_t ss; ss.ss_sp = malloc(SIGSTKSZ); if (ss.ss_sp == NULL) exit (1); ss.ss_size = SIGSTKSZ; ss.ss_flags = 0; if (sigaltstack(&ss, NULL) == -1) exit (2); struct sigaction sa; memset(&sa, 0, sizeof(sa)); sigfillset(&sa.sa_mask); sa.sa_handler = alarm_handler; // we DO alternate stack on signal arrival sa.sa_flags = SA_ONSTACK; sigaction(SIGALRM, &sa, NULL); alarm (1); // loop on volatile var EMIT_ASM_CALL(alarmed); printf ("caught alarm signal\n"); return 0; }