From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1D3vGx-0007Y4-HE for qemu-devel@nongnu.org; Wed, 23 Feb 2005 07:05:43 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1D3vGu-0007X4-3o for qemu-devel@nongnu.org; Wed, 23 Feb 2005 07:05:40 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1D3vGt-0007Wm-MT for qemu-devel@nongnu.org; Wed, 23 Feb 2005 07:05:39 -0500 Received: from [195.135.220.2] (helo=Cantor.suse.de) by monty-python.gnu.org with esmtp (TLSv1:DES-CBC3-SHA:168) (Exim 4.34) id 1D3v29-0003hG-Ku for qemu-devel@nongnu.org; Wed, 23 Feb 2005 06:50:26 -0500 Received: from hermes.suse.de (hermes-ext.suse.de [195.135.221.8]) (using TLSv1 with cipher EDH-RSA-DES-CBC3-SHA (168/168 bits)) (No client certificate requested) by Cantor.suse.de (Postfix) with ESMTP id E33B714DF4FE for ; Wed, 23 Feb 2005 12:50:23 +0100 (CET) From: Ulrich Hecht Date: Wed, 23 Feb 2005 12:50:22 +0100 MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_+3GHCQchcCmP3Nu" Message-Id: <200502231250.22518.uli@suse.de> Subject: [Qemu-devel] *-user fixes Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org --Boundary-00=_+3GHCQchcCmP3Nu Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi! qemu-sigfpe.patch: send SIGFPE in case of ARM FPA exceptions. No idea if this is 100% correct, but it's good enough to convince the glibc test suite. qemu-syscalls.patch: some trivial syscall implementations; I only needed (and tested) madvise, but while I was there I noticed a number of other syscalls that can be implemented without much effort. qemu-jobsignals.patch: proper SIGTSTP/SIGCONT default handling; makes suspending/resuming my editor work. CU Uli --Boundary-00=_+3GHCQchcCmP3Nu Content-Type: text/x-diff; charset="us-ascii"; name="qemu-sigfpe.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="qemu-sigfpe.patch" Index: linux-user/main.c =================================================================== RCS file: /cvsroot/qemu/qemu/linux-user/main.c,v retrieving revision 1.61 diff -u -r1.61 main.c --- linux-user/main.c 19 Feb 2005 17:25:31 -0000 1.61 +++ linux-user/main.c 22 Feb 2005 14:54:46 -0000 @@ -325,17 +325,40 @@ { TaskState *ts = env->opaque; uint32_t opcode; + int rc; /* we handle the FPU emulation here, as Linux */ /* we get the opcode */ opcode = ldl_raw((uint8_t *)env->regs[15]); - if (EmulateAll(opcode, &ts->fpa, env->regs) == 0) { + /* copied from softfloat library */ + enum { + float_flag_invalid = 1, + float_flag_divbyzero = 2, + float_flag_overflow = 4, + float_flag_underflow = 8, + float_flag_inexact = 16 + }; + + if ((rc=EmulateAll(opcode, &ts->fpa, env->regs)) == 0) { info.si_signo = SIGILL; info.si_errno = 0; info.si_code = TARGET_ILL_ILLOPN; info._sifields._sigfault._addr = env->regs[15]; queue_signal(info.si_signo, &info); + } else if (rc < 0 && rc != -float_flag_inexact) { + info.si_signo = SIGFPE; + info.si_errno = 0; + switch(-rc) + { + case float_flag_invalid: info.si_code = TARGET_FPE_FLTINV; break; + case float_flag_divbyzero: info.si_code = TARGET_FPE_FLTDIV ; break; + case float_flag_overflow: info.si_code = TARGET_FPE_FLTOVF; break; + case float_flag_underflow: info.si_code = TARGET_FPE_FLTUND ; break; + default: break; + } + info._sifields._sigfault._addr = env->regs[15]; + queue_signal(info.si_signo, &info); } else { /* increment PC */ env->regs[15] += 4; Index: target-arm/nwfpe/fpa11.c =================================================================== RCS file: /cvsroot/qemu/qemu/target-arm/nwfpe/fpa11.c,v retrieving revision 1.1 diff -u -r1.1 fpa11.c --- target-arm/nwfpe/fpa11.c 16 Feb 2004 21:43:58 -0000 1.1 +++ target-arm/nwfpe/fpa11.c 22 Feb 2005 14:54:46 -0000 @@ -185,6 +185,11 @@ } // restore_flags(flags); + if(nRc == 1 && float_exception_flags) + { + //printf("fef 0x%x\n",float_exception_flags); + nRc=-float_exception_flags; + } //printf("returning %d\n",nRc); return(nRc); --Boundary-00=_+3GHCQchcCmP3Nu Content-Type: text/x-diff; charset="us-ascii"; name="qemu-jobsignals.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="qemu-jobsignals.patch" Index: linux-user/signal.c =================================================================== RCS file: /cvsroot/qemu/qemu/linux-user/signal.c,v retrieving revision 1.27 diff -u -r1.27 signal.c --- linux-user/signal.c 30 Jan 2005 22:59:18 -0000 1.27 +++ linux-user/signal.c 22 Feb 2005 14:54:46 -0000 @@ -348,10 +348,15 @@ k = &sigact_table[sig - 1]; handler = k->sa._sa_handler; if (handler == TARGET_SIG_DFL) { + if (sig == TARGET_SIGTSTP || sig == TARGET_SIGTTIN || sig == TARGET_SIGTTOU) { + kill(getpid(),SIGSTOP); + return 0; + } else /* default handler : ignore some signal. The other are fatal */ if (sig != TARGET_SIGCHLD && sig != TARGET_SIGURG && - sig != TARGET_SIGWINCH) { + sig != TARGET_SIGWINCH && + sig != TARGET_SIGCONT) { force_sig(sig); } else { return 0; /* indicate ignored */ --Boundary-00=_+3GHCQchcCmP3Nu Content-Type: text/x-diff; charset="us-ascii"; name="qemu-syscalls.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="qemu-syscalls.patch" Index: Makefile.target =================================================================== RCS file: /cvsroot/qemu/qemu/Makefile.target,v retrieving revision 1.57 diff -u -r1.57 Makefile.target --- Makefile.target 10 Feb 2005 21:48:51 -0000 1.57 +++ Makefile.target 22 Feb 2005 15:40:57 -0000 @@ -209,7 +209,7 @@ ######################################################### -DEFINES+=-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE +DEFINES+=-D_GNU_SOURCE -D_BSD_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE LIBS+=-lm ifndef CONFIG_USER_ONLY LIBS+=-lz Index: linux-user/syscall.c =================================================================== RCS file: /cvsroot/qemu/qemu/linux-user/syscall.c,v retrieving revision 1.57 diff -u -r1.57 syscall.c --- linux-user/syscall.c 31 Jan 2005 20:45:13 -0000 1.57 +++ linux-user/syscall.c 22 Feb 2005 15:40:58 -0000 @@ -207,6 +207,7 @@ #define __NR_sys_getdents __NR_getdents #define __NR_sys_getdents64 __NR_getdents64 #define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo +#define __NR_sys_syslog __NR_syslog #if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__) #define __NR__llseek __NR_lseek @@ -228,6 +229,7 @@ _syscall2(int,sys_statfs,const char *,path,struct kernel_statfs *,buf) _syscall2(int,sys_fstatfs,int,fd,struct kernel_statfs *,buf) _syscall3(int,sys_rt_sigqueueinfo,int,pid,int,sig,siginfo_t *,uinfo) +_syscall3(int,sys_syslog,int,type,char*,bufp,int,len) #ifdef __NR_exit_group _syscall1(int,exit_group,int,error_code) #endif @@ -241,6 +243,7 @@ extern int setresgid(gid_t, gid_t, gid_t); extern int getresgid(gid_t *, gid_t *, gid_t *); extern int setgroups(int, gid_t *); +extern int uselib(const char*); static inline long get_errno(long ret) { @@ -577,7 +580,9 @@ case SO_OOBINLINE: case SO_NO_CHECK: case SO_PRIORITY: +#ifdef SO_BSDCOMPAT case SO_BSDCOMPAT: +#endif case SO_PASSCRED: case SO_TIMESTAMP: case SO_RCVLOWAT: @@ -1828,7 +1833,9 @@ goto unimplemented; case TARGET_NR_acct: - goto unimplemented; + ret = get_errno(acct(path((const char*)arg1))); + break; + case TARGET_NR_umount2: ret = get_errno(umount2((const char *)arg1, arg2)); break; @@ -2140,7 +2147,9 @@ ret = get_errno(readlink(path((const char *)arg1), (char *)arg2, arg3)); break; case TARGET_NR_uselib: - goto unimplemented; + ret = get_errno(uselib(path((const char*)arg1))); + break; + case TARGET_NR_swapon: ret = get_errno(swapon((const char *)arg1, arg2)); break; @@ -2255,7 +2264,9 @@ ret = do_socketcall(arg1, (int32_t *)arg2); break; case TARGET_NR_syslog: - goto unimplemented; + ret = get_errno(sys_syslog((int)arg1, (char*)arg2, (int)arg3)); + break; + case TARGET_NR_setitimer: { struct target_itimerval *target_value = (void *)arg2; @@ -3045,11 +3057,14 @@ goto unimplemented; #ifdef TARGET_NR_mincore case TARGET_NR_mincore: - goto unimplemented; + page_unprotect_range((void*)arg3, ((size_t)arg2 + TARGET_PAGE_SIZE - 1) / TARGET_PAGE_SIZE); + ret = get_errno(mincore((void*)arg1, (size_t)arg2, (unsigned char*)arg3)); + break; #endif #ifdef TARGET_NR_madvise case TARGET_NR_madvise: - goto unimplemented; + ret = get_errno(madvise((void*)arg1, (size_t)arg2, (int)arg3)); + break; #endif #if TARGET_LONG_BITS == 32 case TARGET_NR_fcntl64: @@ -3098,7 +3113,8 @@ ret = get_errno(gettid()); break; case TARGET_NR_readahead: - goto unimplemented; + ret = get_errno(readahead((int)arg1, (off64_t)arg2, (size_t)arg3)); + break; #ifdef TARGET_NR_setxattr case TARGET_NR_setxattr: case TARGET_NR_lsetxattr: --Boundary-00=_+3GHCQchcCmP3Nu--