irt_interfaces.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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), 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NACL_INTERFACE_TABLE(NACL_IRT_DEV_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), 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch NACL_INTERFACE_TABLE(NACL_IRT_RANDOM_v0_1, kIrtRandom), 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#undef NACL_INTERFACE_TABLE 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)size_t NaClIrtInterface(const char* interface_ident, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void* table, size_t tablesize) { 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (size_t i = 0; i < arraysize(kIrtInterfaces); ++i) { 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (std::strcmp(interface_ident, kIrtInterfaces[i].name) == 0) { 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const size_t size = kIrtInterfaces[i].size; 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (size <= tablesize) { 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::memcpy(table, kIrtInterfaces[i].table, size); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return size; 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) break; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace nonsfi 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace nacl 56