1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "native_client/src/public/irt_core.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "native_client/src/trusted/service_runtime/include/sys/unistd.h" 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "native_client/src/untrusted/irt/irt.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "native_client/src/untrusted/irt/irt_private.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi/nacl_irt/irt_manifest.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/nacl_irt/irt_ppapi.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/plugin_main.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/public/irt_ppapi.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static struct PP_StartFunctions g_pp_functions; 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int irt_ppapi_start(const struct PP_StartFunctions* funcs) { 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Disable NaCl's open_resource() interface on this thread. 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_is_main_thread = 1; 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_pp_functions = *funcs; 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return PpapiPluginMain(); 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int32_t PPP_InitializeModule(PP_Module module_id, 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PPB_GetInterface get_browser_interface) { 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return g_pp_functions.PPP_InitializeModule(module_id, get_browser_interface); 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PPP_ShutdownModule(void) { 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) g_pp_functions.PPP_ShutdownModule(); 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const void* PPP_GetInterface(const char* interface_name) { 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return g_pp_functions.PPP_GetInterface(interface_name); 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const struct nacl_irt_ppapihook nacl_irt_ppapihook = { 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) irt_ppapi_start, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PpapiPluginRegisterThreadCreator, 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static int ppapihook_pnacl_private_filter(void) { 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int pnacl_mode = sysconf(NACL_ABI__SC_NACL_PNACL_MODE); 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (pnacl_mode == -1) 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return 0; 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return pnacl_mode; 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic const nacl_irt_resource_open kIrtResourceOpen = { 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ppapi::IrtOpenResource, 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic int not_pnacl_filter(void) { 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int pnacl_mode = sysconf(NACL_ABI__SC_NACL_PNACL_MODE); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (pnacl_mode == -1) 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return 0; 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return !pnacl_mode; 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const struct nacl_irt_interface irt_interfaces[] = { 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { NACL_IRT_PPAPIHOOK_v0_1, &nacl_irt_ppapihook, sizeof(nacl_irt_ppapihook), 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL }, 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) { NACL_IRT_PPAPIHOOK_PNACL_PRIVATE_v0_1, 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &nacl_irt_ppapihook_pnacl_private, sizeof(nacl_irt_ppapihook_pnacl_private), 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ppapihook_pnacl_private_filter }, 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci { NACL_IRT_RESOURCE_OPEN_v0_1, &kIrtResourceOpen, 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(kIrtResourceOpen), not_pnacl_filter }, 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochsize_t chrome_irt_query(const char* interface_ident, 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void* table, size_t tablesize) { 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t result = nacl_irt_query_list(interface_ident, 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci table, 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tablesize, 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci irt_interfaces, 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sizeof(irt_interfaces)); 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (result != 0) 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return result; 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return nacl_irt_query_core(interface_ident, table, tablesize); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 82