#include <PPC64LinuxSyscallConv.h>
Onikiri::PPC64Linux::PPC64LinuxSyscallConvに対する継承グラフ
Public メソッド | |
virtual void | Execute (EmulatorUtility::OpEmulationState *opState) |
PPC64LinuxSyscallConv (EmulatorUtility::ProcessState *processState) | |
virtual | ~PPC64LinuxSyscallConv () |
Protected メソッド | |
virtual int | Get_CLK_TCK () |
virtual int | Get_MAP_ANONYMOUS () |
virtual int | Get_MREMAP_MAYMOVE () |
virtual u32 | OpenFlagTargetToHost (u32 flag) |
PPC64LinuxSyscallConv.h の 49 行で定義されています。
PPC64LinuxSyscallConv::PPC64LinuxSyscallConv | ( | EmulatorUtility::ProcessState * | processState | ) |
PPC64LinuxSyscallConv::~PPC64LinuxSyscallConv | ( | ) | [virtual] |
void PPC64LinuxSyscallConv::Execute | ( | EmulatorUtility::OpEmulationState * | opState | ) | [virtual] |
Onikiri::EmulatorUtility::Linux64SyscallConvを実装しています。
PPC64LinuxSyscallConv.cpp の 151 行で定義されています。
参照先 argcnt・argtempl・Onikiri::EmulatorUtility::SyscallConvIF::ErrorFlagIndex・Onikiri::EmulatorUtility::Linux64SyscallConv::GetArg()・Onikiri::EmulatorUtility::Linux64SyscallConv::GetMemorySystem()・Onikiri::EmulatorUtility::OpEmulationState::GetPC()・Onikiri::EmulatorUtility::Linux64SyscallConv::GetResult()・name・Onikiri::EmulatorUtility::SyscallConvIF::RetValueIndex・Onikiri::EmulatorUtility::Linux64SyscallConv::SetResult()・Onikiri::EmulatorUtility::OpEmulationState::SetTaken()・Onikiri::EmulatorUtility::OpEmulationState::SetTakenPC()・Onikiri::EmulatorUtility::StrCpyToHost()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_brk()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_close()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_dup()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_exit()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_fcntl()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_fstat64()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_ftruncate()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_getcwd()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_getegid()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_geteuid()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_getgid()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_getpid()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_gettimeofday()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_getuid()・Onikiri::AlphaLinux::SyscallID::syscall_id_brk・Onikiri::AlphaLinux::SyscallID::syscall_id_close・Onikiri::AlphaLinux::SyscallID::syscall_id_dup・Onikiri::AlphaLinux::SyscallID::syscall_id_exit・Onikiri::AlphaLinux::SyscallID::syscall_id_exit_group・Onikiri::AlphaLinux::SyscallID::syscall_id_fcntl・Onikiri::AlphaLinux::SyscallID::syscall_id_fstat・Onikiri::AlphaLinux::SyscallID::syscall_id_ftruncate・Onikiri::AlphaLinux::SyscallID::syscall_id_getcwd・Onikiri::PPC64Linux::SyscallID::syscall_id_getegid・Onikiri::PPC64Linux::SyscallID::syscall_id_geteuid・Onikiri::PPC64Linux::SyscallID::syscall_id_getgid・Onikiri::PPC64Linux::SyscallID::syscall_id_getpid・Onikiri::AlphaLinux::SyscallID::syscall_id_getrlimit・Onikiri::AlphaLinux::SyscallID::syscall_id_getrusage・Onikiri::AlphaLinux::SyscallID::syscall_id_gettid・Onikiri::AlphaLinux::SyscallID::syscall_id_gettimeofday・Onikiri::PPC64Linux::SyscallID::syscall_id_getuid・Onikiri::AlphaLinux::SyscallID::syscall_id_ioctl・Onikiri::AlphaLinux::SyscallID::syscall_id_kill・Onikiri::AlphaLinux::SyscallID::syscall_id_lseek・Onikiri::AlphaLinux::SyscallID::syscall_id_lstat・Onikiri::AlphaLinux::SyscallID::syscall_id_mmap・Onikiri::AlphaLinux::SyscallID::syscall_id_mremap・Onikiri::AlphaLinux::SyscallID::syscall_id_munmap・Onikiri::AlphaLinux::SyscallID::syscall_id_open・Onikiri::AlphaLinux::SyscallID::syscall_id_read・Onikiri::AlphaLinux::SyscallID::syscall_id_readv・Onikiri::AlphaLinux::SyscallID::syscall_id_rename・Onikiri::AlphaLinux::SyscallID::syscall_id_rt_sigaction・Onikiri::AlphaLinux::SyscallID::syscall_id_rt_sigprocmask・Onikiri::AlphaLinux::SyscallID::syscall_id_setrlimit・Onikiri::AlphaLinux::SyscallID::syscall_id_stat・Onikiri::AlphaLinux::SyscallID::syscall_id_tgkill・Onikiri::PPC64Linux::SyscallID::syscall_id_time・Onikiri::AlphaLinux::SyscallID::syscall_id_times・Onikiri::AlphaLinux::SyscallID::syscall_id_truncate・Onikiri::AlphaLinux::SyscallID::syscall_id_uname・Onikiri::AlphaLinux::SyscallID::syscall_id_unlink・Onikiri::AlphaLinux::SyscallID::syscall_id_write・Onikiri::AlphaLinux::SyscallID::syscall_id_writev・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_ignore()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_ioctl()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_kill()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_lseek()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_lstat64()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_mmap()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_mremap()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_munmap()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_open()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_read()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_readv()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_rename()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_stat64()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_tgkill()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_time()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_times()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_truncate()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_uname()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_unlink()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_write()・Onikiri::EmulatorUtility::Linux64SyscallConv::syscall_writev()・syscallNo・THROW_RUNTIME_ERROR.
00152 { 00153 #ifdef SYSCALL_DEBUG 00154 static std::ofstream log("syscall.log", std::ios_base::out | std::ios_base::trunc); 00155 00156 log << dec << GetArg(0) << " "; 00157 for (size_t i = 0; i < sizeof(syscallTable)/sizeof(syscallTable[0]); i ++) { 00158 if (syscallTable[i].syscallNo == GetArg(0)) { 00159 log << syscallTable[i].name << "("; 00160 int argcnt = syscallTable[i].argcnt; 00161 const char *argtempl = syscallTable[i].argtempl; 00162 for (int j = 1; j <= argcnt; j ++) { 00163 switch (argtempl[j-1]) { 00164 case 's': 00165 { 00166 std::string s = StrCpyToHost( GetMemorySystem(), GetArg(j) ); 00167 log << "0x" << hex << GetArg(j) << dec; 00168 log << "=\"" << s << "\""; 00169 } 00170 break; 00171 case 'n': 00172 log << dec << (s64)GetArg(j); 00173 break; 00174 case 'p': 00175 case 'x': 00176 default: 00177 log << "0x" << hex << GetArg(j) << dec; 00178 break; 00179 } 00180 if (j != argcnt) 00181 log << ", "; 00182 } 00183 log << ")"; 00184 } 00185 } 00186 log << flush; 00187 #endif // #ifdef SYSCALL_DEBUG 00188 00189 opState->SetTakenPC( opState->GetPC()+4 ); 00190 opState->SetTaken(true); 00191 00192 SetResult(false, 0); 00193 switch (GetArg(0)) { 00194 case syscall_id_exit: 00195 case syscall_id_exit_group: 00196 syscall_exit(opState); 00197 break; 00198 case syscall_id_read: 00199 syscall_read(opState); 00200 break; 00201 case syscall_id_write: 00202 syscall_write(opState); 00203 break; 00204 case syscall_id_readv: 00205 syscall_readv(opState); 00206 break; 00207 case syscall_id_writev: 00208 syscall_writev(opState); 00209 break; 00210 case syscall_id_open: 00211 syscall_open(opState); 00212 break; 00213 case syscall_id_close: 00214 syscall_close(opState); 00215 break; 00216 00217 case syscall_id_lseek: 00218 syscall_lseek(opState); 00219 break; 00220 case syscall_id_unlink: 00221 syscall_unlink(opState); 00222 break; 00223 case syscall_id_rename: 00224 syscall_rename(opState); 00225 break; 00226 00227 00228 case syscall_id_mmap: 00229 syscall_mmap(opState); 00230 break; 00231 case syscall_id_mremap: 00232 syscall_mremap(opState); 00233 break; 00234 case syscall_id_munmap: 00235 syscall_munmap(opState); 00236 break; 00237 //case syscall_id_mprotect: 00238 // syscall_mprotect(opState); 00239 // break; 00240 case syscall_id_uname: 00241 syscall_uname(opState); 00242 break; 00243 case syscall_id_fcntl: 00244 syscall_fcntl(opState); 00245 break; 00246 case syscall_id_brk: 00247 syscall_brk(opState); 00248 break; 00249 case syscall_id_getpid: 00250 case syscall_id_gettid: 00251 syscall_getpid(opState); 00252 break; 00253 ////case syscall_id_setuid: 00254 //// syscall_setuid(opState); 00255 //// break; 00256 case syscall_id_getuid: 00257 syscall_getuid(opState); 00258 break; 00259 case syscall_id_geteuid: 00260 syscall_geteuid(opState); 00261 break; 00262 case syscall_id_getgid: 00263 syscall_getgid(opState); 00264 break; 00265 case syscall_id_getegid: 00266 syscall_getegid(opState); 00267 break; 00268 //case syscall_id_setgid: 00269 // syscall_setgid(opState); 00270 // break; 00271 //case syscall_id_seteuid: 00272 // syscall_seteuid(opState); 00273 // break; 00274 //case syscall_id_setegid: 00275 // syscall_setegid(opState); 00276 // break; 00277 //case syscall_id_setregid: 00278 // syscall_setregid(opState); 00279 // break; 00280 //case syscall_id_setreuid: 00281 // syscall_setreuid(opState); 00282 // break; 00283 //case syscall_id_access: 00284 // syscall_access(opState); 00285 // break; 00286 case syscall_id_stat: 00287 // case syscall_id_stat64: 00288 syscall_stat64(opState); 00289 break; 00290 case syscall_id_lstat: 00291 // case syscall_id_lstat64: 00292 syscall_lstat64(opState); 00293 break; 00294 case syscall_id_fstat: 00295 // case syscall_id_fstat64: 00296 syscall_fstat64(opState); 00297 break; 00298 case syscall_id_ioctl: 00299 syscall_ioctl(opState); 00300 break; 00301 //case syscall_id_readlink: 00302 // syscall_readlink(opState); 00303 // break; 00304 case syscall_id_time: 00305 syscall_time(opState); 00306 break; 00307 case syscall_id_times: 00308 syscall_times(opState); 00309 break; 00310 case syscall_id_gettimeofday: 00311 syscall_gettimeofday(opState); 00312 break; 00313 00314 case syscall_id_dup: 00315 syscall_dup(opState); 00316 break; 00317 case syscall_id_truncate: 00318 syscall_truncate(opState); 00319 break; 00320 case syscall_id_ftruncate: 00321 syscall_ftruncate(opState); 00322 break; 00323 00324 case syscall_id_kill: 00325 syscall_kill(opState); 00326 break; 00327 case syscall_id_tgkill: 00328 syscall_tgkill(opState); 00329 break; 00330 00331 00332 // signal functions 00333 case syscall_id_rt_sigaction: 00334 case syscall_id_rt_sigprocmask: 00335 syscall_ignore(opState); 00336 break; 00337 00338 // gcc stack ggp 00339 case syscall_id_getrlimit: 00340 syscall_ignore(opState); 00341 break; 00342 case syscall_id_setrlimit: 00343 syscall_ignore(opState); 00344 break; 00345 00346 //case syscall_id_mkdir: 00347 // syscall_mkdir(opState); 00348 // break; 00349 00350 // gcc タsgp 00351 case syscall_id_getrusage: 00352 syscall_ignore(opState); 00353 break; 00354 00355 case syscall_id_getcwd: 00356 syscall_getcwd(opState); 00357 break; 00358 default: 00359 { 00360 stringstream ss; 00361 ss << "unknown syscall " << GetArg(0) << " called"; 00362 THROW_RUNTIME_ERROR(ss.str().c_str()); 00363 } 00364 } 00365 #ifdef SYSCALL_DEBUG 00366 if (GetResult(ErrorFlagIndex)) 00367 log << " = error " << hex << GetResult(RetValueIndex) << std::endl; 00368 else 00369 log << " = " << hex << GetResult(RetValueIndex) << std::endl; 00370 #endif // #ifdef DEBUG 00371 }
関数の呼び出しグラフ:
int PPC64LinuxSyscallConv::Get_CLK_TCK | ( | ) | [protected, virtual] |
int PPC64LinuxSyscallConv::Get_MAP_ANONYMOUS | ( | ) | [protected, virtual] |
int PPC64LinuxSyscallConv::Get_MREMAP_MAYMOVE | ( | ) | [protected, virtual] |
Onikiri::EmulatorUtility::Linux64SyscallConvを実装しています。
PPC64LinuxSyscallConv.cpp の 396 行で定義されています。
参照先 Onikiri::EmulatorUtility::SyscallConstConvBitwise::TargetToHost().
00397 { 00398 static u32 host_open_flags[] = 00399 { 00400 POSIX_O_RDONLY, POSIX_O_WRONLY, POSIX_O_RDWR, 00401 POSIX_O_APPEND, 00402 POSIX_O_CREAT, 00403 POSIX_O_EXCL, 00404 //O_NOCTTY, 00405 //O_NONBLOCK, 00406 //O_SYNC, 00407 POSIX_O_TRUNC, 00408 }; 00409 // see bits/fcntl.h 00410 static u32 ppc64_open_flags[] = 00411 { 00412 00, 01, 02, // O_RDONLY, O_WRONLY, O_RDWR, 00413 02000, // O_APPEND 00414 00100, // O_CREAT 00415 00200, // O_EXCL 00416 //00400, // O_NOCTTY 00417 //04000, // O_NONBLOCK 00418 //010000, // O_SYNC 00419 01000, // O_TRUNC 00420 }; 00421 static int open_flags_size = sizeof(host_open_flags)/sizeof(host_open_flags[0]); 00422 00423 SyscallConstConvBitwise conv( 00424 host_open_flags, 00425 ppc64_open_flags, 00426 open_flags_size); 00427 00428 return conv.TargetToHost(flag); 00429 }
関数の呼び出しグラフ: