1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/* 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Copyright 2014 The Chromium Authors. All rights reserved. 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * found in the LICENSE file. 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/native_client/src/untrusted/pnacl_irt_shim/irt_shim_ppapi.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "native_client/src/untrusted/irt/irt.h" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/public/irt_ppapi.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ppapi/native_client/src/untrusted/pnacl_irt_shim/pnacl_shim.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ppapi/nacl_irt/plugin_main.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)/* 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Defines a version of the version irt_ppapi_start and of the irt_ppapihook 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * that returns a shimmed GetInterface for PNaCl. 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * The hook will be linked into the IRT but it is considered unstable. 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Stable nexes should not use that IRT hook (and a filter prevents 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * it from being used). Instead PNaCl nexes should embed the 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * irt_shim_ppapi_start and the shim functions directly into the nexe 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * for ABI stability. 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static struct PP_StartFunctions g_user_start_functions; 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static int32_t shim_PPPInitializeModule(PP_Module module_id, 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PPB_GetInterface get_browser_intf) { 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /* Record the original PPB_GetInterface and provide a shimmed one. */ 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) __set_real_Pnacl_PPBGetInterface(get_browser_intf); 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return (*g_user_start_functions.PPP_InitializeModule)( 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) module_id, 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &__Pnacl_PPBGetInterface); 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)static void shim_PPPShutdownModule(void) { 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) (*g_user_start_functions.PPP_ShutdownModule)(); 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifdef PNACL_SHIM_AOT 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /* 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * This will be discovered and set by the shim, since we cannot link 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * against the IRT directly in the AOT library. 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int (*real_irt_ppapi_start)(const struct PP_StartFunctions *) = NULL; 46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /* 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Otherwise, when linking directly into the IRT, we can refer to the 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * real irt_ppapi_start from irt_ppapi. 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)extern int irt_ppapi_start(const struct PP_StartFunctions *); 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static int (* const real_irt_ppapi_start)(const struct PP_StartFunctions *) = 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &irt_ppapi_start; 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)int irt_shim_ppapi_start(const struct PP_StartFunctions *funcs) { 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) g_user_start_functions = *funcs; 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /* 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Record the original PPP_GetInterface and provide a shimmed one 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * via wrapped_ppapi_methods. 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const struct PP_StartFunctions wrapped_ppapi_methods = { 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) shim_PPPInitializeModule, 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) shim_PPPShutdownModule, 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) __Pnacl_PPPGetInterface 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) __set_real_Pnacl_PPPGetInterface(g_user_start_functions.PPP_GetInterface); 68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) /* 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) * Invoke the IRT's ppapi_start interface with the wrapped interface. 70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) */ 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return (*real_irt_ppapi_start)(&wrapped_ppapi_methods); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef PNACL_SHIM_AOT 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const struct nacl_irt_ppapihook nacl_irt_ppapihook_pnacl_private = { 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) irt_shim_ppapi_start, 77a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) PpapiPluginRegisterThreadCreator, 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}; 79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 80