15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/nacl/loader/nonsfi/irt_interfaces.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <cstring>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace nacl {
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace nonsfi {
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace {
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This table keeps a pair of IRT entry (such as nacl_irt_basic, nacl_irt_fdio
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// etc.) and its registered name with its version (such as NACL_IRT_BASIC_v0_1,
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// NACL_IRT_DEV_FDIO_v0_1, etc.).
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct NaClInterfaceTable {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const char* name;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const void* table;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  size_t size;
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define NACL_INTERFACE_TABLE(name, value) { name, &value, sizeof(value) }
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const NaClInterfaceTable kIrtInterfaces[] = {
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_BASIC_v0_1, kIrtBasic),
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_FDIO_v0_1, kIrtFdIO),
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_MEMORY_v0_3, kIrtMemory),
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_THREAD_v0_1, kIrtThread),
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_FUTEX_v0_1, kIrtFutex),
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_TLS_v0_1, kIrtTls),
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_CLOCK_v0_1, kIrtClock),
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_PPAPIHOOK_v0_1, kIrtPpapiHook),
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_RESOURCE_OPEN_v0_1, kIrtResourceOpen),
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  NACL_INTERFACE_TABLE(NACL_IRT_RANDOM_v0_1, kIrtRandom),
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  NACL_INTERFACE_TABLE(NACL_IRT_EXCEPTION_HANDLING_v0_1, kIrtExceptionHandling),
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#if defined(__arm__)
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NACL_INTERFACE_TABLE(NACL_IRT_ICACHE_v0_1, kIrtIcache),
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#endif
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef NACL_INTERFACE_TABLE
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)size_t NaClIrtInterface(const char* interface_ident,
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        void* table, size_t tablesize) {
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kIrtInterfaces); ++i) {
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (std::strcmp(interface_ident, kIrtInterfaces[i].name) == 0) {
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const size_t size = kIrtInterfaces[i].size;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (size <= tablesize) {
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        std::memcpy(table, kIrtInterfaces[i].table, size);
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        return size;
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      break;
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return 0;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace nonsfi
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace nacl
61