クラス Onikiri::EmulatorUtility::Linux64SyscallConv

#include <Linux64SyscallConv.h>

Onikiri::EmulatorUtility::Linux64SyscallConvに対する継承グラフ

Inheritance graph
[凡例]
Onikiri::EmulatorUtility::Linux64SyscallConvのコラボレーション図

Collaboration graph
[凡例]
すべてのメンバ一覧

Public メソッド

virtual void Execute (EmulatorUtility::OpEmulationState *opState)=0
virtual u64 GetResult (int index)
 Linux64SyscallConv (EmulatorUtility::ProcessState *processState)
virtual void SetArg (int index, u64 value)
virtual void SetSystem (SystemIF *system)
virtual ~Linux64SyscallConv ()

Protected メソッド

virtual u32 AccessModeTargetToHost (u32 flag)
virtual int Get_CLK_TCK ()=0
virtual int Get_MAP_ANONYMOUS ()=0
virtual int Get_MREMAP_MAYMOVE ()=0
u64 GetArg (int index) const
EmulatorUtility::MemorySystemGetMemorySystem ()
EmulatorUtility::ProcessStateGetProcessState ()
EmulatorUtility::VirtualSystemGetVirtualSystem ()
void kill_helper (EmulatorUtility::OpEmulationState *opState, int pid, int sig)
virtual u32 OpenFlagTargetToHost (u32 flag)=0
virtual u32 SeekWhenceTargetToHost (u32 flag)
void SetResult (bool success, u64 result)
virtual void syscall_access (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_brk (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_close (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_dup (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_exit (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_fcntl (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_fstat64 (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_ftruncate (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_getcwd (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_getegid (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_geteuid (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_getgid (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_getpid (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_gettimeofday (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_getuid (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_ignore (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_ioctl (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_kill (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_lseek (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_lstat64 (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_mkdir (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_mmap (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_mprotect (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_mremap (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_munmap (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_open (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_read (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_readv (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_rename (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_stat64 (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_tgkill (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_time (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_times (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_truncate (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_uname (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_unlink (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_write (EmulatorUtility::OpEmulationState *opState)
virtual void syscall_writev (EmulatorUtility::OpEmulationState *opState)
virtual void write_stat64 (u64 dest, const EmulatorUtility::HostStat &src)

Static Protected 変数

static const int MaxArgCount = 16

説明

Linux64SyscallConv.h46 行で定義されています。


コンストラクタとデストラクタ

Linux64SyscallConv::Linux64SyscallConv ( EmulatorUtility::ProcessState processState  ) 

Linux64SyscallConv.cpp60 行で定義されています。

参照先 MaxArgCount.

00061     : m_processState(processState)
00062 {
00063     m_args.resize(MaxArgCount);
00064     m_results.resize(MaxResultCount);
00065 }

Linux64SyscallConv::~Linux64SyscallConv (  )  [virtual]

Linux64SyscallConv.cpp67 行で定義されています。

00068 {
00069 }


関数

u32 Linux64SyscallConv::AccessModeTargetToHost ( u32  flag  )  [protected, virtual]

Linux64SyscallConv.cpp658 行で定義されています。

参照先 Onikiri::EmulatorUtility::SyscallConstConvBitwise::TargetToHost().

参照元 syscall_access().

00659 {
00660     static u32 host_access_mode[] =
00661     {
00662         POSIX_F_OK,
00663         POSIX_X_OK,
00664         POSIX_W_OK,
00665         POSIX_R_OK
00666     };
00667     static u32 linux_access_mode[] =
00668     {
00669         LINUX_F_OK,
00670         LINUX_X_OK,
00671         LINUX_W_OK,
00672         LINUX_R_OK
00673     };
00674     static int access_mode_size = sizeof(host_access_mode)/sizeof(host_access_mode[0]);
00675     SyscallConstConvBitwise conv(
00676         host_access_mode,
00677         linux_access_mode, 
00678         access_mode_size);
00679 
00680     return conv.TargetToHost(flag);
00681 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

virtual void Onikiri::EmulatorUtility::Linux64SyscallConv::Execute ( EmulatorUtility::OpEmulationState opState  )  [pure virtual]

Onikiri::EmulatorUtility::SyscallConvIFを実装しています。

Onikiri::AlphaLinux::AlphaLinuxSyscallConvOnikiri::PPC64Linux::PPC64LinuxSyscallConvで実装されています。

virtual int Onikiri::EmulatorUtility::Linux64SyscallConv::Get_CLK_TCK (  )  [protected, pure virtual]

Onikiri::PPC64Linux::PPC64LinuxSyscallConvで実装されています。

参照元 syscall_times().

Here is the caller graph for this function:

virtual int Onikiri::EmulatorUtility::Linux64SyscallConv::Get_MAP_ANONYMOUS (  )  [protected, pure virtual]

Onikiri::PPC64Linux::PPC64LinuxSyscallConvで実装されています。

参照元 syscall_mmap().

Here is the caller graph for this function:

virtual int Onikiri::EmulatorUtility::Linux64SyscallConv::Get_MREMAP_MAYMOVE (  )  [protected, pure virtual]

Onikiri::PPC64Linux::PPC64LinuxSyscallConvで実装されています。

参照元 syscall_mremap().

Here is the caller graph for this function:

u64 Onikiri::EmulatorUtility::Linux64SyscallConv::GetArg ( int  index  )  const [inline, protected]

Linux64SyscallConv.h76 行で定義されています。

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00077             {
00078                 return m_args[index];
00079             }

Here is the caller graph for this function:

EmulatorUtility::MemorySystem* Onikiri::EmulatorUtility::Linux64SyscallConv::GetMemorySystem (  )  [inline, protected]

Linux64SyscallConv.h86 行で定義されています。

参照先 Onikiri::EmulatorUtility::ProcessState::GetMemorySystem().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute()syscall_access()syscall_brk()syscall_getcwd()syscall_gettimeofday()syscall_lstat64()syscall_mkdir()syscall_mmap()syscall_mremap()syscall_munmap()syscall_open()syscall_read()syscall_readv()syscall_rename()syscall_stat64()syscall_time()syscall_times()syscall_truncate()syscall_uname()syscall_unlink()syscall_write()syscall_writev()write_stat64().

00087             {
00088                 return m_processState->GetMemorySystem();
00089             }

関数の呼び出しグラフ:

Here is the caller graph for this function:

EmulatorUtility::ProcessState* Onikiri::EmulatorUtility::Linux64SyscallConv::GetProcessState (  )  [inline, protected]

Linux64SyscallConv.h81 行で定義されています。

00082             {
00083                 return m_processState;
00084             }

u64 Linux64SyscallConv::GetResult ( int  index  )  [virtual]

Onikiri::EmulatorUtility::SyscallConvIFを実装しています。

Linux64SyscallConv.cpp76 行で定義されています。

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00077 {
00078     return m_results.at(index);
00079 }

Here is the caller graph for this function:

EmulatorUtility::VirtualSystem* Onikiri::EmulatorUtility::Linux64SyscallConv::GetVirtualSystem (  )  [inline, protected]

Linux64SyscallConv.h91 行で定義されています。

参照先 Onikiri::EmulatorUtility::ProcessState::GetVirtualSystem().

参照元 Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute()syscall_access()syscall_close()syscall_dup()syscall_fstat64()syscall_ftruncate()syscall_getcwd()syscall_gettimeofday()syscall_lseek()syscall_lstat64()syscall_mkdir()syscall_open()syscall_read()syscall_readv()syscall_rename()syscall_stat64()syscall_time()syscall_times()syscall_truncate()syscall_unlink()syscall_write()syscall_writev().

00092             {
00093                 return m_processState->GetVirtualSystem();
00094             }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::kill_helper ( EmulatorUtility::OpEmulationState opState,
int  pid,
int  sig 
) [protected]

Linux64SyscallConv.cpp282 行で定義されています。

参照先 Onikiri::g_envOnikiri::Environment::Print()syscall_exit().

参照元 syscall_kill()syscall_tgkill().

00283 {
00284     if (arg_pid == posix_getpid()) {
00285         if (arg_sig == 6)   // SIGABRT
00286             g_env.Print("target program aborted.\n");
00287         else
00288             g_env.Print("signaling with kill not implemented yet.\n");
00289     }
00290     else {
00291         g_env.Print("target program attempted to kill another process.\n");
00292     }
00293 
00294     syscall_exit(opState);
00295 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

virtual u32 Onikiri::EmulatorUtility::Linux64SyscallConv::OpenFlagTargetToHost ( u32  flag  )  [protected, pure virtual]

Onikiri::PPC64Linux::PPC64LinuxSyscallConvで実装されています。

参照元 syscall_open().

Here is the caller graph for this function:

u32 Linux64SyscallConv::SeekWhenceTargetToHost ( u32  flag  )  [protected, virtual]

Linux64SyscallConv.cpp634 行で定義されています。

参照先 Onikiri::EmulatorUtility::SyscallConstConvEnum::TargetToHost().

参照元 syscall_lseek().

00635 {
00636     static u32 host_whence[] =
00637     {
00638         POSIX_SEEK_SET,
00639         POSIX_SEEK_CUR,
00640         POSIX_SEEK_END
00641     };
00642     static u32 linux_whence[] =
00643     {
00644         LINUX_SEEK_SET,
00645         LINUX_SEEK_CUR,
00646         LINUX_SEEK_END
00647     };
00648     static int whence_size = sizeof(host_whence)/sizeof(host_whence[0]);
00649     SyscallConstConvEnum conv(
00650         host_whence,
00651         linux_whence, 
00652         whence_size);
00653 
00654     return conv.TargetToHost(flag);
00655 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::SetArg ( int  index,
u64  value 
) [virtual]

Onikiri::EmulatorUtility::SyscallConvIFを実装しています。

Linux64SyscallConv.cpp71 行で定義されています。

00072 {
00073     m_args.at(index) = value;
00074 }

void Linux64SyscallConv::SetResult ( bool  success,
u64  result 
) [protected]

Linux64SyscallConv.cpp81 行で定義されています。

参照先 Onikiri::EmulatorUtility::SyscallConvIF::ErrorFlagIndexOnikiri::EmulatorUtility::SyscallConvIF::RetValueIndex.

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute()syscall_access()syscall_brk()syscall_close()syscall_dup()syscall_fcntl()syscall_fstat64()syscall_ftruncate()syscall_getcwd()syscall_getegid()syscall_geteuid()syscall_getgid()syscall_getpid()syscall_gettimeofday()syscall_getuid()syscall_ioctl()syscall_lseek()syscall_lstat64()syscall_mkdir()syscall_mmap()syscall_mprotect()syscall_mremap()syscall_munmap()syscall_open()syscall_read()syscall_readv()syscall_rename()syscall_stat64()syscall_time()syscall_times()syscall_truncate()syscall_uname()syscall_unlink()syscall_write()syscall_writev().

00082 {
00083     m_results[RetValueIndex] = result;
00084     m_results[ErrorFlagIndex] = success ? 0 : 1;    // error flag
00085 }

Here is the caller graph for this function:

void Linux64SyscallConv::SetSystem ( SystemIF system  )  [virtual]

Onikiri::EmulatorUtility::SyscallConvIFを実装しています。

Linux64SyscallConv.cpp87 行で定義されています。

00088 {
00089     m_simulatorSystem = system;
00090 }

void Linux64SyscallConv::syscall_access ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp518 行で定義されています。

参照先 Onikiri::EmulatorUtility::VirtualSystem::Access()AccessModeTargetToHost()GetMemorySystem()GetVirtualSystem()SetResult()Onikiri::EmulatorUtility::StrCpyToHost().

参照元 Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00519 {
00520     string path = StrCpyToHost( GetMemorySystem(), m_args[1] );
00521     int result = GetVirtualSystem()->Access( path.c_str(), (int)AccessModeTargetToHost((u32)m_args[2]) );
00522     if (result == -1)
00523         SetResult(false, GetVirtualSystem()->GetErrno());
00524     else
00525         SetResult(true, result);
00526 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_brk ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp192 行で定義されています。

参照先 GetMemorySystem()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00193 {
00194     if (m_args[1] == 0) {
00195         SetResult(true, GetMemorySystem()->Brk(0));
00196         return;
00197     }
00198 
00199     if (GetMemorySystem()->Brk(m_args[1]) == (u64)-1) {
00200         SetResult(false, ENOMEM);
00201     }
00202     else {
00203         // Linux brkVXeR[CVbreak
00204         SetResult(true, GetMemorySystem()->Brk(0));
00205     }
00206 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_close ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp325 行で定義されています。

参照先 Onikiri::EmulatorUtility::VirtualSystem::Close()GetVirtualSystem()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00326 {
00327     int result = GetVirtualSystem()->Close((int)m_args[1]);
00328     if (result == -1)
00329         SetResult(false, GetVirtualSystem()->GetErrno());
00330     else
00331         SetResult(true, result);
00332 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_dup ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp334 行で定義されています。

参照先 Onikiri::EmulatorUtility::VirtualSystem::Dup()GetVirtualSystem()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00335 {
00336     int result = GetVirtualSystem()->Dup((int)m_args[1]);
00337     if (result == -1)
00338         SetResult(false, GetVirtualSystem()->GetErrno());
00339     else
00340         SetResult(true, result);
00341 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_exit ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp164 行で定義されています。

参照先 Onikiri::EmulatorUtility::OpEmulationState::GetPID()Onikiri::SystemIF::NotifyProcessTermination()Onikiri::EmulatorUtility::OpEmulationState::SetTaken()Onikiri::EmulatorUtility::OpEmulationState::SetTakenPC().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute()kill_helper().

00165 {
00166     opState->SetTakenPC(0);
00167     opState->SetTaken(true);
00168 
00169     m_simulatorSystem->NotifyProcessTermination(opState->GetPID());
00170 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_fcntl ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp493 行で定義されています。

参照先 SetResult()THROW_RUNTIME_ERROR.

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00494 {
00495     int cmd = (int)m_args[2];
00496     switch (cmd) {
00497     case LINUX_F_GETFD:
00498     case LINUX_F_SETFD:
00499         SetResult(true, 0);
00500         break;
00501     default:
00502         THROW_RUNTIME_ERROR("syscall_fcntl : unknown cmd");
00503     }
00504 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_fstat64 ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp437 行で定義されています。

参照先 Onikiri::EmulatorUtility::VirtualSystem::FStat()GetVirtualSystem()SetResult()write_stat64().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00438 {
00439     HostStat st;
00440     int result = GetVirtualSystem()->FStat((int)m_args[1], &st);
00441     if (result == -1) {
00442         SetResult(false, GetVirtualSystem()->GetErrno());
00443     }
00444     else {
00445 #ifdef HOST_IS_WINDOWS
00446         /*
00447         st.st_rdev  Windows  st.st_dev A
00448         (http://msdn.microsoft.com/ja-jp/library/14h5k7ff.aspx)
00449         Linux t@ClB
00450         Wo 0x8801 HivoTj
00451          st_rdev タspXAzXgogp
00452          0x8801 B
00453         i mcf  if(st.st_rdev >> 4)  Copyright A
00454         lタspXj
00455         */
00456         if(GetVirtualSystem()->GetDelayUnlinker()->GetMapPath((int)m_args[1]) == "HostIO"){
00457             st.st_rdev = 0x8801;
00458         }
00459 #endif
00460         write_stat64((u64)m_args[2], st);
00461         SetResult(true, result);
00462     }
00463 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_ftruncate ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp560 行で定義されています。

参照先 Onikiri::EmulatorUtility::VirtualSystem::FTruncate()GetVirtualSystem()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00561 {
00562     int result = GetVirtualSystem()->FTruncate( (int)m_args[1], (s64)m_args[2] );
00563     if (result == -1)
00564         SetResult(false, GetVirtualSystem()->GetErrno());
00565     else
00566         SetResult(true, result);
00567 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_getcwd ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp297 行で定義されています。

参照先 Onikiri::EmulatorUtility::TargetBuffer::Get()Onikiri::EmulatorUtility::VirtualSystem::GetCWD()GetMemorySystem()GetVirtualSystem()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00298 {
00299     int bufSize = (int)m_args[2];
00300 
00301     TargetBuffer buf(GetMemorySystem(), m_args[1], bufSize+1);
00302     void *result = GetVirtualSystem()->GetCWD(static_cast<char*>(buf.Get()), bufSize);
00303     if (result == NULL) {
00304         SetResult(false, GetVirtualSystem()->GetErrno());
00305     }
00306     else {
00307         SetResult(true, m_args[1]);
00308     }
00309 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_getegid ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp187 行で定義されています。

参照先 SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00188 {
00189     SetResult(true, (u64)posix_getegid());
00190 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_geteuid ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp177 行で定義されています。

参照先 SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00178 {
00179     SetResult(true, (u64)posix_geteuid());
00180 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_getgid ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp182 行で定義されています。

参照先 SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute().

00183 {
00184     SetResult(true, (u64)posix_getgid());
00185 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_getpid ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp266 行で定義されています。

参照先 SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00267 {
00268     SetResult(true, (u64)posix_getpid());
00269 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_gettimeofday ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp595 行で定義されています。

参照先 Onikiri::EndianHostToSpecified()Onikiri::EmulatorUtility::TargetBuffer::Get()GetMemorySystem()Onikiri::EmulatorUtility::VirtualSystem::GetTime()GetVirtualSystem()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00596 {
00597     if (m_args[2] != 0) {
00598         // timezone obsoleteT|[g
00599         SetResult(false, EINVAL);
00600         return;
00601     }
00602     TargetBuffer buf(GetMemorySystem(), m_args[1], sizeof(linux64_timeval));
00603     linux64_timeval* tv_buf = static_cast<linux64_timeval*>(buf.Get());
00604 
00605     s64 t = GetVirtualSystem()->GetTime();
00606     tv_buf->linux64_tv_sec = EndianHostToSpecified((u64)t, GetMemorySystem()->IsBigEndian());
00607     tv_buf->linux64_tv_usec = EndianHostToSpecified((u64)t * 1000 * 1000, GetMemorySystem()->IsBigEndian());
00608 
00609     SetResult(true, 0);
00610 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_getuid ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp172 行で定義されています。

参照先 SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute().

00173 {
00174     SetResult(true, (u64)posix_getuid());
00175 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_ignore ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp158 行で定義されています。

参照先 Onikiri::EmulatorUtility::SyscallConvIF::ErrorFlagIndexOnikiri::EmulatorUtility::SyscallConvIF::RetValueIndex.

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00159 {
00160     m_results[RetValueIndex] = (u64)0;
00161     m_results[ErrorFlagIndex] = (u64)0;
00162 }

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_ioctl ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp612 行で定義されています。

参照先 SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00613 {
00614     const int LINUX_TCGETS = 0x402c7413;
00615 
00616     // LINUX_TCGETSCisatty
00617     // isatty CG[
00618     if ((int)m_args[2] == LINUX_TCGETS) {
00619         const int ERRNO_ENOTTY = 25;
00620         // t@C
00621         // TTY(success)CglibcTTYfoCXreadlinko (ttyname)
00622         if (false) {
00623             SetResult(true, 0);
00624         }
00625         else {
00626             SetResult(false, ERRNO_ENOTTY);
00627         }
00628     }
00629     else {
00630         SetResult(false, EINVAL);
00631     }
00632 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_kill ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp271 行で定義されています。

参照先 kill_helper().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00272 {
00273     kill_helper(opState, (int)m_args[1], (int)m_args[2]);
00274 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_lseek ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp428 行で定義されています。

参照先 GetVirtualSystem()Onikiri::EmulatorUtility::VirtualSystem::LSeek()SeekWhenceTargetToHost()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00429 {
00430     s64 result = GetVirtualSystem()->LSeek((int)m_args[1], m_args[2], (int)SeekWhenceTargetToHost((u32)m_args[3]));
00431     if (result == -1)
00432         SetResult(false, GetVirtualSystem()->GetErrno());
00433     else
00434         SetResult(true, (u64)result);
00435 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_lstat64 ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp479 行で定義されています。

参照先 GetMemorySystem()GetVirtualSystem()Onikiri::EmulatorUtility::VirtualSystem::LStat()SetResult()Onikiri::EmulatorUtility::StrCpyToHost()write_stat64().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00480 {
00481     HostStat st;
00482     string path = StrCpyToHost( GetMemorySystem(), m_args[1] );
00483     int result = GetVirtualSystem()->LStat(path.c_str(), &st);
00484     if (result == -1) {
00485         SetResult(false, GetVirtualSystem()->GetErrno());
00486     }
00487     else {
00488         write_stat64((u64)m_args[2], st);
00489         SetResult(true, result);
00490     }
00491 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_mkdir ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp506 行で定義されています。

参照先 GetMemorySystem()GetVirtualSystem()Onikiri::EmulatorUtility::VirtualSystem::MkDir()SetResult()Onikiri::EmulatorUtility::StrCpyToHost().

参照元 Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00507 {
00508     string path = StrCpyToHost( GetMemorySystem(), m_args[1] );
00509     int result = GetVirtualSystem()->MkDir(path.c_str(), (int)m_args[2]);
00510     if (result == -1) {
00511         SetResult(false, GetVirtualSystem()->GetErrno());
00512     }
00513     else {
00514         SetResult(true, result);
00515     }
00516 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_mmap ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp208 行で定義されています。

参照先 Get_MAP_ANONYMOUS()GetMemorySystem()Onikiri::EmulatorUtility::MemorySystem::MMap()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00209 {
00210     u64 result;
00211     if (!(m_args[4] & Get_MAP_ANONYMOUS())) {
00212         result = (u64)-1;
00213     }
00214     else {
00215         result = GetMemorySystem()->MMap(m_args[1], m_args[2]);
00216     }
00217 
00218     if (result == (u64)-1)
00219         SetResult(false, ENOMEM);   // <TODO> errno
00220     else
00221         SetResult(true, result);
00222 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_mprotect ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp239 行で定義されています。

参照先 SetResult().

参照元 Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00240 {
00241     SetResult(true, (u64)0);
00242 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_mremap ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp223 行で定義されています。

参照先 Get_MREMAP_MAYMOVE()GetMemorySystem()Onikiri::EmulatorUtility::MemorySystem::MRemap()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00224 {
00225     u64 result = GetMemorySystem()->MRemap(m_args[1], m_args[2], m_args[3], (m_args[4] & Get_MREMAP_MAYMOVE()) != 0);
00226     if (result == (u64)-1)
00227         SetResult(false, ENOMEM);
00228     else
00229         SetResult(true, result);
00230 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_munmap ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp231 行で定義されています。

参照先 GetMemorySystem()Onikiri::EmulatorUtility::MemorySystem::MUnmap()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00232 {
00233     int result = GetMemorySystem()->MUnmap(m_args[1], m_args[2]);
00234     if (result == -1)
00235         SetResult(false, EINVAL);
00236     else
00237         SetResult(true, (u64)result);
00238 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_open ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp311 行で定義されています。

参照先 GetMemorySystem()GetVirtualSystem()Onikiri::EmulatorUtility::VirtualSystem::Open()OpenFlagTargetToHost()SetResult()Onikiri::EmulatorUtility::StrCpyToHost().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00312 {
00313     std::string fileName = StrCpyToHost( GetMemorySystem(), m_args[1] );
00314     int result = GetVirtualSystem()->Open( 
00315         fileName.c_str(), 
00316         (int)OpenFlagTargetToHost( static_cast<u32>(m_args[2]) ) 
00317     );
00318 
00319     if (result == -1)
00320         SetResult(false, GetVirtualSystem()->GetErrno());
00321     else
00322         SetResult(true, result);
00323 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_read ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp343 行で定義されています。

参照先 Onikiri::EmulatorUtility::TargetBuffer::Get()GetMemorySystem()Onikiri::EmulatorUtility::OpEmulationState::GetPID()Onikiri::EmulatorUtility::OpEmulationState::GetTID()GetVirtualSystem()Onikiri::SystemIF::NotifySyscallReadFileToMemory()Onikiri::EmulatorUtility::VirtualSystem::Read()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00344 {
00345     unsigned int bufSize = (unsigned int)m_args[3];
00346     TargetBuffer buf(GetMemorySystem(), m_args[2], bufSize);
00347     int result = GetVirtualSystem()->Read((int)m_args[1], buf.Get(),    bufSize);
00348     if (result == -1) {
00349         SetResult(false, GetVirtualSystem()->GetErrno());
00350     }
00351     else {
00352         m_simulatorSystem->NotifySyscallReadFileToMemory(Addr(opState->GetPID(), opState->GetTID(), m_args[2]), bufSize);
00353         SetResult(true, result);
00354     }
00355 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_readv ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp372 行で定義されています。

参照先 Onikiri::EndianSpecifiedToHost()Onikiri::EmulatorUtility::TargetBuffer::Get()GetMemorySystem()Onikiri::EmulatorUtility::OpEmulationState::GetPID()Onikiri::EmulatorUtility::OpEmulationState::GetTID()GetVirtualSystem()Onikiri::SystemIF::NotifySyscallReadFileToMemory()Onikiri::EmulatorUtility::VirtualSystem::Read()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00373 {
00374     int iovcnt = (int)m_args[3];
00375     s64 result = 0;
00376     const TargetBuffer iovecBuf(GetMemorySystem(), m_args[2], iovcnt*sizeof(linux64_iovec), true);
00377     const linux64_iovec* iovec = static_cast<const linux64_iovec*>(iovecBuf.Get());
00378 
00379     for (int i = 0; i < iovcnt; i ++) {
00380         u64 iov_base = EndianSpecifiedToHost(iovec->linux64_iov_base, GetMemorySystem()->IsBigEndian());
00381         u64 iov_len = EndianSpecifiedToHost(iovec->linux64_iov_len, GetMemorySystem()->IsBigEndian());
00382 
00383         TargetBuffer buf(GetMemorySystem(), iov_base, (size_t)iov_len);
00384         int bytesRead = GetVirtualSystem()->Read((int)m_args[1], buf.Get(), (unsigned int)iov_len);
00385 
00386         if (result == -1 || bytesRead == -1 || (u64)bytesRead != iov_len) {
00387             SetResult(false, GetVirtualSystem()->GetErrno());
00388             result = -1;
00389             break;
00390         }
00391         else {
00392             m_simulatorSystem->NotifySyscallReadFileToMemory(Addr(opState->GetPID(), opState->GetTID(), iov_base), iov_len);
00393             result += iov_len;
00394         }
00395         iovec++;
00396     }
00397     SetResult(true, result);
00398 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_rename ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp538 行で定義されています。

参照先 GetMemorySystem()GetVirtualSystem()Onikiri::EmulatorUtility::VirtualSystem::Rename()SetResult()Onikiri::EmulatorUtility::StrCpyToHost().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00539 {
00540     string oldpath = StrCpyToHost( GetMemorySystem(), m_args[1] );
00541     string newpath = StrCpyToHost( GetMemorySystem(), m_args[2] );
00542 
00543     int result = GetVirtualSystem()->Rename( oldpath.c_str(), newpath.c_str() );
00544     if (result == -1)
00545         SetResult(false, GetVirtualSystem()->GetErrno());
00546     else
00547         SetResult(true, result);
00548 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_stat64 ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp465 行で定義されています。

参照先 GetMemorySystem()GetVirtualSystem()SetResult()Onikiri::EmulatorUtility::VirtualSystem::Stat()Onikiri::EmulatorUtility::StrCpyToHost()write_stat64().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00466 {
00467     HostStat st;
00468     string path = StrCpyToHost( GetMemorySystem(), m_args[1] );
00469     int result = GetVirtualSystem()->Stat(path.c_str(), &st);
00470     if (result == -1) {
00471         SetResult(false, GetVirtualSystem()->GetErrno());
00472     }
00473     else {
00474         write_stat64((u64)m_args[2], st);
00475         SetResult(true, result);
00476     }
00477 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_tgkill ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp276 行で定義されています。

参照先 ASSERTkill_helper().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00277 {
00278     ASSERT(m_args[1] == m_args[2]);
00279     kill_helper(opState, (int)m_args[1], (int)m_args[3]);
00280 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_time ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp569 行で定義されています。

参照先 Onikiri::EndianHostToSpecified()Onikiri::EmulatorUtility::TargetBuffer::Get()GetMemorySystem()Onikiri::EmulatorUtility::VirtualSystem::GetTime()GetVirtualSystem()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute().

00570 {
00571     s64 result = GetVirtualSystem()->GetTime();
00572     if (m_args[1] != 0) {
00573         TargetBuffer buf(GetMemorySystem(), m_args[1], sizeof(linux64_time_t));
00574         linux64_time_t* ptime = static_cast<linux64_time_t*>(buf.Get());
00575         *ptime = EndianHostToSpecified(result, GetMemorySystem()->IsBigEndian());
00576     }
00577     SetResult(true, result);
00578 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_times ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp580 行で定義されています。

参照先 Onikiri::EndianHostToSpecified()Onikiri::EmulatorUtility::TargetBuffer::Get()Get_CLK_TCK()Onikiri::EmulatorUtility::VirtualSystem::GetClock()GetMemorySystem()GetVirtualSystem()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00581 {
00582     TargetBuffer buf(GetMemorySystem(), m_args[1], sizeof(linux64_tms));
00583     linux64_tms* tms_buf = static_cast<linux64_tms*>(buf.Get());
00584 
00585     s64 clk = GetVirtualSystem()->GetClock();
00586     u64 result = (u64)((double)clk / CLOCKS_PER_SEC * Get_CLK_TCK());
00587     tms_buf->linux64_tms_utime = EndianHostToSpecified(result, GetMemorySystem()->IsBigEndian());
00588     tms_buf->linux64_tms_stime = 0;
00589     tms_buf->linux64_tms_cutime = 0;
00590     tms_buf->linux64_tms_cstime = 0;
00591 
00592     SetResult(true, result);
00593 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_truncate ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp550 行で定義されています。

参照先 GetMemorySystem()GetVirtualSystem()SetResult()Onikiri::EmulatorUtility::StrCpyToHost()Onikiri::EmulatorUtility::VirtualSystem::Truncate().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00551 {
00552     string path = StrCpyToHost( GetMemorySystem(), m_args[1] );
00553     int result = GetVirtualSystem()->Truncate( path.c_str(), (s64)m_args[2] );
00554     if (result == -1)
00555         SetResult(false, GetVirtualSystem()->GetErrno());
00556     else
00557         SetResult(true, result);
00558 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_uname ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp244 行で定義されています。

参照先 GetMemorySystem()Onikiri::EmulatorUtility::MemorySystem::MemCopyToTarget()SetResult().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00245 {
00246     // linux
00247     struct utsname_linux
00248     {
00249         char sysname[65];
00250         char nodename[65];
00251         char release[65];
00252         char version[65];
00253         char machine[65];
00254     } utsname;
00255 
00256     memset(&utsname, 0, sizeof(utsname));
00257     strcpy(utsname.release, "2.6.23");
00258 
00259     GetMemorySystem()->MemCopyToTarget(m_args[1], &utsname, sizeof(utsname));
00260 
00261     SetResult(true, 0);
00262 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_unlink ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp528 行で定義されています。

参照先 GetMemorySystem()GetVirtualSystem()SetResult()Onikiri::EmulatorUtility::StrCpyToHost()Onikiri::EmulatorUtility::VirtualSystem::Unlink().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00529 {
00530     string path = StrCpyToHost( GetMemorySystem(), m_args[1] );
00531     int result = GetVirtualSystem()->Unlink( path.c_str() );
00532     if (result == -1)
00533         SetResult(false, GetVirtualSystem()->GetErrno());
00534     else
00535         SetResult(true, result);
00536 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_write ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp357 行で定義されています。

参照先 Onikiri::EmulatorUtility::TargetBuffer::Get()GetMemorySystem()Onikiri::EmulatorUtility::OpEmulationState::GetPID()Onikiri::EmulatorUtility::OpEmulationState::GetTID()GetVirtualSystem()Onikiri::SystemIF::NotifySyscallWriteFileFromMemory()SetResult()Onikiri::EmulatorUtility::VirtualSystem::Write().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00358 {
00359     unsigned int bufSize = (unsigned int)m_args[3];
00360     TargetBuffer buf(GetMemorySystem(), m_args[2], bufSize);
00361     int result = GetVirtualSystem()->Write((int)m_args[1], buf.Get(), bufSize);
00362     if (result == -1) {
00363         SetResult(false, GetVirtualSystem()->GetErrno());
00364     }
00365     else {
00366         m_simulatorSystem->NotifySyscallWriteFileFromMemory(Addr(opState->GetPID(), opState->GetTID(), m_args[2]), bufSize);
00367         SetResult(true, result);
00368     }
00369 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::syscall_writev ( EmulatorUtility::OpEmulationState opState  )  [protected, virtual]

Linux64SyscallConv.cpp400 行で定義されています。

参照先 Onikiri::EndianSpecifiedToHost()Onikiri::EmulatorUtility::TargetBuffer::Get()GetMemorySystem()Onikiri::EmulatorUtility::OpEmulationState::GetPID()Onikiri::EmulatorUtility::OpEmulationState::GetTID()GetVirtualSystem()Onikiri::SystemIF::NotifySyscallWriteFileFromMemory()SetResult()Onikiri::EmulatorUtility::VirtualSystem::Write().

参照元 Onikiri::PPC64Linux::PPC64LinuxSyscallConv::Execute()Onikiri::AlphaLinux::AlphaLinuxSyscallConv::Execute().

00401 {
00402     int iovcnt = (int)m_args[3];
00403     s64 result = 0;
00404     const TargetBuffer iovecBuf(GetMemorySystem(), m_args[2], iovcnt*sizeof(linux64_iovec), true);
00405     const linux64_iovec* iovec = static_cast<const linux64_iovec*>(iovecBuf.Get());
00406 
00407     for (int i = 0; i < iovcnt; i ++) {
00408         u64 iov_base = EndianSpecifiedToHost(iovec->linux64_iov_base, GetMemorySystem()->IsBigEndian());
00409         u64 iov_len = EndianSpecifiedToHost(iovec->linux64_iov_len, GetMemorySystem()->IsBigEndian());
00410 
00411         TargetBuffer buf(GetMemorySystem(), iov_base, (size_t)iov_len);
00412         int bytesWritten = GetVirtualSystem()->Write((int)m_args[1], buf.Get(), (unsigned int)iov_len);
00413 
00414         if (result == -1 || bytesWritten == -1 || (u64)bytesWritten != iov_len) {
00415             SetResult(false, GetVirtualSystem()->GetErrno());
00416             result = -1;
00417             break;
00418         }
00419         else {
00420             m_simulatorSystem->NotifySyscallWriteFileFromMemory(Addr(opState->GetPID(), opState->GetTID(), iov_base), iov_len);
00421             result += iov_len;
00422         }
00423         iovec++;
00424     }
00425     SetResult(true, result);
00426 }

関数の呼び出しグラフ:

Here is the caller graph for this function:

void Linux64SyscallConv::write_stat64 ( u64  dest,
const EmulatorUtility::HostStat src 
) [protected, virtual]

Linux64SyscallConv.cpp684 行で定義されています。

参照先 Onikiri::EndianHostToSpecifiedInPlace()Onikiri::EmulatorUtility::TargetBuffer::Get()GetMemorySystem()Onikiri::EmulatorUtility::SyscallConstConvBitwise::HostToTarget()Onikiri::EmulatorUtility::MemorySystem::IsBigEndian().

参照元 syscall_fstat64()syscall_lstat64()syscall_stat64().

00685 {
00686     static u32 host_st_mode[] =
00687     {
00688         POSIX_S_IFDIR,
00689         POSIX_S_IFCHR,
00690         POSIX_S_IFREG,
00691         POSIX_S_IFIFO,
00692     };
00693     static u32 linux64_st_mode[] =
00694     {
00695         0040000, // _S_IFDIR
00696         0020000, // _S_IFCHR
00697         0100000, // _S_IFREG
00698         0010000, // _S_IFIFO
00699     };
00700     static int st_mode_size = sizeof(host_st_mode)/sizeof(host_st_mode[0]);
00701     SyscallConstConvBitwise conv(
00702         host_st_mode,
00703         linux64_st_mode, 
00704         st_mode_size);
00705 
00706     TargetBuffer buf(GetMemorySystem(), dest, sizeof(linux64_stat64));
00707     linux64_stat64* t_buf = static_cast<linux64_stat64*>(buf.Get());
00708     memset(t_buf, 0, sizeof(linux64_stat64));
00709 
00710     t_buf->linux64_stdev = src.st_dev;
00711     t_buf->linux64_stino = src.st_ino;
00712     t_buf->linux64_strdev = src.st_rdev;
00713     t_buf->linux64_stsize = src.st_size;
00714     t_buf->linux64_stuid = src.st_uid;
00715     t_buf->linux64_stgid = src.st_gid;
00716     t_buf->linux64_stnlink = src.st_nlink;
00717     t_buf->linux64_statime = src.st_atime;
00718     t_buf->linux64_stmtime = src.st_mtime;
00719     t_buf->linux64_stctime = src.st_ctime;
00720 
00721     // st_blksize : It@CEVXeIO s"D"ubNETCY
00722     //              CentOS4 32768
00723     // st_blocks  : t@C512B 
00724     //              CentOS4 8 H
00725 
00726 #if defined(HOST_IS_WINDOWS) || defined(HOST_IS_CYGWIN)
00727     static const int BLOCK_UNIT = 512*8;
00728     t_buf->linux64_stmode    = conv.HostToTarget(src.st_mode);
00729     t_buf->linux64_stblocks  = (src.st_size+BLOCK_UNIT-1)/BLOCK_UNIT*8;
00730     t_buf->linux64_stblksize = 32768;
00731 #else
00732     t_buf->linux64_stblocks = src.st_blocks;
00733     t_buf->linux64_stmode = src.st_mode;
00734     t_buf->linux64_stblksize = src.st_blksize;
00735 #endif
00736 
00737     // hoststat(src)vftargetstatvfTCYCUtargetstatGfBA
00738     bool bigEndian = GetMemorySystem()->IsBigEndian();
00739     EndianHostToSpecifiedInPlace(t_buf->linux64_stdev, bigEndian);
00740     EndianHostToSpecifiedInPlace(t_buf->linux64_stino, bigEndian);
00741     EndianHostToSpecifiedInPlace(t_buf->linux64_strdev, bigEndian);
00742     EndianHostToSpecifiedInPlace(t_buf->linux64_stsize, bigEndian);
00743     EndianHostToSpecifiedInPlace(t_buf->linux64_stuid, bigEndian);
00744     EndianHostToSpecifiedInPlace(t_buf->linux64_stgid, bigEndian);
00745     EndianHostToSpecifiedInPlace(t_buf->linux64_stnlink, bigEndian);
00746     EndianHostToSpecifiedInPlace(t_buf->linux64_statime, bigEndian);
00747     EndianHostToSpecifiedInPlace(t_buf->linux64_stmtime, bigEndian);
00748     EndianHostToSpecifiedInPlace(t_buf->linux64_stctime, bigEndian);
00749     EndianHostToSpecifiedInPlace(t_buf->linux64_stmode, bigEndian);
00750     EndianHostToSpecifiedInPlace(t_buf->linux64_stblocks, bigEndian);
00751     EndianHostToSpecifiedInPlace(t_buf->linux64_stblksize, bigEndian);
00752 }

関数の呼び出しグラフ:

Here is the caller graph for this function:


変数

const int Onikiri::EmulatorUtility::Linux64SyscallConv::MaxArgCount = 16 [static, protected]

Linux64SyscallConv.h74 行で定義されています。

参照元 Linux64SyscallConv().


このクラスの説明は次のファイルから生成されました:
Onikiri2に対してTue Jun 18 15:28:10 2013に生成されました。  doxygen 1.4.7