| Index: mojo/nacl/mojo_syscall_internal.h
|
| diff --git a/mojo/nacl/mojo_syscall_internal.h b/mojo/nacl/mojo_syscall_internal.h
|
| deleted file mode 100644
|
| index 8aa32d1c75e2c0f07b0e7614744bcfb2f2702174..0000000000000000000000000000000000000000
|
| --- a/mojo/nacl/mojo_syscall_internal.h
|
| +++ /dev/null
|
| @@ -1,175 +0,0 @@
|
| -// 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.
|
| -
|
| -#ifndef MOJO_NACL_MOJO_SYSCALL_INTERNAL_H_
|
| -#define MOJO_NACL_MOJO_SYSCALL_INTERNAL_H_
|
| -
|
| -#include "native_client/src/trusted/service_runtime/nacl_copy.h"
|
| -#include "native_client/src/trusted/service_runtime/sel_ldr.h"
|
| -
|
| -namespace {
|
| -
|
| -class ScopedCopyLock {
|
| - public:
|
| - explicit ScopedCopyLock(struct NaClApp* nap) : nap_(nap) {
|
| - NaClCopyTakeLock(nap_);
|
| - }
|
| - ~ScopedCopyLock() {
|
| - NaClCopyDropLock(nap_);
|
| - }
|
| - private:
|
| - struct NaClApp* nap_;
|
| -};
|
| -
|
| -static inline uintptr_t NaClUserToSysAddrArray(
|
| - struct NaClApp* nap,
|
| - uint32_t uaddr,
|
| - size_t count,
|
| - size_t size) {
|
| - // TODO(ncbray): overflow checking
|
| - size_t range = count * size;
|
| - return NaClUserToSysAddrRange(nap, uaddr, range);
|
| -}
|
| -
|
| -// We don't use plain-old memcpy because reads and writes to the untrusted
|
| -// address space from trusted code must be volatile. Non-volatile memory
|
| -// operations are dangerous because a compiler would be free to materialize a
|
| -// second load from the same memory address or materialize a load from a memory
|
| -// address that was stored, and assume the materialized load would return the
|
| -// same value as the previous load or store. Data races could cause the
|
| -// materialized load to return a different value, however, which could lead to
|
| -// time of check vs. time of use problems, or worse. For this binding code in
|
| -// particular, where memcpy is being called with a constant size, it is entirely
|
| -// conceivable the function will be inlined, unrolled, and optimized.
|
| -static inline void memcpy_volatile_out(
|
| - void volatile* dst,
|
| - const void* src,
|
| - size_t n) {
|
| - char volatile* c_dst = static_cast<char volatile*>(dst);
|
| - const char* c_src = static_cast<const char*>(src);
|
| - for (size_t i = 0; i < n; i++) {
|
| - c_dst[i] = c_src[i];
|
| - }
|
| -}
|
| -
|
| -template <typename T> bool ConvertScalarInput(
|
| - struct NaClApp* nap,
|
| - uint32_t user_ptr,
|
| - T* value) {
|
| - if (user_ptr) {
|
| - uintptr_t temp = NaClUserToSysAddrRange(nap, user_ptr, sizeof(T));
|
| - if (temp != kNaClBadAddress) {
|
| - *value = *reinterpret_cast<T volatile*>(temp);
|
| - return true;
|
| - }
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -template <typename T> bool ConvertScalarOutput(
|
| - struct NaClApp* nap,
|
| - uint32_t user_ptr,
|
| - bool optional,
|
| - T volatile** sys_ptr) {
|
| - if (user_ptr) {
|
| - uintptr_t temp = NaClUserToSysAddrRange(nap, user_ptr, sizeof(T));
|
| - if (temp != kNaClBadAddress) {
|
| - *sys_ptr = reinterpret_cast<T volatile*>(temp);
|
| - return true;
|
| - }
|
| - } else if (optional) {
|
| - *sys_ptr = 0;
|
| - return true;
|
| - }
|
| - *sys_ptr = 0; // Paranoia.
|
| - return false;
|
| -}
|
| -
|
| -template <typename T> bool ConvertScalarInOut(
|
| - struct NaClApp* nap,
|
| - uint32_t user_ptr,
|
| - bool optional,
|
| - T* value,
|
| - T volatile** sys_ptr) {
|
| - if (user_ptr) {
|
| - uintptr_t temp = NaClUserToSysAddrRange(nap, user_ptr, sizeof(T));
|
| - if (temp != kNaClBadAddress) {
|
| - T volatile* converted = reinterpret_cast<T volatile*>(temp);
|
| - *sys_ptr = converted;
|
| - *value = *converted;
|
| - return true;
|
| - }
|
| - } else if (optional) {
|
| - *sys_ptr = 0;
|
| - *value = static_cast<T>(0); // Paranoia.
|
| - return true;
|
| - }
|
| - *sys_ptr = 0; // Paranoia.
|
| - *value = static_cast<T>(0); // Paranoia.
|
| - return false;
|
| -}
|
| -
|
| -template <typename T> bool ConvertArray(
|
| - struct NaClApp* nap,
|
| - uint32_t user_ptr,
|
| - uint32_t length,
|
| - size_t element_size,
|
| - bool optional,
|
| - T** sys_ptr) {
|
| - if (user_ptr) {
|
| - uintptr_t temp = NaClUserToSysAddrArray(nap, user_ptr, length,
|
| - element_size);
|
| - if (temp != kNaClBadAddress) {
|
| - *sys_ptr = reinterpret_cast<T*>(temp);
|
| - return true;
|
| - }
|
| - } else if (optional) {
|
| - *sys_ptr = 0;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -template <typename T> bool ConvertBytes(
|
| - struct NaClApp* nap,
|
| - uint32_t user_ptr,
|
| - uint32_t length,
|
| - bool optional,
|
| - T** sys_ptr) {
|
| - if (user_ptr) {
|
| - uintptr_t temp = NaClUserToSysAddrRange(nap, user_ptr, length);
|
| - if (temp != kNaClBadAddress) {
|
| - *sys_ptr = reinterpret_cast<T*>(temp);
|
| - return true;
|
| - }
|
| - } else if (optional) {
|
| - *sys_ptr = 0;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -// TODO(ncbray): size validation and complete copy.
|
| -// TODO(ncbray): ensure non-null / missized structs are covered by a test case.
|
| -template <typename T> bool ConvertExtensibleStructInput(
|
| - struct NaClApp* nap,
|
| - uint32_t user_ptr,
|
| - bool optional,
|
| - T** sys_ptr) {
|
| - if (user_ptr) {
|
| - uintptr_t temp = NaClUserToSysAddrRange(nap, user_ptr, sizeof(T));
|
| - if (temp != kNaClBadAddress) {
|
| - *sys_ptr = reinterpret_cast<T*>(temp);
|
| - return true;
|
| - }
|
| - } else if (optional) {
|
| - *sys_ptr = 0;
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -#endif // MOJO_NACL_MOJO_SYSCALL_INTERNAL_H_
|
|
|