]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
Add Nintendo Switch port.
authorMike Pall <mike>
Wed, 8 Jun 2022 12:24:57 +0000 (14:24 +0200)
committerMike Pall <mike>
Wed, 8 Jun 2022 12:24:57 +0000 (14:24 +0200)
Contributed by Swyter and vdweller84.

src/lib_io.c
src/lib_os.c
src/lj_arch.h
src/lj_dispatch.h
src/lj_prng.c
src/nxbuild.bat [new file with mode: 0644]

index 7f218e49c72faab1b462300642d1215f73d47156..c22faa24e9dcd1b11cfe4cecb3660c0f6b4e8213 100644 (file)
@@ -439,7 +439,7 @@ LJLIB_CF(io_popen)
 LJLIB_CF(io_tmpfile)
 {
   IOFileUD *iof = io_file_new(L);
-#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PS5 || LJ_TARGET_PSVITA
+#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PS5 || LJ_TARGET_PSVITA || LJ_TARGET_NX
   iof->fp = NULL; errno = ENOSYS;
 #else
   iof->fp = tmpfile();
index eb8704cf6784412ea9591653afcbf7d4b6bba5f0..6bcd0147d2b4099e993c049088f3297adfb97cf9 100644 (file)
@@ -76,7 +76,7 @@ LJLIB_CF(os_rename)
 
 LJLIB_CF(os_tmpname)
 {
-#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PS5 || LJ_TARGET_PSVITA
+#if LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PS5 || LJ_TARGET_PSVITA || LJ_TARGET_NX
   lj_err_caller(L, LJ_ERR_OSUNIQF);
   return 0;
 #else
index 1852c4976ee27725f79420ce29b610d8c97a19e4..882c99cb2c3a6ff9e32a7224f7f74c0281d574ae 100644 (file)
 #define LJ_TARGET_GC64         1
 #endif
 
+#ifdef __NX__
+#define LJ_TARGET_NX           1
+#define LJ_TARGET_CONSOLE      1
+#undef NULL
+#define NULL ((void*)0)
+#endif
+
 #ifdef _UWP
 #define LJ_TARGET_UWP          1
 #if LUAJIT_TARGET == LUAJIT_ARCH_X64
index 0594af518bcfb3205352b3faf7272b3fd510560a..52762eeaa5be1f4c112b5ace9000dd20029809e2 100644 (file)
@@ -89,7 +89,7 @@ typedef uint16_t HotCount;
 typedef struct GG_State {
   lua_State L;                         /* Main thread. */
   global_State g;                      /* Global state. */
-#if LJ_TARGET_ARM
+#if LJ_TARGET_ARM && !LJ_TARGET_NX
   /* Make g reachable via K12 encoded DISPATCH-relative addressing. */
   uint8_t align1[(16-sizeof(global_State))&15];
 #endif
@@ -99,7 +99,7 @@ typedef struct GG_State {
 #if LJ_HASJIT
   jit_State J;                         /* JIT state. */
   HotCount hotcount[HOTCOUNT_SIZE];    /* Hot counters. */
-#if LJ_TARGET_ARM
+#if LJ_TARGET_ARM && !LJ_TARGET_NX
   /* Ditto for J. */
   uint8_t align2[(16-sizeof(jit_State)-sizeof(HotCount)*HOTCOUNT_SIZE)&15];
 #endif
index fd8219de96a2231b5cbb1e953336e0d97c5cb780..9e57505e8102794ac49761c58a1e17fd39b5e59a 100644 (file)
@@ -87,6 +87,10 @@ extern int sys_get_random_number(void *buf, uint64_t len);
 
 extern int sceRandomGetRandomNumber(void *buf, size_t len);
 
+#elif LJ_TARGET_NX
+
+#include <unistd.h>
+
 #elif LJ_TARGET_WINDOWS || LJ_TARGET_XBOXONE
 
 #define WIN32_LEAN_AND_MEAN
@@ -176,6 +180,11 @@ int LJ_FASTCALL lj_prng_seed_secure(PRNGState *rs)
   if (sceRandomGetRandomNumber(rs->u, sizeof(rs->u)) == 0)
     goto ok;
 
+#elif LJ_TARGET_NX
+
+  if (getentropy(rs->u, sizeof(rs->u)) == 0)
+    goto ok;
+
 #elif LJ_TARGET_UWP || LJ_TARGET_XBOXONE
 
   if (BCryptGenRandom(NULL, (PUCHAR)(rs->u), (ULONG)sizeof(rs->u),
diff --git a/src/nxbuild.bat b/src/nxbuild.bat
new file mode 100644 (file)
index 0000000..c4a21f0
--- /dev/null
@@ -0,0 +1,159 @@
+@rem Script to build LuaJIT with NintendoSDK + NX Addon.\r
+@rem Donated to the public domain by Swyter.\r
+@rem\r
+@rem To run this script you must open a "Native Tools Command Prompt for VS".\r
+@rem\r
+@rem Either the x86 version for NX32, or x64 for the NX64 target.\r
+@rem This is because the pointer size of the LuaJIT host tools (buildvm.exe)\r
+@rem must match the cross-compiled target (32 or 64 bits).\r
+@rem\r
+@rem Then cd to this directory and run this script.\r
+@rem\r
+@rem Recommended invocation:\r
+@rem\r
+@rem nxbuild            # release build, amalgamated\r
+@rem nxbuild debug      # debug build, amalgamated\r
+@rem\r
+@rem Additional command-line options (not generally recommended):\r
+@rem\r
+@rem noamalg            # (after debug) non-amalgamated build\r
+\r
+@if not defined INCLUDE goto :FAIL\r
+@if not defined NINTENDO_SDK_ROOT goto :FAIL\r
+@if not defined PLATFORM goto :FAIL\r
+\r
+@if "%platform%" == "x86" goto :DO_NX32\r
+@if "%platform%" == "x64" goto :DO_NX64\r
+\r
+@echo Error: Current host platform is %platform%!\r
+@echo.\r
+@goto :FAIL\r
+\r
+@setlocal\r
+\r
+:DO_NX32\r
+@set DASC=vm_arm.dasc\r
+@set DASMFLAGS= -D HFABI -D FPU\r
+@set DASMTARGET= -D LUAJIT_TARGET=LUAJIT_ARCH_ARM\r
+@set HOST_PTR_SIZE=4\r
+goto :BEGIN\r
+\r
+:DO_NX64\r
+@set DASC=vm_arm64.dasc\r
+@set DASMFLAGS= -D ENDIAN_LE\r
+@set DASMTARGET= -D LUAJIT_TARGET=LUAJIT_ARCH_ARM64\r
+@set HOST_PTR_SIZE=8\r
+\r
+:BEGIN\r
+@rem ---- Host compiler ----\r
+@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /wo4146 /wo4244 /D_CRT_SECURE_NO_DEPRECATE\r
+@set LJLINK=link /nologo\r
+@set LJMT=mt /nologo\r
+@set DASMDIR=..\dynasm\r
+@set DASM=%DASMDIR%\dynasm.lua\r
+@set ALL_LIB=lib_base.c lib_math.c lib_bit.c lib_string.c lib_table.c lib_io.c lib_os.c lib_package.c lib_debug.c lib_jit.c lib_ffi.c lib_buffer.c\r
+\r
+%LJCOMPILE% host\minilua.c\r
+@if errorlevel 1 goto :BAD\r
+%LJLINK% /out:minilua.exe minilua.obj\r
+@if errorlevel 1 goto :BAD\r
+if exist minilua.exe.manifest^\r
+  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe\r
+\r
+@rem Check that we have the right 32/64 bit host compiler to generate the right virtual machine files.\r
+@minilua\r
+@if "%ERRORLEVEL%" == "%HOST_PTR_SIZE%" goto :PASSED_PTR_CHECK\r
+\r
+@echo The pointer size of the host in bytes (%HOST_PTR_SIZE%) does not match the expected value (%errorlevel%).\r
+@echo Check that the script is being ran under the correct x86/x64 VS prompt.\r
+@goto :BAD\r
+\r
+:PASSED_PTR_CHECK\r
+@set DASMFLAGS=%DASMFLAGS% %DASMTARGET% -D LJ_TARGET_NX -D LUAJIT_OS=LUAJIT_OS_OTHER -D LUAJIT_DISABLE_JIT -D LUAJIT_DISABLE_FFI\r
+minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h %DASC%\r
+@if errorlevel 1 goto :BAD\r
+%LJCOMPILE% /I "." /I %DASMDIR% %DASMTARGET% -D LJ_TARGET_NX -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI host\buildvm*.c\r
+@if errorlevel 1 goto :BAD\r
+%LJLINK% /out:buildvm.exe buildvm*.obj\r
+@if errorlevel 1 goto :BAD\r
+if exist buildvm.exe.manifest^\r
+  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe\r
+\r
+buildvm -m elfasm -o lj_vm.s\r
+@if errorlevel 1 goto :BAD\r
+buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%\r
+@if errorlevel 1 goto :BAD\r
+buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%\r
+@if errorlevel 1 goto :BAD\r
+buildvm -m libdef -o lj_libdef.h %ALL_LIB%\r
+@if errorlevel 1 goto :BAD\r
+buildvm -m recdef -o lj_recdef.h %ALL_LIB%\r
+@if errorlevel 1 goto :BAD\r
+buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%\r
+@if errorlevel 1 goto :BAD\r
+buildvm -m folddef -o lj_folddef.h lj_opt_fold.c\r
+@if errorlevel 1 goto :BAD\r
+\r
+@rem ---- Cross compiler ----\r
+@if "%platform%" neq "x64" goto :NX32_CROSSBUILD\r
+@set LJCOMPILE="%NINTENDO_SDK_ROOT%\Compilers\NX\nx\aarch64\bin\clang" -Wall -I%NINTENDO_SDK_ROOT%\Include %DASMTARGET% -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLUAJIT_USE_SYSMALLOC -c\r
+@set LJLIB="%NINTENDO_SDK_ROOT%\Compilers\NX\nx\aarch64\bin\aarch64-nintendo-nx-elf-ar" rc\r
+@set TARGETLIB_SUFFIX=nx64\r
+\r
+%NINTENDO_SDK_ROOT%\Compilers\NX\nx\aarch64\bin\aarch64-nintendo-nx-elf-as -o lj_vm.o lj_vm.s\r
+goto :DEBUGCHECK\r
+\r
+:NX32_CROSSBUILD\r
+@set LJCOMPILE="%NINTENDO_SDK_ROOT%\Compilers\NX\nx\armv7l\bin\clang" -Wall -I%NINTENDO_SDK_ROOT%\Include %DASMTARGET% -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLUAJIT_USE_SYSMALLOC -c\r
+@set LJLIB="%NINTENDO_SDK_ROOT%\Compilers\NX\nx\armv7l\bin\armv7l-nintendo-nx-eabihf-ar" rc\r
+@set TARGETLIB_SUFFIX=nx32\r
+\r
+%NINTENDO_SDK_ROOT%\Compilers\NX\nx\armv7l\bin\armv7l-nintendo-nx-eabihf-as -o lj_vm.o lj_vm.s\r
+:DEBUGCHECK\r
+\r
+@if "%1" neq "debug" goto :NODEBUG\r
+@shift\r
+@set LJCOMPILE=%LJCOMPILE% -DNN_SDK_BUILD_DEBUG -g -O0\r
+@set TARGETLIB=libluajitD_%TARGETLIB_SUFFIX%.a\r
+goto :BUILD\r
+:NODEBUG\r
+@set LJCOMPILE=%LJCOMPILE% -DNN_SDK_BUILD_RELEASE -O3\r
+@set TARGETLIB=libluajit_%TARGETLIB_SUFFIX%.a\r
+:BUILD\r
+del %TARGETLIB%\r
+@if "%1" neq "noamalg" goto :AMALG\r
+for %%f in (lj_*.c lib_*.c) do (\r
+  %LJCOMPILE% %%f\r
+  @if errorlevel 1 goto :BAD\r
+)\r
+\r
+%LJLIB% %TARGETLIB% lj_*.o lib_*.o\r
+@if errorlevel 1 goto :BAD\r
+@goto :NOAMALG\r
+:AMALG\r
+%LJCOMPILE% ljamalg.c\r
+@if errorlevel 1 goto :BAD\r
+%LJLIB% %TARGETLIB% ljamalg.o lj_vm.o\r
+@if errorlevel 1 goto :BAD\r
+:NOAMALG\r
+\r
+@del *.o *.obj *.manifest minilua.exe buildvm.exe\r
+@echo.\r
+@echo === Successfully built LuaJIT for Nintendo Switch (%TARGETLIB_SUFFIX%) ===\r
+\r
+@goto :END\r
+:BAD\r
+@echo.\r
+@echo *******************************************************\r
+@echo *** Build FAILED -- Please check the error messages ***\r
+@echo *******************************************************\a\r
+@goto :END\r
+:FAIL\r
+@echo To run this script you must open a "Native Tools Command Prompt for VS".\r
+@echo.\r
+@echo Either the x86 version for NX32, or x64 for the NX64 target.\r
+@echo This is because the pointer size of the LuaJIT host tools (buildvm.exe)\r
+@echo must match the cross-compiled target (32 or 64 bits).\r
+@echo.\r
+@echo Keep in mind that NintendoSDK + NX Addon must be installed, too.\r
+:END\r