Index: components/nacl/loader/nonsfi/irt_basic.cc |
diff --git a/components/nacl/loader/nonsfi/irt_basic.cc b/components/nacl/loader/nonsfi/irt_basic.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f65ee532b7a1cb7b37dff0de7855c53714bb068f |
--- /dev/null |
+++ b/components/nacl/loader/nonsfi/irt_basic.cc |
@@ -0,0 +1,101 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <errno.h> |
+#include <sched.h> |
+#include <stdlib.h> |
+#include <sys/time.h> |
+#include <time.h> |
+#include <unistd.h> |
+ |
+#include "components/nacl/loader/nonsfi/irt_interfaces.h" |
+#include "native_client/src/trusted/service_runtime/include/sys/time.h" |
+#include "native_client/src/trusted/service_runtime/include/sys/unistd.h" |
+ |
+namespace nacl { |
+namespace nonsfi { |
+namespace { |
+ |
+void IrtExit(int status) { |
+ _exit(status); |
+} |
+ |
+int IrtGetToD(struct nacl_abi_timeval* tv) { |
+ struct timeval host_tv; |
+ if (gettimeofday(&host_tv, NULL)) |
+ return errno; |
+ tv->nacl_abi_tv_sec = host_tv.tv_sec; |
+ tv->nacl_abi_tv_usec = host_tv.tv_usec; |
+ return 0; |
+} |
+ |
+int IrtClock(nacl_abi_clock_t* ticks) { |
+ // There is no definition of errno when clock is failed. |
+ // So we assume it always succeeds. |
+ *ticks = clock(); |
+ return 0; |
+} |
+ |
+int IrtNanoSleep(const struct nacl_abi_timespec* req, |
+ struct nacl_abi_timespec* rem) { |
+ struct timespec host_req; |
+ host_req.tv_sec = req->tv_sec; |
+ host_req.tv_nsec = req->tv_nsec; |
+ struct timespec host_rem; |
+ if (nanosleep(&host_req, &host_rem)) |
+ return errno; |
+ |
+ if (rem) { |
+ rem->tv_sec = host_rem.tv_sec; |
+ rem->tv_nsec = host_rem.tv_nsec; |
+ } |
+ return 0; |
+} |
+ |
+int IrtSchedYield() { |
+ if (sched_yield()) |
+ return errno; |
+ |
+ return 0; |
+} |
+ |
+int IrtSysconf(int name, int* value) { |
+ int result; |
+ switch (name) { |
+ case NACL_ABI__SC_NPROCESSORS_ONLN: |
+ errno = 0; |
+ result = sysconf(_SC_NPROCESSORS_ONLN); |
+ break; |
+ case NACL_ABI__SC_PAGESIZE: |
+ errno = 0; |
+ result = sysconf(_SC_PAGESIZE); |
+ break; |
+ default: |
+ return EINVAL; |
+ } |
+ |
+ if (result == -1 && errno == EINVAL) |
+ return EINVAL; |
+ |
+ *value = result; |
+ return 0; |
+} |
+ |
+} // namespace |
+ |
+// For gettod, clock and nanosleep, their argument types should be nacl_abi_X, |
+// rather than host type, such as timeval or clock_t etc. However, the |
+// definition of nacl_irt_basic uses host types, so here we need to cast them. |
+const nacl_irt_basic kIrtBasic = { |
+ IrtExit, |
+ reinterpret_cast<int(*)(struct timeval*)>(IrtGetToD), |
+ reinterpret_cast<int(*)(clock_t*)>(IrtClock), |
+ reinterpret_cast<int(*)(const struct timespec*, struct timespec*)>( |
+ IrtNanoSleep), |
+ IrtSchedYield, |
+ IrtSysconf, |
+}; |
+ |
+} // namespace nonsfi |
+} // namespace nacl |