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

Unified Diff: ppapi/native_client/src/untrusted/irt_stub/ppapi_plugin_start.c

Issue 10914053: Relocating files in the nacl repo that belong in chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: merge Created 8 years, 3 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: ppapi/native_client/src/untrusted/irt_stub/ppapi_plugin_start.c
diff --git a/ppapi/native_client/src/untrusted/irt_stub/ppapi_plugin_start.c b/ppapi/native_client/src/untrusted/irt_stub/ppapi_plugin_start.c
new file mode 100644
index 0000000000000000000000000000000000000000..af5bf864adaefdb0e6d80c27052c6fffa2dac330
--- /dev/null
+++ b/ppapi/native_client/src/untrusted/irt_stub/ppapi_plugin_start.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2011 The Chromium Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "native_client/src/include/elf_auxv.h"
+#include "native_client/src/include/elf32.h"
+#include "native_client/src/shared/ppapi_proxy/ppruntime.h"
+#include "native_client/src/untrusted/irt/irt.h"
+#include "native_client/src/untrusted/irt/irt_ppapi.h"
+#include "native_client/src/untrusted/irt_stub/thread_creator.h"
+
+static void fatal_error(const char *message) {
+ write(2, message, strlen(message));
+ _exit(127);
+}
+
+/*
+ * TODO(mcgrathr): This extremely stupid function should not exist.
+ * If the startup calling sequence were sane, this would be done
+ * someplace that has the initial pointer locally rather than stealing
+ * it from environ.
+ * See http://code.google.com/p/nativeclient/issues/detail?id=651
+ */
+static Elf32_auxv_t *find_auxv(void) {
+ /*
+ * This presumes environ has its startup-time value on the stack.
+ */
+ char **ep = environ;
+ while (*ep != NULL)
+ ++ep;
+ return (void *) (ep + 1);
+}
+
+/*
+ * Scan the auxv for AT_SYSINFO, which is the pointer to the IRT query function.
+ * TODO(mcgrathr): Could get this from __nacl_irt_query, where the libnacl
+ * startup code stored it, but that would have to be also added as part of
+ * the glibc ABI.
+ */
+static TYPE_nacl_irt_query grok_auxv(const Elf32_auxv_t *auxv) {
+ const Elf32_auxv_t *av;
+ for (av = auxv; av->a_type != AT_NULL; ++av) {
+ if (av->a_type == AT_SYSINFO)
+ return (TYPE_nacl_irt_query) av->a_un.a_val;
+ }
+ return NULL;
+}
+
+int PpapiPluginStart(const struct PP_StartFunctions *funcs) {
+ TYPE_nacl_irt_query query_func = grok_auxv(find_auxv());
+
+ if (NULL == query_func)
+ fatal_error("PpapiPluginStart: No AT_SYSINFO item found in auxv, "
+ "so cannot start PPAPI. Is the IRT library not present?\n");
+
+ struct nacl_irt_ppapihook hooks;
+ if (sizeof(hooks) != query_func(NACL_IRT_PPAPIHOOK_v0_1,
+ &hooks, sizeof(hooks)))
+ fatal_error("PpapiPluginStart: PPAPI hooks not found\n");
+
+ __nacl_register_thread_creator(&hooks);
+
+ return hooks.ppapi_start(funcs);
+}

Powered by Google App Engine
This is Rietveld 408576698