| /* |
| * Copyright (c) 2003-2005 The Regents of The University of Michigan |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer; |
| * redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution; |
| * neither the name of the copyright holders nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * Authors: Ali Saidi |
| */ |
| |
| #include "arch/sparc/solaris/process.hh" |
| |
| #include "arch/sparc/isa_traits.hh" |
| #include "arch/sparc/registers.hh" |
| #include "base/loader/object_file.hh" |
| #include "base/trace.hh" |
| #include "cpu/thread_context.hh" |
| #include "kern/solaris/solaris.hh" |
| #include "sim/process.hh" |
| #include "sim/syscall_desc.hh" |
| #include "sim/syscall_emul.hh" |
| |
| using namespace std; |
| using namespace SparcISA; |
| |
| namespace |
| { |
| |
| class SparcSolarisObjectFileLoader : public Process::Loader |
| { |
| public: |
| Process * |
| load(ProcessParams *params, ObjectFile *obj_file) override |
| { |
| auto arch = obj_file->getArch(); |
| auto opsys = obj_file->getOpSys(); |
| |
| if (arch != ObjectFile::SPARC64 && arch != ObjectFile::SPARC32) |
| return nullptr; |
| |
| if (opsys != ObjectFile::Solaris) |
| return nullptr; |
| |
| return new SparcSolarisProcess(params, obj_file); |
| } |
| }; |
| |
| SparcSolarisObjectFileLoader loader; |
| |
| } // anonymous namespace |
| |
| |
| /// Target uname() handler. |
| static SyscallReturn |
| unameFunc(SyscallDesc *desc, int callnum, ThreadContext *tc) |
| { |
| int index = 0; |
| auto process = tc->getProcessPtr(); |
| TypedBufferArg<Solaris::utsname> name(process->getSyscallArg(tc, index)); |
| |
| strcpy(name->sysname, "SunOS"); |
| strcpy(name->nodename, "m5.eecs.umich.edu"); |
| strcpy(name->release, process->release.c_str()); |
| strcpy(name->version, "Generic_118558-21"); |
| strcpy(name->machine, "sun4u"); |
| |
| name.copyOut(tc->getVirtProxy()); |
| |
| return 0; |
| } |
| |
| |
| SyscallDescABI<DefaultSyscallABI> SparcSolarisProcess::syscallDescs[] = { |
| /* 0 */ { "syscall" }, |
| /* 1 */ { "exit", exitFunc }, |
| /* 2 */ { "fork" }, |
| /* 3 */ { "read", readFunc<SparcSolaris> }, |
| /* 4 */ { "write", writeFunc<SparcSolaris> }, |
| /* 5 */ { "open", openFunc<SparcSolaris> }, |
| /* 6 */ { "close", closeFunc }, |
| /* 7 */ { "wait" }, |
| /* 8 */ { "creat" }, |
| /* 9 */ { "link" }, |
| /* 10 */ { "unlink", unlinkFunc }, |
| /* 11 */ { "exec" }, |
| /* 12 */ { "chdir" }, |
| /* 13 */ { "time" }, |
| /* 14 */ { "mknod" }, |
| /* 15 */ { "chmod", chmodFunc<Solaris> }, |
| /* 16 */ { "chown", chownFunc }, |
| /* 17 */ { "brk", brkFunc }, |
| /* 18 */ { "stat" }, |
| /* 19 */ { "lseek", lseekFunc }, |
| /* 20 */ { "getpid", getpidFunc }, |
| /* 21 */ { "mount" }, |
| /* 22 */ { "umount" }, |
| /* 23 */ { "setuid", ignoreFunc }, |
| /* 24 */ { "getuid", getuidFunc }, |
| /* 25 */ { "stime" }, |
| /* 26 */ { "pcsample" }, |
| /* 27 */ { "alarm" }, |
| /* 28 */ { "fstat", fstatFunc<SparcSolaris> }, |
| /* 29 */ { "pause" }, |
| /* 30 */ { "utime" }, |
| /* 31 */ { "stty" }, |
| /* 32 */ { "gtty" }, |
| /* 33 */ { "access" }, |
| /* 34 */ { "nice" }, |
| /* 35 */ { "statfs" }, |
| /* 36 */ { "sync" }, |
| /* 37 */ { "kill" }, |
| /* 38 */ { "fstatfs" }, |
| /* 39 */ { "pgrpsys" }, |
| /* 40 */ { "xenix" }, |
| /* 41 */ { "dup" }, |
| /* 42 */ { "pipe", pipePseudoFunc }, |
| /* 43 */ { "times" }, |
| /* 44 */ { "profil" }, |
| /* 45 */ { "plock" }, |
| /* 46 */ { "setgid" }, |
| /* 47 */ { "getgid", getgidFunc }, |
| /* 48 */ { "signal" }, |
| /* 49 */ { "msgsys" }, |
| /* 50 */ { "syssun" }, |
| /* 51 */ { "acct" }, |
| /* 52 */ { "shmsys" }, |
| /* 53 */ { "semsys" }, |
| /* 54 */ { "ioctl" }, |
| /* 55 */ { "uadmin" }, |
| /* 56 */ { "RESERVED" }, |
| /* 57 */ { "utssys" }, |
| /* 58 */ { "fdsync" }, |
| /* 59 */ { "execve" }, |
| /* 60 */ { "umask", umaskFunc }, |
| /* 61 */ { "chroot" }, |
| /* 62 */ { "fcntl" }, |
| /* 63 */ { "ulimit" }, |
| /* 64 */ { "reserved_64" }, |
| /* 65 */ { "reserved_65" }, |
| /* 66 */ { "reserved_66" }, |
| /* 67 */ { "reserved_67" }, |
| /* 68 */ { "reserved_68" }, |
| /* 69 */ { "reserved_69" }, |
| /* 70 */ { "tasksys" }, |
| /* 71 */ { "acctctl" }, |
| /* 72 */ { "reserved_72" }, |
| /* 73 */ { "getpagesizes" }, |
| /* 74 */ { "rctlsys" }, |
| /* 75 */ { "issetugid" }, |
| /* 76 */ { "fsat" }, |
| /* 77 */ { "lwp_park" }, |
| /* 78 */ { "sendfilev" }, |
| /* 79 */ { "rmdir" }, |
| /* 80 */ { "mkdir" }, |
| /* 81 */ { "getdents" }, |
| /* 82 */ { "reserved_82" }, |
| /* 83 */ { "reserved_83" }, |
| /* 84 */ { "sysfs" }, |
| /* 85 */ { "getmsg" }, |
| /* 86 */ { "putmsg" }, |
| /* 87 */ { "poll" }, |
| /* 88 */ { "lstat" }, |
| /* 89 */ { "symlink" }, |
| /* 90 */ { "readlink", readlinkFunc }, |
| /* 91 */ { "setgroups" }, |
| /* 92 */ { "getgroups" }, |
| /* 93 */ { "fchmod" }, |
| /* 94 */ { "fchown" }, |
| /* 95 */ { "sigprocmask" }, |
| /* 96 */ { "sigsuspend" }, |
| /* 97 */ { "sigaltstack" }, |
| /* 98 */ { "sigaction" }, |
| /* 99 */ { "sigpending" }, |
| /* 100 */ { "context" }, |
| /* 101 */ { "evsys" }, |
| /* 102 */ { "evtrapret" }, |
| /* 103 */ { "statvfs" }, |
| /* 104 */ { "fstatvfs" }, |
| /* 105 */ { "getloadavg" }, |
| /* 106 */ { "nfssys" }, |
| /* 107 */ { "waitsys" }, |
| /* 108 */ { "sigsendsys" }, |
| /* 109 */ { "hrtsys" }, |
| /* 110 */ { "acancel" }, |
| /* 111 */ { "async" }, |
| /* 112 */ { "priocntlsys" }, |
| /* 113 */ { "pathconf" }, |
| /* 114 */ { "mincore" }, |
| /* 115 */ { "mmap", mmapFunc<SparcSolaris> }, |
| /* 116 */ { "mprotect" }, |
| /* 117 */ { "munmap", munmapFunc }, |
| /* 118 */ { "fpathconf" }, |
| /* 119 */ { "vfork" }, |
| /* 120 */ { "fchdir" }, |
| /* 121 */ { "readv" }, |
| /* 122 */ { "writev" }, |
| /* 123 */ { "xstat" }, |
| /* 124 */ { "lxstat" }, |
| /* 125 */ { "fxstat" }, |
| /* 126 */ { "xmknod" }, |
| /* 127 */ { "clocal" }, |
| /* 128 */ { "setrlimit" }, |
| /* 129 */ { "getrlimit" }, |
| /* 130 */ { "lchown" }, |
| /* 131 */ { "memcntl" }, |
| /* 132 */ { "getpmsg" }, |
| /* 133 */ { "putpmsg" }, |
| /* 134 */ { "rename" }, |
| /* 135 */ { "uname", unameFunc }, |
| /* 136 */ { "setegid" }, |
| /* 137 */ { "sysconfig" }, |
| /* 138 */ { "adjtime" }, |
| /* 139 */ { "systeminfo" }, |
| /* 140 */ { "reserved_140" }, |
| /* 141 */ { "seteuid" }, |
| /* 142 */ { "vtrace" }, |
| /* 143 */ { "fork1" }, |
| /* 144 */ { "sigtimedwait" }, |
| /* 145 */ { "lwp_info" }, |
| /* 146 */ { "yield" }, |
| /* 147 */ { "lwp_sema_wait" }, |
| /* 148 */ { "lwp_sema_post" }, |
| /* 149 */ { "lwp_sema_trywait" }, |
| /* 150 */ { "lwp_detach" }, |
| /* 151 */ { "corectl" }, |
| /* 152 */ { "modctl" }, |
| /* 153 */ { "fchroot" }, |
| /* 154 */ { "utimes" }, |
| /* 155 */ { "vhangup" }, |
| /* 156 */ { "gettimeofday" }, |
| /* 157 */ { "getitimer" }, |
| /* 158 */ { "setitimer" }, |
| /* 159 */ { "lwp_create" }, |
| /* 160 */ { "lwp_exit" }, |
| /* 161 */ { "lwp_suspend" }, |
| /* 162 */ { "lwp_continue" }, |
| /* 163 */ { "lwp_kill" }, |
| /* 164 */ { "lwp_self" }, |
| /* 165 */ { "lwp_setprivate" }, |
| /* 166 */ { "lwp_getprivate" }, |
| /* 167 */ { "lwp_wait" }, |
| /* 168 */ { "lwp_mutex_wakeup" }, |
| /* 169 */ { "lwp_mutex_lock" }, |
| /* 170 */ { "lwp_cond_wait" }, |
| /* 171 */ { "lwp_cond_signal" }, |
| /* 172 */ { "lwp_cond_broadcast" }, |
| /* 173 */ { "pread" }, |
| /* 174 */ { "pwrite" }, |
| /* 175 */ { "llseek" }, |
| /* 176 */ { "inst_sync" }, |
| /* 177 */ { "srmlimitsys" }, |
| /* 178 */ { "kaio" }, |
| /* 179 */ { "cpc" }, |
| /* 180 */ { "lgrpsys_meminfosys" }, |
| /* 181 */ { "rusagesys" }, |
| /* 182 */ { "reserved_182" }, |
| /* 183 */ { "reserved_183" }, |
| /* 184 */ { "tsolsys" }, |
| /* 185 */ { "acl" }, |
| /* 186 */ { "auditsys" }, |
| /* 187 */ { "processor_bind" }, |
| /* 188 */ { "processor_info" }, |
| /* 189 */ { "p_online" }, |
| /* 190 */ { "sigqueue" }, |
| /* 191 */ { "clock_gettime" }, |
| /* 192 */ { "clock_settime" }, |
| /* 193 */ { "clock_getres" }, |
| /* 194 */ { "timer_create" }, |
| /* 195 */ { "timer_delete" }, |
| /* 196 */ { "timer_settime" }, |
| /* 197 */ { "timer_gettime" }, |
| /* 198 */ { "timer_getoverrun" }, |
| /* 199 */ { "nanosleep" }, |
| /* 200 */ { "facl" }, |
| /* 201 */ { "door" }, |
| /* 202 */ { "setreuid" }, |
| /* 203 */ { "setregid" }, |
| /* 204 */ { "install_utrap" }, |
| /* 205 */ { "signotify" }, |
| /* 206 */ { "schedctl" }, |
| /* 207 */ { "pset" }, |
| /* 208 */ { "sparc_utrap_install" }, |
| /* 209 */ { "resolvepath" }, |
| /* 210 */ { "signotifywait" }, |
| /* 211 */ { "lwp_sigredirect" }, |
| /* 212 */ { "lwp_alarm" }, |
| /* 213 */ { "getdents64" }, |
| /* 214 */ { "mmap64" }, |
| /* 215 */ { "stat64" }, |
| /* 216 */ { "lstat64" }, |
| /* 217 */ { "fstat64" }, |
| /* 218 */ { "statvfs64" }, |
| /* 219 */ { "fstatvfs64" }, |
| /* 220 */ { "setrlimit64" }, |
| /* 221 */ { "getrlimit64" }, |
| /* 222 */ { "pread64" }, |
| /* 223 */ { "pwrite64" }, |
| /* 224 */ { "creat64" }, |
| /* 225 */ { "open64" }, |
| /* 226 */ { "rpcsys" }, |
| /* 227 */ { "reserved_227" }, |
| /* 228 */ { "reserved_228" }, |
| /* 229 */ { "reserved_229" }, |
| /* 230 */ { "so_socket" }, |
| /* 231 */ { "so_socketpair" }, |
| /* 232 */ { "bind" }, |
| /* 233 */ { "listen" }, |
| /* 234 */ { "accept" }, |
| /* 235 */ { "connect" }, |
| /* 236 */ { "shutdown" }, |
| /* 237 */ { "recv" }, |
| /* 238 */ { "recvfrom" }, |
| /* 239 */ { "recvmsg" }, |
| /* 240 */ { "send" }, |
| /* 241 */ { "sendmsg" }, |
| /* 242 */ { "sendto" }, |
| /* 243 */ { "getpeername" }, |
| /* 244 */ { "getsockname" }, |
| /* 245 */ { "getsockopt" }, |
| /* 246 */ { "setsockopt" }, |
| /* 247 */ { "sockconfig" }, |
| /* 248 */ { "ntp_gettime" }, |
| /* 249 */ { "ntp_adjtime" }, |
| /* 250 */ { "lwp_mutex_unlock" }, |
| /* 251 */ { "lwp_mutex_trylock" }, |
| /* 252 */ { "lwp_mutex_init" }, |
| /* 253 */ { "cladm" }, |
| /* 254 */ { "lwp_sigtimedwait" }, |
| /* 255 */ { "umount2" } |
| }; |
| |
| SparcSolarisProcess::SparcSolarisProcess(ProcessParams * params, |
| ObjectFile *objFile) |
| : Sparc64Process(params, objFile), |
| Num_Syscall_Descs(sizeof(syscallDescs) / sizeof(SyscallDesc)) |
| { |
| // The sparc syscall table must be <= 284 entries because that is all there |
| // is space for. |
| assert(Num_Syscall_Descs <= 284); |
| } |
| |
| |
| |
| SyscallDesc* |
| SparcSolarisProcess::getDesc(int callnum) |
| { |
| if (callnum < 0 || callnum >= Num_Syscall_Descs) |
| return NULL; |
| return &syscallDescs[callnum]; |
| } |
| |
| void |
| SparcSolarisProcess::syscall(ThreadContext *tc, Fault *fault) |
| { |
| doSyscall(tc->readIntReg(1), tc, fault); |
| } |