summaryrefslogtreecommitdiffhomepage
path: root/src/init
diff options
context:
space:
mode:
authormidipix <writeonce@midipix.org>2018-05-23 08:36:23 +0000
committermidipix <writeonce@midipix.org>2018-05-23 10:24:50 -0400
commit407aecafb7c25689638b4f4dd8e60b339b5738ca (patch)
treec1ae8713654f5b29124002b855fe1acd2a876f0c /src/init
parent5ec9b67e061e7bf839d6ae986354190d2e1e0037 (diff)
downloadntux-407aecafb7c25689638b4f4dd8e60b339b5738ca.tar.bz2
ntux-407aecafb7c25689638b4f4dd8e60b339b5738ca.tar.xz
utility: support all three linking modes (ldso/vrfs/static).
Diffstat (limited to 'src/init')
-rw-r--r--src/init/ntux_init_ldso.c71
-rw-r--r--src/init/ntux_init_static.c28
-rw-r--r--src/init/ntux_init_vrfs.c67
3 files changed, 166 insertions, 0 deletions
diff --git a/src/init/ntux_init_ldso.c b/src/init/ntux_init_ldso.c
new file mode 100644
index 0000000..11b0fce
--- /dev/null
+++ b/src/init/ntux_init_ldso.c
@@ -0,0 +1,71 @@
+/***********************************************************/
+/* ntux: native translation und extension */
+/* Copyright (C) 2016--2018 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.NTUX. */
+/***********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <pemagine/pemagine.h>
+#include <ntapi/ntapi.h>
+#include <psxscl/psxglue.h>
+#include <ntux/ntux.h>
+
+#ifndef NTUX_ALL_STATIC
+#ifndef NTUX_STANDALONE
+
+/* framework (rtdata) abi */
+static const struct pe_guid __ldsoabi = NT_PROCESS_GUID_RTDATA;
+
+/* loader root-relative name */
+static const unsigned short __rrldso[] = {'l','i','b','\\',
+ 'l','i','b','p','s','x','s','c','l',
+ '.','s','o',0};
+
+/* pty server root-relative name */
+static const unsigned short __rrctty[] = {'b','i','n','\\',
+ 'n','t','c','t','t','y',
+ '.','e','x','e',0};
+
+/* system call layer init context */
+static struct __psx_context ctx = {sizeof(ctx),0,0,0,0,0,0,0,0,0,0,0};
+
+/* ldso buffer */
+static uintptr_t __attribute__((section(".dsodata")))
+ __dsodata[65536/sizeof(unsigned long)];
+
+int ntux_entry_routine(
+ int(*__psx_init_routine)(int *,char ***,char ***,void *),
+ struct __psx_context * ctx);
+
+void ntux_entry_point(void)
+{
+ int status;
+ void * hroot;
+ void * hdsodir;
+ void * ldsobase;
+ int (*__psx_init)(
+ int *,char ***,char ***,
+ void *);
+
+ if ((status = __ldso_load_framework_loader_ex(
+ &ldsobase,&hroot,&hdsodir,
+ &__ldsoabi,
+ 0,__rrldso,ntux_main,
+ __dsodata,sizeof(__dsodata),
+ PE_LDSO_DEFAULT_EXECUTABLE,
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if (!(__psx_init = __ldso_get_procedure_address(
+ ldsobase,"__psx_init")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ ctx.options = __PSXOPT_LDSO;
+ ctx.ctty = __rrctty;
+ ctx.refaddr = ntux_entry_point;
+
+ ntux_entry_routine(__psx_init,&ctx);
+}
+
+#endif
+#endif
diff --git a/src/init/ntux_init_static.c b/src/init/ntux_init_static.c
new file mode 100644
index 0000000..8d7f8bb
--- /dev/null
+++ b/src/init/ntux_init_static.c
@@ -0,0 +1,28 @@
+/***********************************************************/
+/* ntux: native translation und extension */
+/* Copyright (C) 2016--2018 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.NTUX. */
+/***********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <pemagine/pemagine.h>
+#include <ntapi/ntapi.h>
+#include <psxscl/psxglue.h>
+#include <ntux/ntux.h>
+
+#ifdef NTUX_ALL_STATIC
+
+int __psx_init(int *,char ***,char ***,void *);
+
+int ntux_entry_routine(
+ int(*__psx_init_routine)(int *,char ***,char ***,void *),
+ struct __psx_context * ctx);
+
+static struct __psx_context ctx = {sizeof(ctx),0,0,0,0,0,0,0,0,0,0,0};
+
+void ntux_entry_point(void)
+{
+ ntux_entry_routine(__psx_init,&ctx);
+}
+
+#endif
diff --git a/src/init/ntux_init_vrfs.c b/src/init/ntux_init_vrfs.c
new file mode 100644
index 0000000..08c1fef
--- /dev/null
+++ b/src/init/ntux_init_vrfs.c
@@ -0,0 +1,67 @@
+/***********************************************************/
+/* ntux: native translation und extension */
+/* Copyright (C) 2016--2018 Z. Gilboa */
+/* Released under GPLv2 and GPLv3; see COPYING.NTUX. */
+/***********************************************************/
+
+#include <psxtypes/psxtypes.h>
+#include <pemagine/pemagine.h>
+#include <ntapi/ntapi.h>
+#include <psxscl/psxglue.h>
+#include <ntux/ntux.h>
+
+#ifdef NTUX_STANDALONE
+
+/* framework (rtdata) abi */
+static const struct pe_guid __ldsoabi = NT_PROCESS_GUID_RTDATA;
+
+/* loader standalone (single directory) name */
+static const unsigned short __sdldso[] = {'l','i','b','p','s','x','s','c','l',
+ '.','s','o',0};
+
+/* pty server standalone name */
+static const unsigned short __sdctty[] = {'n','t','c','t','t','y',
+ '.','e','x','e',0};
+
+/* system call layer init context */
+static struct __psx_context ctx = {sizeof(ctx),0,0,0,0,0,0,0,0,0,0,0};
+
+/* ldso buffer */
+static uintptr_t __attribute__((section(".dsodata")))
+ __dsodata[65536/sizeof(unsigned long)];
+
+int ntux_entry_routine(
+ int(*__psx_init_routine)(int *,char ***,char ***,void *),
+ struct __psx_context * ctx);
+
+void ntux_entry_point(void)
+{
+ int status;
+ void * hroot;
+ void * hdsodir;
+ void * ldsobase;
+ int (*__psx_init)(
+ int *,char ***,char ***,
+ void *);
+
+ if ((status = __ldso_load_framework_loader_ex(
+ &ldsobase,&hroot,&hdsodir,
+ &__ldsoabi,
+ __sdldso,0,ntux_main,
+ __dsodata,sizeof(__dsodata),
+ PE_LDSO_STANDALONE_EXECUTABLE,
+ &(unsigned int){0})))
+ __ldso_terminate_current_process(status);
+
+ if (!(__psx_init = __ldso_get_procedure_address(
+ ldsobase,"__psx_init")))
+ __ldso_terminate_current_process(NT_STATUS_NOINTERFACE);
+
+ ctx.options = __PSXOPT_VRFS;
+ ctx.ctty = __sdctty;
+ ctx.refaddr = ntux_entry_point;
+
+ ntux_entry_routine(__psx_init,&ctx);
+}
+
+#endif