Annotation of qemu/bsd-user/syscall.c, revision 1.1

1.1     ! root        1: /*
        !             2:  *  BSD syscalls
        !             3:  *
        !             4:  *  Copyright (c) 2003 - 2008 Fabrice Bellard
        !             5:  *
        !             6:  *  This program is free software; you can redistribute it and/or modify
        !             7:  *  it under the terms of the GNU General Public License as published by
        !             8:  *  the Free Software Foundation; either version 2 of the License, or
        !             9:  *  (at your option) any later version.
        !            10:  *
        !            11:  *  This program is distributed in the hope that it will be useful,
        !            12:  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13:  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14:  *  GNU General Public License for more details.
        !            15:  *
        !            16:  *  You should have received a copy of the GNU General Public License
        !            17:  *  along with this program; if not, write to the Free Software
        !            18:  *  Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
        !            19:  *  MA 02110-1301, USA.
        !            20:  */
        !            21: #include <stdlib.h>
        !            22: #include <stdio.h>
        !            23: #include <stdint.h>
        !            24: #include <stdarg.h>
        !            25: #include <string.h>
        !            26: #include <errno.h>
        !            27: #include <unistd.h>
        !            28: #include <fcntl.h>
        !            29: #include <time.h>
        !            30: #include <limits.h>
        !            31: #include <sys/types.h>
        !            32: #include <sys/mman.h>
        !            33: #include <sys/syscall.h>
        !            34: #include <signal.h>
        !            35: #include <utime.h>
        !            36: 
        !            37: #include "qemu.h"
        !            38: #include "qemu-common.h"
        !            39: 
        !            40: //#define DEBUG
        !            41: 
        !            42: static abi_ulong target_brk;
        !            43: static abi_ulong target_original_brk;
        !            44: 
        !            45: #define get_errno(x) (x)
        !            46: #define target_to_host_bitmask(x, tbl) (x)
        !            47: 
        !            48: void target_set_brk(abi_ulong new_brk)
        !            49: {
        !            50:     target_original_brk = target_brk = HOST_PAGE_ALIGN(new_brk);
        !            51: }
        !            52: 
        !            53: /* do_syscall() should always have a single exit point at the end so
        !            54:    that actions, such as logging of syscall results, can be performed.
        !            55:    All errnos that do_syscall() returns must be -TARGET_<errcode>. */
        !            56: abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1,
        !            57:                             abi_long arg2, abi_long arg3, abi_long arg4,
        !            58:                             abi_long arg5, abi_long arg6)
        !            59: {
        !            60:     abi_long ret;
        !            61:     void *p;
        !            62: 
        !            63: #ifdef DEBUG
        !            64:     gemu_log("freebsd syscall %d\n", num);
        !            65: #endif
        !            66:     if(do_strace)
        !            67:         print_freebsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
        !            68: 
        !            69:     switch(num) {
        !            70:     case TARGET_FREEBSD_NR_exit:
        !            71: #ifdef HAVE_GPROF
        !            72:         _mcleanup();
        !            73: #endif
        !            74:         gdb_exit(cpu_env, arg1);
        !            75:         /* XXX: should free thread stack and CPU env */
        !            76:         _exit(arg1);
        !            77:         ret = 0; /* avoid warning */
        !            78:         break;
        !            79:     case TARGET_FREEBSD_NR_read:
        !            80:         if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
        !            81:             goto efault;
        !            82:         ret = get_errno(read(arg1, p, arg3));
        !            83:         unlock_user(p, arg2, ret);
        !            84:         break;
        !            85:     case TARGET_FREEBSD_NR_write:
        !            86:         if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
        !            87:             goto efault;
        !            88:         ret = get_errno(write(arg1, p, arg3));
        !            89:         unlock_user(p, arg2, 0);
        !            90:         break;
        !            91:     case TARGET_FREEBSD_NR_open:
        !            92:         if (!(p = lock_user_string(arg1)))
        !            93:             goto efault;
        !            94:         ret = get_errno(open(path(p),
        !            95:                              target_to_host_bitmask(arg2, fcntl_flags_tbl),
        !            96:                              arg3));
        !            97:         unlock_user(p, arg1, 0);
        !            98:         break;
        !            99:     case TARGET_FREEBSD_NR_mmap:
        !           100:         ret = get_errno(target_mmap(arg1, arg2, arg3,
        !           101:                                     target_to_host_bitmask(arg4, mmap_flags_tbl),
        !           102:                                     arg5,
        !           103:                                     arg6));
        !           104:         break;
        !           105:     case TARGET_FREEBSD_NR_mprotect:
        !           106:         ret = get_errno(target_mprotect(arg1, arg2, arg3));
        !           107:         break;
        !           108:     case TARGET_FREEBSD_NR_syscall:
        !           109:     case TARGET_FREEBSD_NR___syscall:
        !           110:         ret = do_freebsd_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,0);
        !           111:         break;
        !           112:     default:
        !           113:         ret = syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
        !           114:         break;
        !           115:     }
        !           116:  fail:
        !           117: #ifdef DEBUG
        !           118:     gemu_log(" = %ld\n", ret);
        !           119: #endif
        !           120:     if (do_strace)
        !           121:         print_freebsd_syscall_ret(num, ret);
        !           122:     return ret;
        !           123:  efault:
        !           124:     ret = -TARGET_EFAULT;
        !           125:     goto fail;
        !           126: }
        !           127: 
        !           128: abi_long do_netbsd_syscall(void *cpu_env, int num, abi_long arg1,
        !           129:                            abi_long arg2, abi_long arg3, abi_long arg4,
        !           130:                            abi_long arg5, abi_long arg6)
        !           131: {
        !           132:     abi_long ret;
        !           133:     void *p;
        !           134: 
        !           135: #ifdef DEBUG
        !           136:     gemu_log("netbsd syscall %d\n", num);
        !           137: #endif
        !           138:     if(do_strace)
        !           139:         print_netbsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
        !           140: 
        !           141:     switch(num) {
        !           142:     case TARGET_NETBSD_NR_exit:
        !           143: #ifdef HAVE_GPROF
        !           144:         _mcleanup();
        !           145: #endif
        !           146:         gdb_exit(cpu_env, arg1);
        !           147:         /* XXX: should free thread stack and CPU env */
        !           148:         _exit(arg1);
        !           149:         ret = 0; /* avoid warning */
        !           150:         break;
        !           151:     case TARGET_NETBSD_NR_read:
        !           152:         if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
        !           153:             goto efault;
        !           154:         ret = get_errno(read(arg1, p, arg3));
        !           155:         unlock_user(p, arg2, ret);
        !           156:         break;
        !           157:     case TARGET_NETBSD_NR_write:
        !           158:         if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
        !           159:             goto efault;
        !           160:         ret = get_errno(write(arg1, p, arg3));
        !           161:         unlock_user(p, arg2, 0);
        !           162:         break;
        !           163:     case TARGET_NETBSD_NR_open:
        !           164:         if (!(p = lock_user_string(arg1)))
        !           165:             goto efault;
        !           166:         ret = get_errno(open(path(p),
        !           167:                              target_to_host_bitmask(arg2, fcntl_flags_tbl),
        !           168:                              arg3));
        !           169:         unlock_user(p, arg1, 0);
        !           170:         break;
        !           171:     case TARGET_NETBSD_NR_mmap:
        !           172:         ret = get_errno(target_mmap(arg1, arg2, arg3,
        !           173:                                     target_to_host_bitmask(arg4, mmap_flags_tbl),
        !           174:                                     arg5,
        !           175:                                     arg6));
        !           176:         break;
        !           177:     case TARGET_NETBSD_NR_mprotect:
        !           178:         ret = get_errno(target_mprotect(arg1, arg2, arg3));
        !           179:         break;
        !           180:     case TARGET_NETBSD_NR_syscall:
        !           181:     case TARGET_NETBSD_NR___syscall:
        !           182:         ret = do_netbsd_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,0);
        !           183:         break;
        !           184:     default:
        !           185:         ret = syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
        !           186:         break;
        !           187:     }
        !           188:  fail:
        !           189: #ifdef DEBUG
        !           190:     gemu_log(" = %ld\n", ret);
        !           191: #endif
        !           192:     if (do_strace)
        !           193:         print_netbsd_syscall_ret(num, ret);
        !           194:     return ret;
        !           195:  efault:
        !           196:     ret = -TARGET_EFAULT;
        !           197:     goto fail;
        !           198: }
        !           199: 
        !           200: abi_long do_openbsd_syscall(void *cpu_env, int num, abi_long arg1,
        !           201:                             abi_long arg2, abi_long arg3, abi_long arg4,
        !           202:                             abi_long arg5, abi_long arg6)
        !           203: {
        !           204:     abi_long ret;
        !           205:     void *p;
        !           206: 
        !           207: #ifdef DEBUG
        !           208:     gemu_log("openbsd syscall %d\n", num);
        !           209: #endif
        !           210:     if(do_strace)
        !           211:         print_openbsd_syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
        !           212: 
        !           213:     switch(num) {
        !           214:     case TARGET_OPENBSD_NR_exit:
        !           215: #ifdef HAVE_GPROF
        !           216:         _mcleanup();
        !           217: #endif
        !           218:         gdb_exit(cpu_env, arg1);
        !           219:         /* XXX: should free thread stack and CPU env */
        !           220:         _exit(arg1);
        !           221:         ret = 0; /* avoid warning */
        !           222:         break;
        !           223:     case TARGET_OPENBSD_NR_read:
        !           224:         if (!(p = lock_user(VERIFY_WRITE, arg2, arg3, 0)))
        !           225:             goto efault;
        !           226:         ret = get_errno(read(arg1, p, arg3));
        !           227:         unlock_user(p, arg2, ret);
        !           228:         break;
        !           229:     case TARGET_OPENBSD_NR_write:
        !           230:         if (!(p = lock_user(VERIFY_READ, arg2, arg3, 1)))
        !           231:             goto efault;
        !           232:         ret = get_errno(write(arg1, p, arg3));
        !           233:         unlock_user(p, arg2, 0);
        !           234:         break;
        !           235:     case TARGET_OPENBSD_NR_open:
        !           236:         if (!(p = lock_user_string(arg1)))
        !           237:             goto efault;
        !           238:         ret = get_errno(open(path(p),
        !           239:                              target_to_host_bitmask(arg2, fcntl_flags_tbl),
        !           240:                              arg3));
        !           241:         unlock_user(p, arg1, 0);
        !           242:         break;
        !           243:     case TARGET_OPENBSD_NR_mmap:
        !           244:         ret = get_errno(target_mmap(arg1, arg2, arg3,
        !           245:                                     target_to_host_bitmask(arg4, mmap_flags_tbl),
        !           246:                                     arg5,
        !           247:                                     arg6));
        !           248:         break;
        !           249:     case TARGET_OPENBSD_NR_mprotect:
        !           250:         ret = get_errno(target_mprotect(arg1, arg2, arg3));
        !           251:         break;
        !           252:     case TARGET_OPENBSD_NR_syscall:
        !           253:     case TARGET_OPENBSD_NR___syscall:
        !           254:         ret = do_openbsd_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,0);
        !           255:         break;
        !           256:     default:
        !           257:         ret = syscall(num, arg1, arg2, arg3, arg4, arg5, arg6);
        !           258:         break;
        !           259:     }
        !           260:  fail:
        !           261: #ifdef DEBUG
        !           262:     gemu_log(" = %ld\n", ret);
        !           263: #endif
        !           264:     if (do_strace)
        !           265:         print_openbsd_syscall_ret(num, ret);
        !           266:     return ret;
        !           267:  efault:
        !           268:     ret = -TARGET_EFAULT;
        !           269:     goto fail;
        !           270: }
        !           271: 
        !           272: void syscall_init(void)
        !           273: {
        !           274: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.