Преглед изворни кода

Add PS4 port.

Thanks to Eddie Edwards.
Mike Pall пре 11 година
родитељ
комит
6a47e123a4
7 измењених фајлова са 138 додато и 10 уклоњено
  1. 18 2
      doc/install.html
  2. 1 1
      doc/luajit.html
  3. 1 1
      src/lib_io.c
  4. 1 1
      src/lib_os.c
  5. 5 3
      src/lj_alloc.c
  6. 9 2
      src/lj_arch.h
  7. 103 0
      src/ps4build.bat

+ 18 - 2
doc/install.html

@@ -120,7 +120,7 @@ operating systems, CPUs and compilers:
 <tr class="even">
 <tr class="even">
 <td class="compatcpu">x64 (64 bit)</td>
 <td class="compatcpu">x64 (64 bit)</td>
 <td class="compatos">GCC 4.x</td>
 <td class="compatos">GCC 4.x</td>
-<td class="compatos compatno">&nbsp;</td>
+<td class="compatos">ORBIS (<a href="#ps4">PS4</a>)</td>
 <td class="compatos">GCC 4.x</td>
 <td class="compatos">GCC 4.x</td>
 <td class="compatos">MSVC + SDK v7.0<br>WinSDK v7.0</td>
 <td class="compatos">MSVC + SDK v7.0<br>WinSDK v7.0</td>
 </tr>
 </tr>
@@ -460,7 +460,7 @@ make HOST_CC="gcc -m32 -arch i386" CROSS=$ISDKP TARGET_FLAGS="$ISDKF" \
 </pre>
 </pre>
 <p>
 <p>
 You can cross-compile for <b id="ps3">PS3</b> using the PS3&nbsp;SDK from
 You can cross-compile for <b id="ps3">PS3</b> using the PS3&nbsp;SDK from
-a Linux host or a Windows host (requires 32 bit MinGW (GCC) on the host,
+a Linux host or a Windows host (requires 32&nbsp;bit MinGW (GCC) on the host,
 too). Due to restrictions on consoles, the JIT compiler is disabled and
 too). Due to restrictions on consoles, the JIT compiler is disabled and
 only the fast interpreter is built:
 only the fast interpreter is built:
 </p>
 </p>
@@ -468,6 +468,22 @@ only the fast interpreter is built:
 make HOST_CC="gcc -m32" CROSS=ppu-lv2-
 make HOST_CC="gcc -m32" CROSS=ppu-lv2-
 </pre>
 </pre>
 <p>
 <p>
+You can cross-compile for <b id="ps4">PS4</b> from a Windows host using
+the PS4&nbsp;SDK (ORBIS) plus 64&nbsp;bit MSVC. Due to restrictions on
+consoles, the JIT compiler is disabled and only the fast interpreter
+is built.
+</p>
+<p>
+Open a "Visual Studio .NET Command Prompt" (64&nbsp;bit host compiler),
+<tt>cd</tt> to the directory where you've unpacked the sources and run
+the following commands. This builds a static library <tt>libluajit.a</tt>,
+which can be linked against your game, just like the Lua library.
+</p>
+<pre class="code">
+cd src
+ps4build
+</pre>
+<p>
 You can cross-compile for <b id="xbox360">Xbox 360</b> using the
 You can cross-compile for <b id="xbox360">Xbox 360</b> using the
 Xbox&nbsp;360 SDK (MSVC + XEDK). Due to restrictions on consoles, the
 Xbox&nbsp;360 SDK (MSVC + XEDK). Due to restrictions on consoles, the
 JIT compiler is disabled and only the fast interpreter is built.
 JIT compiler is disabled and only the fast interpreter is built.

+ 1 - 1
doc/luajit.html

@@ -158,7 +158,7 @@ LuaJIT is Copyright &copy; 2005-2014 Mike Pall, released under the
 <tr><td>Windows</td><td>Linux</td><td>BSD</td><td>OSX</td><td>POSIX</td></tr>
 <tr><td>Windows</td><td>Linux</td><td>BSD</td><td>OSX</td><td>POSIX</td></tr>
 </table>
 </table>
 <table class="feature os os2">
 <table class="feature os os2">
-<tr><td><span style="font-size:90%;">Embedded</span></td><td>Android</td><td>iOS</td><td>PS3</td><td>Xbox 360</td></tr>
+<tr><td><span style="font-size:90%;">Embedded</span></td><td>Android</td><td>iOS</td><td>PS3</td><td>PS4</td><td>Xbox 360</td></tr>
 </table>
 </table>
 <table class="feature compiler">
 <table class="feature compiler">
 <tr><td>GCC</td><td>CLANG<br>LLVM</td><td>MSVC</td></tr>
 <tr><td>GCC</td><td>CLANG<br>LLVM</td><td>MSVC</td></tr>

