Commit cdba95bd96ae74557b8af89c6c1d75c3aebf6f81
1 parent
8ef92a88
Fix BSD user compilation on other than OpenBSD
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5777 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
41 additions
and
7 deletions
bsd-user/main.c
| @@ -186,9 +186,6 @@ void cpu_loop(CPUSPARCState *env, enum BSDType bsd_type) | @@ -186,9 +186,6 @@ void cpu_loop(CPUSPARCState *env, enum BSDType bsd_type) | ||
| 186 | case 0x100: | 186 | case 0x100: |
| 187 | #endif | 187 | #endif |
| 188 | syscall_nr = env->gregs[1]; | 188 | syscall_nr = env->gregs[1]; |
| 189 | -#if defined(TARGET_SPARC) | ||
| 190 | - syscall_nr &= ~(SYSCALL_G7RFLAG | SYSCALL_G2RFLAG); | ||
| 191 | -#endif | ||
| 192 | if (bsd_type == target_freebsd) | 189 | if (bsd_type == target_freebsd) |
| 193 | ret = do_freebsd_syscall(env, syscall_nr, | 190 | ret = do_freebsd_syscall(env, syscall_nr, |
| 194 | env->regwptr[0], env->regwptr[1], | 191 | env->regwptr[0], env->regwptr[1], |
| @@ -199,11 +196,16 @@ void cpu_loop(CPUSPARCState *env, enum BSDType bsd_type) | @@ -199,11 +196,16 @@ void cpu_loop(CPUSPARCState *env, enum BSDType bsd_type) | ||
| 199 | env->regwptr[0], env->regwptr[1], | 196 | env->regwptr[0], env->regwptr[1], |
| 200 | env->regwptr[2], env->regwptr[3], | 197 | env->regwptr[2], env->regwptr[3], |
| 201 | env->regwptr[4], env->regwptr[5]); | 198 | env->regwptr[4], env->regwptr[5]); |
| 202 | - else //if (bsd_type == target_openbsd) | 199 | + else { //if (bsd_type == target_openbsd) |
| 200 | +#if defined(TARGET_SPARC64) | ||
| 201 | + syscall_nr &= ~(TARGET_OPENBSD_SYSCALL_G7RFLAG | | ||
| 202 | + TARGET_OPENBSD_SYSCALL_G2RFLAG); | ||
| 203 | +#endif | ||
| 203 | ret = do_openbsd_syscall(env, syscall_nr, | 204 | ret = do_openbsd_syscall(env, syscall_nr, |
| 204 | env->regwptr[0], env->regwptr[1], | 205 | env->regwptr[0], env->regwptr[1], |
| 205 | env->regwptr[2], env->regwptr[3], | 206 | env->regwptr[2], env->regwptr[3], |
| 206 | env->regwptr[4], env->regwptr[5]); | 207 | env->regwptr[4], env->regwptr[5]); |
| 208 | + } | ||
| 207 | if ((unsigned int)ret >= (unsigned int)(-515)) { | 209 | if ((unsigned int)ret >= (unsigned int)(-515)) { |
| 208 | #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32) | 210 | #if defined(TARGET_SPARC64) && !defined(TARGET_ABI32) |
| 209 | env->xcc |= PSR_CARRY; | 211 | env->xcc |= PSR_CARRY; |
| @@ -219,11 +221,13 @@ void cpu_loop(CPUSPARCState *env, enum BSDType bsd_type) | @@ -219,11 +221,13 @@ void cpu_loop(CPUSPARCState *env, enum BSDType bsd_type) | ||
| 219 | } | 221 | } |
| 220 | env->regwptr[0] = ret; | 222 | env->regwptr[0] = ret; |
| 221 | /* next instruction */ | 223 | /* next instruction */ |
| 222 | -#if defined(TARGET_SPARC) | ||
| 223 | - if (env->gregs[1] & SYSCALL_G2RFLAG) { | 224 | +#if defined(TARGET_SPARC64) |
| 225 | + if (bsd_type == target_openbsd && | ||
| 226 | + env->gregs[1] & TARGET_OPENBSD_SYSCALL_G2RFLAG) { | ||
| 224 | env->pc = env->gregs[2]; | 227 | env->pc = env->gregs[2]; |
| 225 | env->npc = env->pc + 4; | 228 | env->npc = env->pc + 4; |
| 226 | - } else if (env->gregs[1] & SYSCALL_G7RFLAG) { | 229 | + } else if (bsd_type == target_openbsd && |
| 230 | + env->gregs[1] & TARGET_OPENBSD_SYSCALL_G7RFLAG) { | ||
| 227 | env->pc = env->gregs[7]; | 231 | env->pc = env->gregs[7]; |
| 228 | env->npc = env->pc + 4; | 232 | env->npc = env->pc + 4; |
| 229 | } else { | 233 | } else { |
bsd-user/openbsd/syscall_nr.h
| @@ -193,3 +193,33 @@ | @@ -193,3 +193,33 @@ | ||
| 193 | #define TARGET_OPENBSD_NR_statfs 307 | 193 | #define TARGET_OPENBSD_NR_statfs 307 |
| 194 | #define TARGET_OPENBSD_NR_fstatfs 308 | 194 | #define TARGET_OPENBSD_NR_fstatfs 308 |
| 195 | #define TARGET_OPENBSD_NR_fhstatfs 309 | 195 | #define TARGET_OPENBSD_NR_fhstatfs 309 |
| 196 | + | ||
| 197 | +/* syscall flags from machine/trap.h */ | ||
| 198 | + | ||
| 199 | +/* $OpenBSD: trap.h,v 1.4 2008/07/04 22:04:37 kettenis Exp $ */ | ||
| 200 | +/* $NetBSD: trap.h,v 1.4 1999/06/07 05:28:04 eeh Exp $ */ | ||
| 201 | + | ||
| 202 | +/* | ||
| 203 | + * Copyright (c) 1996-1999 Eduardo Horvath | ||
| 204 | + * | ||
| 205 | + * Redistribution and use in source and binary forms, with or without | ||
| 206 | + * modification, are permitted provided that the following conditions | ||
| 207 | + * are met: | ||
| 208 | + * 1. Redistributions of source code must retain the above copyright | ||
| 209 | + * notice, this list of conditions and the following disclaimer. | ||
| 210 | + * | ||
| 211 | + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND | ||
| 212 | + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 213 | + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | ||
| 214 | + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE | ||
| 215 | + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 216 | + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | ||
| 217 | + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 218 | + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||
| 219 | + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||
| 220 | + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||
| 221 | + * SUCH DAMAGE. | ||
| 222 | + * | ||
| 223 | + */ | ||
| 224 | +#define TARGET_OPENBSD_SYSCALL_G2RFLAG 0x400 /* on success, return to %g2 rather than npc */ | ||
| 225 | +#define TARGET_OPENBSD_SYSCALL_G7RFLAG 0x800 /* use %g7 as above (deprecated) */ |