Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(76)

Unified Diff: src/untrusted/irt/irt_ppapi.c

Issue 10826171: Incorporate shimming into the irt (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/untrusted/irt/irt_ppapi.c
===================================================================
--- src/untrusted/irt/irt_ppapi.c (revision 9381)
+++ src/untrusted/irt/irt_ppapi.c (working copy)
@@ -6,13 +6,68 @@
#include "native_client/src/shared/ppapi_proxy/ppruntime.h"
#include "native_client/src/untrusted/irt/irt.h"
+#include "native_client/src/untrusted/irt/irt_interfaces.h"
#include "native_client/src/untrusted/irt/irt_ppapi.h"
#include "native_client/src/untrusted/irt/irt_private.h"
+#include "ppapi/generators/pnacl_shim.h"
+
struct PP_StartFunctions g_pp_functions;
+/*
+ * PNaCl Shimming magic
+ * ====================
+ * Note: this could be simplified by changing the actual
+ * GetInterface functions but for now we rely on some autogenerated files.
+ *
+ * Some background:
+ * pnacl has calling conventions which are slightly different from nacl-gcc.
+ * This affects structure passing on x86-64 which is only used by Ppapi
+ * functions.
+ * There are two functions which are relevant:
+ * PPP_GetInterface and PPB_GetInterface.
+ * We interecept those functions, store the old version and then redirect
+ * to __Pnacl_PPPGetInterface and __Pnacl_PPBGetInterface.
+ */
+
+/* Holds the orginial PP_StartFunctions data if shimming is enabled. */
+struct PP_StartFunctions g_pp_functions_non_shim;
+
+static int32_t PPPInitializeModule_cc_shim(PP_Module module_id,
jvoung (off chromium) 2012/08/07 15:33:10 add dash or take away dash from other PPP function
+ PPB_GetInterface get_browser_intf) {
+ /* save old version of PPB_GetInterface */
+ __set_real_Pnacl_PPBGetInterface(get_browser_intf);
+ /* redirect to new version of PPB_GetInterface */
+ return g_pp_functions_non_shim.PPP_InitializeModule(
+ module_id, &__Pnacl_PPBGetInterface);
+}
+
+static void PPP_ShutdownModule_cc_shim() {
+ /* redirect to non-shimed version */
+ g_pp_functions_non_shim.PPP_ShutdownModule();
+}
+
+static const void *PPP_GetInterface_cc_shim(const char *interface_name) {
+ /* redirect to new version of PPP_GetInterface */
+ return __Pnacl_PPPGetInterface(interface_name);
+}
+
+struct PP_StartFunctions g_pp_functions_cc_shim = {
+ &PPPInitializeModule_cc_shim,
+ &PPP_ShutdownModule_cc_shim,
+ &PPP_GetInterface_cc_shim
+};
+
+/* register entry points to untrusted pepper plugin */
jvoung (off chromium) 2012/08/07 15:33:10 extra space "entry points"
static int irt_ppapi_start(const struct PP_StartFunctions *funcs) {
- g_pp_functions = *funcs;
+ if (g_pancl_mode) {
jvoung (off chromium) 2012/08/07 15:33:10 p-ankle -> pnacl
+ /* save old version of PPP_GetInterface */
+ __set_real_Pnacl_PPPGetInterface(funcs->PPP_GetInterface);
+ g_pp_functions_non_shim = *funcs;
+ g_pp_functions = g_pp_functions_cc_shim;
+ } else {
+ g_pp_functions = *funcs;
+ }
g_is_main_thread = 1;
return PpapiPluginMain();
}

Powered by Google App Engine
This is Rietveld 408576698