+ 1 - 1
src/lib_io.c

@@ -426,7 +426,7 @@ LJLIB_CF(io_popen)
 LJLIB_CF(io_tmpfile)
 LJLIB_CF(io_tmpfile)
 {
 {
   IOFileUD *iof = io_file_new(L);
   IOFileUD *iof = io_file_new(L);
-#if LJ_TARGET_PS3
+#if LJ_TARGET_PS3 || LJ_TARGET_PS4
   iof->fp = NULL; errno = ENOSYS;
   iof->fp = NULL; errno = ENOSYS;
 #else
 #else
   iof->fp = tmpfile();
   iof->fp = tmpfile();

+ 1 - 1
src/lib_os.c

@@ -70,7 +70,7 @@ LJLIB_CF(os_rename)
 
 
 LJLIB_CF(os_tmpname)
 LJLIB_CF(os_tmpname)
 {
 {
-#if LJ_TARGET_PS3
+#if LJ_TARGET_PS3 || LJ_TARGET_PS4
   lj_err_caller(L, LJ_ERR_OSUNIQF);
   lj_err_caller(L, LJ_ERR_OSUNIQF);
   return 0;
   return 0;
 #else
 #else

+ 5 - 3
src/lj_alloc.c

@@ -188,7 +188,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
   return ptr;
   return ptr;
 }
 }
 
 
-#elif LJ_TARGET_OSX || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__sun__)
+#elif LJ_TARGET_OSX || LJ_TARGET_PS4 || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__sun__)
 
 
 /* OSX and FreeBSD mmap() use a naive first-fit linear search.
 /* OSX and FreeBSD mmap() use a naive first-fit linear search.
 ** That's perfect for us. Except that -pagezero_size must be set for OSX,
 ** That's perfect for us. Except that -pagezero_size must be set for OSX,
@@ -197,12 +197,14 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
 */
 */
 #if LJ_TARGET_OSX
 #if LJ_TARGET_OSX
 #define MMAP_REGION_START	((uintptr_t)0x10000)
 #define MMAP_REGION_START	((uintptr_t)0x10000)
+#elif LJ_TARGET_PS4
+#define MMAP_REGION_START	((uintptr_t)0x4000)
 #else
 #else
 #define MMAP_REGION_START	((uintptr_t)0x10000000)
 #define MMAP_REGION_START	((uintptr_t)0x10000000)
 #endif
 #endif
 #define MMAP_REGION_END		((uintptr_t)0x80000000)
 #define MMAP_REGION_END		((uintptr_t)0x80000000)
 
 
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
 #include <sys/resource.h>
 #include <sys/resource.h>
 #endif
 #endif
 
 
@@ -212,7 +214,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
   /* Hint for next allocation. Doesn't need to be thread-safe. */
   /* Hint for next allocation. Doesn't need to be thread-safe. */
   static uintptr_t alloc_hint = MMAP_REGION_START;
   static uintptr_t alloc_hint = MMAP_REGION_START;
   int retry = 0;
   int retry = 0;
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
   static int rlimit_modified = 0;
   static int rlimit_modified = 0;
   if (LJ_UNLIKELY(rlimit_modified == 0)) {
   if (LJ_UNLIKELY(rlimit_modified == 0)) {
     struct rlimit rlim;
     struct rlimit rlim;

+ 9 - 2
src/lj_arch.h

@@ -66,8 +66,8 @@
 #define LUAJIT_OS	LUAJIT_OS_LINUX
 #define LUAJIT_OS	LUAJIT_OS_LINUX
 #elif defined(__MACH__) && defined(__APPLE__)
 #elif defined(__MACH__) && defined(__APPLE__)
 #define LUAJIT_OS	LUAJIT_OS_OSX
 #define LUAJIT_OS	LUAJIT_OS_OSX
-#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
-      defined(__NetBSD__) || defined(__OpenBSD__)
+#elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \
+       defined(__NetBSD__) || defined(__OpenBSD__)) && !defined(__ORBIS__)
 #define LUAJIT_OS	LUAJIT_OS_BSD
 #define LUAJIT_OS	LUAJIT_OS_BSD
 #elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__)
 #elif (defined(__sun__) && defined(__svr4__)) || defined(__CYGWIN__)
 #define LUAJIT_OS	LUAJIT_OS_POSIX
 #define LUAJIT_OS	LUAJIT_OS_POSIX
@@ -104,6 +104,13 @@
 #define LJ_TARGET_CONSOLE	1
 #define LJ_TARGET_CONSOLE	1
 #endif
 #endif
 
 
+#ifdef __ORBIS__
+#define LJ_TARGET_PS4		1
+#define LJ_TARGET_CONSOLE	1
+#undef NULL
+#define NULL ((void*)0)
+#endif
+
 #if _XBOX_VER >= 200
 #if _XBOX_VER >= 200
 #define LJ_TARGET_XBOX360	1
 #define LJ_TARGET_XBOX360	1
 #define LJ_TARGET_CONSOLE	1
 #define LJ_TARGET_CONSOLE	1

+ 103 - 0
src/ps4build.bat

@@ -0,0 +1,103 @@
+@rem Script to build LuaJIT with the PS4 SDK.
+@rem Donated to the public domain.
+@rem
+@rem Open a "Visual Studio .NET Command Prompt" (64 bit host compiler)
+@rem Then cd to this directory and run this script.
+
+@if not defined INCLUDE goto :FAIL
+@if not defined SCE_ORBIS_SDK_DIR goto :FAIL
+
+@setlocal
+@rem ---- Host compiler ----
+@set LJCOMPILE=cl /nologo /c /MD /O2 /W3 /D_CRT_SECURE_NO_DEPRECATE
+@set LJLINK=link /nologo
+@set LJMT=mt /nologo
+@set DASMDIR=..\dynasm
+@set DASM=%DASMDIR%\dynasm.lua
+@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
+
+%LJCOMPILE% host\minilua.c
+@if errorlevel 1 goto :BAD
+%LJLINK% /out:minilua.exe minilua.obj
+@if errorlevel 1 goto :BAD
+if exist minilua.exe.manifest^
+  %LJMT% -manifest minilua.exe.manifest -outputresource:minilua.exe
+
+@rem Check for 64 bit host compiler.
+@minilua
+@if not errorlevel 8 goto :FAIL
+
+@set DASMFLAGS=-D P64
+minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc
+@if errorlevel 1 goto :BAD
+
+%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_X64 -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI host\buildvm*.c
+@if errorlevel 1 goto :BAD
+%LJLINK% /out:buildvm.exe buildvm*.obj
+@if errorlevel 1 goto :BAD
+if exist buildvm.exe.manifest^
+  %LJMT% -manifest buildvm.exe.manifest -outputresource:buildvm.exe
+
+buildvm -m elfasm -o lj_vm.s
+@if errorlevel 1 goto :BAD
+buildvm -m bcdef -o lj_bcdef.h %ALL_LIB%
+@if errorlevel 1 goto :BAD
+buildvm -m ffdef -o lj_ffdef.h %ALL_LIB%
+@if errorlevel 1 goto :BAD
+buildvm -m libdef -o lj_libdef.h %ALL_LIB%
+@if errorlevel 1 goto :BAD
+buildvm -m recdef -o lj_recdef.h %ALL_LIB%
+@if errorlevel 1 goto :BAD
+buildvm -m vmdef -o jit\vmdef.lua %ALL_LIB%
+@if errorlevel 1 goto :BAD
+buildvm -m folddef -o lj_folddef.h lj_opt_fold.c
+@if errorlevel 1 goto :BAD
+
+@rem ---- Cross compiler ----
+@set LJCOMPILE="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-clang" -c -Wall -DLUAJIT_DISABLE_FFI
+@set LJLIB="%SCE_ORBIS_SDK_DIR%\host_tools\bin\orbis-ar" rcus
+@set INCLUDE=""
+
+orbis-as -o lj_vm.o lj_vm.s
+
+@if "%1" neq "debug" goto :NODEBUG
+@shift
+@set LJCOMPILE=%LJCOMPILE% -g -O0
+@set TARGETLIB=libluajitD.a
+goto :BUILD
+:NODEBUG
+@set LJCOMPILE=%LJCOMPILE% -O2
+@set TARGETLIB=libluajit.a
+:BUILD
+del %TARGETLIB%
+@if "%1"=="amalg" goto :AMALG
+for %%f in (lj_*.c lib_*.c) do (
+  %LJCOMPILE% %%f
+  @if errorlevel 1 goto :BAD
+)
+
+%LJLIB% %TARGETLIB% lj_*.o lib_*.o
+@if errorlevel 1 goto :BAD
+@goto :NOAMALG
+:AMALG
+%LJCOMPILE% ljamalg.c
+@if errorlevel 1 goto :BAD
+%LJLIB% %TARGETLIB% ljamalg.o lj_vm.o
+@if errorlevel 1 goto :BAD
+:NOAMALG
+
+@del *.o *.obj *.manifest minilua.exe buildvm.exe
+@echo.
+@echo === Successfully built LuaJIT for PS4 ===
+
+@goto :END
+:BAD
+@echo.
+@echo *******************************************************
+@echo *** Build FAILED -- Please check the error messages ***
+@echo *******************************************************
+@goto :END
+:FAIL
+@echo To run this script you must open a "Visual Studio .NET Command Prompt"
+@echo (64 bit host compiler). The PS4 Orbis SDK must be installed, too.
+:END