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