summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-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
-rw-r--r--src/ntux.c10
4 files changed, 170 insertions, 6 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
diff --git a/src/ntux.c b/src/ntux.c
index 41cc4d3..890fbc0 100644
--- a/src/ntux.c
+++ b/src/ntux.c
@@ -8,18 +8,16 @@
#include <ntux/ntux.h>
#include "ntux_driver_impl.h"
-int ntux_entry_point(void)
+int ntux_entry_routine(
+ int(*__psx_init_routine)(int *,char ***,char ***,void *),
+ struct __psx_context * ctx)
{
int argc;
char ** argv;
char ** envp;
- struct __psx_context ctx = {0,0,0,0,0,0,0,0,0,0,0,0};
-
- /* ctx */
- ctx.size = sizeof(ctx);
/* __psx_init must succeed... */
- if (__psx_init(&argc,&argv,&envp,&ctx))
+ if (__psx_init_routine(&argc,&argv,&envp,ctx))
return -1;
/* ...and conform */