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