aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2018-06-05 17:03:08 +0200
committerMike Pall <mike>2018-06-05 17:03:08 +0200
commitc3c54ce1aef782823936808a75460e6b53aada2c (patch)
tree999dc989e25281bfc36ed8861d6f14b5d4e89786 /src
parenta5a89ab586a3b5bb4f266949bbf3dc2b140e2374 (diff)
downloadluajit-c3c54ce1aef782823936808a75460e6b53aada2c.tar.gz
luajit-c3c54ce1aef782823936808a75460e6b53aada2c.tar.bz2
luajit-c3c54ce1aef782823936808a75460e6b53aada2c.zip
Windows: Add UWP support, part 1.
Contributed by Ben Pye.
Diffstat (limited to 'src')
-rw-r--r--src/lib_ffi.c3
-rw-r--r--src/lib_io.c4
-rw-r--r--src/lib_package.c24
-rw-r--r--src/lj_alloc.c6
-rw-r--r--src/lj_arch.h19
-rw-r--r--src/lj_ccallback.c4
-rw-r--r--src/lj_clib.c20
-rw-r--r--src/lj_mcode.c8
-rw-r--r--src/lj_profile.c8
9 files changed, 76 insertions, 20 deletions
diff --git a/src/lib_ffi.c b/src/lib_ffi.c
index 199cfc9a..8032411e 100644
--- a/src/lib_ffi.c
+++ b/src/lib_ffi.c
@@ -747,6 +747,9 @@ LJLIB_CF(ffi_abi) LJLIB_REC(.)
747#if LJ_ABI_WIN 747#if LJ_ABI_WIN
748 case H_(4ab624a8,4ab624a8): b = 1; break; /* win */ 748 case H_(4ab624a8,4ab624a8): b = 1; break; /* win */
749#endif 749#endif
750#if LJ_TARGET_UWP
751 case H_(a40f0bcb,a40f0bcb): b = 1; break; /* uwp */
752#endif
750 case H_(3af93066,1f001464): b = 1; break; /* le/be */ 753 case H_(3af93066,1f001464): b = 1; break; /* le/be */
751#if LJ_GC64 754#if LJ_GC64
752 case H_(9e89d2c9,13c83c92): b = 1; break; /* gc64 */ 755 case H_(9e89d2c9,13c83c92): b = 1; break; /* gc64 */
diff --git a/src/lib_io.c b/src/lib_io.c
index 9763ed46..73fd9322 100644
--- a/src/lib_io.c
+++ b/src/lib_io.c
@@ -99,7 +99,7 @@ static int io_file_close(lua_State *L, IOFileUD *iof)
99 int stat = -1; 99 int stat = -1;
100#if LJ_TARGET_POSIX 100#if LJ_TARGET_POSIX
101 stat = pclose(iof->fp); 101 stat = pclose(iof->fp);
102#elif LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE 102#elif LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE && !LJ_TARGET_UWP
103 stat = _pclose(iof->fp); 103 stat = _pclose(iof->fp);
104#else 104#else
105 lua_assert(0); 105 lua_assert(0);
@@ -406,7 +406,7 @@ LJLIB_CF(io_open)
406 406
407LJLIB_CF(io_popen) 407LJLIB_CF(io_popen)
408{ 408{
409#if LJ_TARGET_POSIX || (LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE) 409#if LJ_TARGET_POSIX || (LJ_TARGET_WINDOWS && !LJ_TARGET_XBOXONE && !LJ_TARGET_UWP)
410 const char *fname = strdata(lj_lib_checkstr(L, 1)); 410 const char *fname = strdata(lj_lib_checkstr(L, 1));
411 GCstr *s = lj_lib_optstr(L, 2); 411 GCstr *s = lj_lib_optstr(L, 2);
412 const char *mode = s ? strdata(s) : "r"; 412 const char *mode = s ? strdata(s) : "r";
diff --git a/src/lib_package.c b/src/lib_package.c
index 6fac43ec..bedd6d79 100644
--- a/src/lib_package.c
+++ b/src/lib_package.c
@@ -76,6 +76,20 @@ static const char *ll_bcsym(void *lib, const char *sym)
76BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*); 76BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*);
77#endif 77#endif
78 78
79#if LJ_TARGET_UWP
80void *LJ_WIN_LOADLIBA(const char *path)
81{
82 DWORD err = GetLastError();
83 wchar_t wpath[256];
84 HANDLE lib = NULL;
85 if (MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, 256) > 0) {
86 lib = LoadPackagedLibrary(wpath, 0);
87 }
88 SetLastError(err);
89 return lib;
90}
91#endif
92
79#undef setprogdir 93#undef setprogdir
80 94
81static void setprogdir(lua_State *L) 95static void setprogdir(lua_State *L)
@@ -119,7 +133,7 @@ static void ll_unloadlib(void *lib)
119 133
120static void *ll_load(lua_State *L, const char *path, int gl) 134static void *ll_load(lua_State *L, const char *path, int gl)
121{ 135{
122 HINSTANCE lib = LoadLibraryExA(path, NULL, 0); 136 HINSTANCE lib = LJ_WIN_LOADLIBA(path);
123 if (lib == NULL) pusherror(L); 137 if (lib == NULL) pusherror(L);
124 UNUSED(gl); 138 UNUSED(gl);
125 return lib; 139 return lib;
@@ -132,17 +146,25 @@ static lua_CFunction ll_sym(lua_State *L, void *lib, const char *sym)
132 return f; 146 return f;
133} 147}
134 148
149#if LJ_TARGET_UWP
150EXTERN_C IMAGE_DOS_HEADER __ImageBase;
151#endif
152
135static const char *ll_bcsym(void *lib, const char *sym) 153static const char *ll_bcsym(void *lib, const char *sym)
136{ 154{
137 if (lib) { 155 if (lib) {
138 return (const char *)GetProcAddress((HINSTANCE)lib, sym); 156 return (const char *)GetProcAddress((HINSTANCE)lib, sym);
139 } else { 157 } else {
158#if LJ_TARGET_UWP
159 return (const char *)GetProcAddress((HINSTANCE)&__ImageBase, sym);
160#else
140 HINSTANCE h = GetModuleHandleA(NULL); 161 HINSTANCE h = GetModuleHandleA(NULL);
141 const char *p = (const char *)GetProcAddress(h, sym); 162 const char *p = (const char *)GetProcAddress(h, sym);
142 if (p == NULL && GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, 163 if (p == NULL && GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
143 (const char *)ll_bcsym, &h)) 164 (const char *)ll_bcsym, &h))
144 p = (const char *)GetProcAddress(h, sym); 165 p = (const char *)GetProcAddress(h, sym);
145 return p; 166 return p;
167#endif
146 } 168 }
147} 169}
148 170
diff --git a/src/lj_alloc.c b/src/lj_alloc.c
index 9fc761c7..f3b6a54d 100644
--- a/src/lj_alloc.c
+++ b/src/lj_alloc.c
@@ -167,7 +167,7 @@ static void *DIRECT_MMAP(size_t size)
167static void *CALL_MMAP(size_t size) 167static void *CALL_MMAP(size_t size)
168{ 168{
169 DWORD olderr = GetLastError(); 169 DWORD olderr = GetLastError();
170 void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); 170 void *ptr = LJ_WIN_VALLOC(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
171 SetLastError(olderr); 171 SetLastError(olderr);
172 return ptr ? ptr : MFAIL; 172 return ptr ? ptr : MFAIL;
173} 173}
@@ -176,8 +176,8 @@ static void *CALL_MMAP(size_t size)
176static void *DIRECT_MMAP(size_t size) 176static void *DIRECT_MMAP(size_t size)
177{ 177{
178 DWORD olderr = GetLastError(); 178 DWORD olderr = GetLastError();
179 void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, 179 void *ptr = LJ_WIN_VALLOC(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
180 PAGE_READWRITE); 180 PAGE_READWRITE);
181 SetLastError(olderr); 181 SetLastError(olderr);
182 return ptr ? ptr : MFAIL; 182 return ptr ? ptr : MFAIL;
183} 183}
diff --git a/src/lj_arch.h b/src/lj_arch.h
index e796912e..31a11593 100644
--- a/src/lj_arch.h
+++ b/src/lj_arch.h
@@ -135,6 +135,13 @@
135#define LJ_TARGET_GC64 1 135#define LJ_TARGET_GC64 1
136#endif 136#endif
137 137
138#ifdef _UWP
139#define LJ_TARGET_UWP 1
140#if LUAJIT_TARGET == LUAJIT_ARCH_X64
141#define LJ_TARGET_GC64 1
142#endif
143#endif
144
138#define LJ_NUMMODE_SINGLE 0 /* Single-number mode only. */ 145#define LJ_NUMMODE_SINGLE 0 /* Single-number mode only. */
139#define LJ_NUMMODE_SINGLE_DUAL 1 /* Default to single-number mode. */ 146#define LJ_NUMMODE_SINGLE_DUAL 1 /* Default to single-number mode. */
140#define LJ_NUMMODE_DUAL 2 /* Dual-number mode only. */ 147#define LJ_NUMMODE_DUAL 2 /* Dual-number mode only. */
@@ -570,6 +577,18 @@
570#define LJ_NO_UNWIND 1 577#define LJ_NO_UNWIND 1
571#endif 578#endif
572 579
580#if LJ_TARGET_WINDOWS
581#if LJ_TARGET_UWP
582#define LJ_WIN_VALLOC VirtualAllocFromApp
583#define LJ_WIN_VPROTECT VirtualProtectFromApp
584extern void *LJ_WIN_LOADLIBA(const char *path);
585#else
586#define LJ_WIN_VALLOC VirtualAlloc
587#define LJ_WIN_VPROTECT VirtualProtect
588#define LJ_WIN_LOADLIBA(path) LoadLibraryExA((path), NULL, 0)
589#endif
590#endif
591
573/* Compatibility with Lua 5.1 vs. 5.2. */ 592/* Compatibility with Lua 5.1 vs. 5.2. */
574#ifdef LUAJIT_ENABLE_LUA52COMPAT 593#ifdef LUAJIT_ENABLE_LUA52COMPAT
575#define LJ_52 1 594#define LJ_52 1
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c
index 03494a7a..412dbf85 100644
--- a/src/lj_ccallback.c
+++ b/src/lj_ccallback.c
@@ -267,7 +267,7 @@ static void callback_mcode_new(CTState *cts)
267 if (CALLBACK_MAX_SLOT == 0) 267 if (CALLBACK_MAX_SLOT == 0)
268 lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); 268 lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
269#if LJ_TARGET_WINDOWS 269#if LJ_TARGET_WINDOWS
270 p = VirtualAlloc(NULL, sz, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE); 270 p = LJ_WIN_VALLOC(NULL, sz, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
271 if (!p) 271 if (!p)
272 lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV); 272 lj_err_caller(cts->L, LJ_ERR_FFI_CBACKOV);
273#elif LJ_TARGET_POSIX 273#elif LJ_TARGET_POSIX
@@ -285,7 +285,7 @@ static void callback_mcode_new(CTState *cts)
285#if LJ_TARGET_WINDOWS 285#if LJ_TARGET_WINDOWS
286 { 286 {
287 DWORD oprot; 287 DWORD oprot;
288 VirtualProtect(p, sz, PAGE_EXECUTE_READ, &oprot); 288 LJ_WIN_VPROTECT(p, sz, PAGE_EXECUTE_READ, &oprot);
289 } 289 }
290#elif LJ_TARGET_POSIX 290#elif LJ_TARGET_POSIX
291 mprotect(p, sz, (PROT_READ|PROT_EXEC)); 291 mprotect(p, sz, (PROT_READ|PROT_EXEC));
diff --git a/src/lj_clib.c b/src/lj_clib.c
index 61426590..f016b06b 100644
--- a/src/lj_clib.c
+++ b/src/lj_clib.c
@@ -158,11 +158,13 @@ BOOL WINAPI GetModuleHandleExA(DWORD, LPCSTR, HMODULE*);
158/* Default libraries. */ 158/* Default libraries. */
159enum { 159enum {
160 CLIB_HANDLE_EXE, 160 CLIB_HANDLE_EXE,
161#if !LJ_TARGET_UWP
161 CLIB_HANDLE_DLL, 162 CLIB_HANDLE_DLL,
162 CLIB_HANDLE_CRT, 163 CLIB_HANDLE_CRT,
163 CLIB_HANDLE_KERNEL32, 164 CLIB_HANDLE_KERNEL32,
164 CLIB_HANDLE_USER32, 165 CLIB_HANDLE_USER32,
165 CLIB_HANDLE_GDI32, 166 CLIB_HANDLE_GDI32,
167#endif
166 CLIB_HANDLE_MAX 168 CLIB_HANDLE_MAX
167}; 169};
168 170
@@ -208,7 +210,7 @@ static const char *clib_extname(lua_State *L, const char *name)
208static void *clib_loadlib(lua_State *L, const char *name, int global) 210static void *clib_loadlib(lua_State *L, const char *name, int global)
209{ 211{
210 DWORD oldwerr = GetLastError(); 212 DWORD oldwerr = GetLastError();
211 void *h = (void *)LoadLibraryExA(clib_extname(L, name), NULL, 0); 213 void *h = LJ_WIN_LOADLIBA(clib_extname(L, name));
212 if (!h) clib_error(L, "cannot load module " LUA_QS ": %s", name); 214 if (!h) clib_error(L, "cannot load module " LUA_QS ": %s", name);
213 SetLastError(oldwerr); 215 SetLastError(oldwerr);
214 UNUSED(global); 216 UNUSED(global);
@@ -218,6 +220,7 @@ static void *clib_loadlib(lua_State *L, const char *name, int global)
218static void clib_unloadlib(CLibrary *cl) 220static void clib_unloadlib(CLibrary *cl)
219{ 221{
220 if (cl->handle == CLIB_DEFHANDLE) { 222 if (cl->handle == CLIB_DEFHANDLE) {
223#if !LJ_TARGET_UWP
221 MSize i; 224 MSize i;
222 for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) { 225 for (i = CLIB_HANDLE_KERNEL32; i < CLIB_HANDLE_MAX; i++) {
223 void *h = clib_def_handle[i]; 226 void *h = clib_def_handle[i];
@@ -226,11 +229,16 @@ static void clib_unloadlib(CLibrary *cl)
226 FreeLibrary((HINSTANCE)h); 229 FreeLibrary((HINSTANCE)h);
227 } 230 }
228 } 231 }
232#endif
229 } else if (cl->handle) { 233 } else if (cl->handle) {
230 FreeLibrary((HINSTANCE)cl->handle); 234 FreeLibrary((HINSTANCE)cl->handle);
231 } 235 }
232} 236}
233 237
238#if LJ_TARGET_UWP
239EXTERN_C IMAGE_DOS_HEADER __ImageBase;
240#endif
241
234static void *clib_getsym(CLibrary *cl, const char *name) 242static void *clib_getsym(CLibrary *cl, const char *name)
235{ 243{
236 void *p = NULL; 244 void *p = NULL;
@@ -239,6 +247,9 @@ static void *clib_getsym(CLibrary *cl, const char *name)
239 for (i = 0; i < CLIB_HANDLE_MAX; i++) { 247 for (i = 0; i < CLIB_HANDLE_MAX; i++) {
240 HINSTANCE h = (HINSTANCE)clib_def_handle[i]; 248 HINSTANCE h = (HINSTANCE)clib_def_handle[i];
241 if (!(void *)h) { /* Resolve default library handles (once). */ 249 if (!(void *)h) { /* Resolve default library handles (once). */
250#if LJ_TARGET_UWP
251 h = (HINSTANCE)&__ImageBase;
252#else
242 switch (i) { 253 switch (i) {
243 case CLIB_HANDLE_EXE: GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, &h); break; 254 case CLIB_HANDLE_EXE: GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, NULL, &h); break;
244 case CLIB_HANDLE_DLL: 255 case CLIB_HANDLE_DLL:
@@ -249,11 +260,12 @@ static void *clib_getsym(CLibrary *cl, const char *name)
249 GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, 260 GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS|GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
250 (const char *)&_fmode, &h); 261 (const char *)&_fmode, &h);
251 break; 262 break;
252 case CLIB_HANDLE_KERNEL32: h = LoadLibraryExA("kernel32.dll", NULL, 0); break; 263 case CLIB_HANDLE_KERNEL32: h = LJ_WIN_LOADLIBA("kernel32.dll"); break;
253 case CLIB_HANDLE_USER32: h = LoadLibraryExA("user32.dll", NULL, 0); break; 264 case CLIB_HANDLE_USER32: h = LJ_WIN_LOADLIBA("user32.dll"); break;
254 case CLIB_HANDLE_GDI32: h = LoadLibraryExA("gdi32.dll", NULL, 0); break; 265 case CLIB_HANDLE_GDI32: h = LJ_WIN_LOADLIBA("gdi32.dll"); break;
255 } 266 }
256 if (!h) continue; 267 if (!h) continue;
268#endif
257 clib_def_handle[i] = (void *)h; 269 clib_def_handle[i] = (void *)h;
258 } 270 }
259 p = (void *)GetProcAddress(h, name); 271 p = (void *)GetProcAddress(h, name);
diff --git a/src/lj_mcode.c b/src/lj_mcode.c
index e46e3ef0..64b0ca90 100644
--- a/src/lj_mcode.c
+++ b/src/lj_mcode.c
@@ -66,8 +66,8 @@ void lj_mcode_sync(void *start, void *end)
66 66
67static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, DWORD prot) 67static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, DWORD prot)
68{ 68{
69 void *p = VirtualAlloc((void *)hint, sz, 69 void *p = LJ_WIN_VALLOC((void *)hint, sz,
70 MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, prot); 70 MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, prot);
71 if (!p && !hint) 71 if (!p && !hint)
72 lj_trace_err(J, LJ_TRERR_MCODEAL); 72 lj_trace_err(J, LJ_TRERR_MCODEAL);
73 return p; 73 return p;
@@ -82,7 +82,7 @@ static void mcode_free(jit_State *J, void *p, size_t sz)
82static int mcode_setprot(void *p, size_t sz, DWORD prot) 82static int mcode_setprot(void *p, size_t sz, DWORD prot)
83{ 83{
84 DWORD oprot; 84 DWORD oprot;
85 return !VirtualProtect(p, sz, prot, &oprot); 85 return !LJ_WIN_VPROTECT(p, sz, prot, &oprot);
86} 86}
87 87
88#elif LJ_TARGET_POSIX 88#elif LJ_TARGET_POSIX
@@ -255,7 +255,7 @@ static void *mcode_alloc(jit_State *J, size_t sz)
255/* All memory addresses are reachable by relative jumps. */ 255/* All memory addresses are reachable by relative jumps. */
256static void *mcode_alloc(jit_State *J, size_t sz) 256static void *mcode_alloc(jit_State *J, size_t sz)
257{ 257{
258#ifdef __OpenBSD__ 258#if defined(__OpenBSD__) || LJ_TARGET_UWP
259 /* Allow better executable memory allocation for OpenBSD W^X mode. */ 259 /* Allow better executable memory allocation for OpenBSD W^X mode. */
260 void *p = mcode_alloc_at(J, 0, sz, MCPROT_RUN); 260 void *p = mcode_alloc_at(J, 0, sz, MCPROT_RUN);
261 if (p && mcode_setprot(p, sz, MCPROT_GEN)) { 261 if (p && mcode_setprot(p, sz, MCPROT_GEN)) {
diff --git a/src/lj_profile.c b/src/lj_profile.c
index 116998e1..3223697f 100644
--- a/src/lj_profile.c
+++ b/src/lj_profile.c
@@ -247,7 +247,7 @@ static DWORD WINAPI profile_thread(void *psx)
247{ 247{
248 ProfileState *ps = (ProfileState *)psx; 248 ProfileState *ps = (ProfileState *)psx;
249 int interval = ps->interval; 249 int interval = ps->interval;
250#if LJ_TARGET_WINDOWS 250#if LJ_TARGET_WINDOWS && !LJ_TARGET_UWP
251 ps->wmm_tbp(interval); 251 ps->wmm_tbp(interval);
252#endif 252#endif
253 while (1) { 253 while (1) {
@@ -255,7 +255,7 @@ static DWORD WINAPI profile_thread(void *psx)
255 if (ps->abort) break; 255 if (ps->abort) break;
256 profile_trigger(ps); 256 profile_trigger(ps);
257 } 257 }
258#if LJ_TARGET_WINDOWS 258#if LJ_TARGET_WINDOWS && !LJ_TARGET_UWP
259 ps->wmm_tep(interval); 259 ps->wmm_tep(interval);
260#endif 260#endif
261 return 0; 261 return 0;
@@ -264,9 +264,9 @@ static DWORD WINAPI profile_thread(void *psx)
264/* Start profiling timer thread. */ 264/* Start profiling timer thread. */
265static void profile_timer_start(ProfileState *ps) 265static void profile_timer_start(ProfileState *ps)
266{ 266{
267#if LJ_TARGET_WINDOWS 267#if LJ_TARGET_WINDOWS && !LJ_TARGET_UWP
268 if (!ps->wmm) { /* Load WinMM library on-demand. */ 268 if (!ps->wmm) { /* Load WinMM library on-demand. */
269 ps->wmm = LoadLibraryExA("winmm.dll", NULL, 0); 269 ps->wmm = LJ_WIN_LOADLIBA("winmm.dll");
270 if (ps->wmm) { 270 if (ps->wmm) {
271 ps->wmm_tbp = (WMM_TPFUNC)GetProcAddress(ps->wmm, "timeBeginPeriod"); 271 ps->wmm_tbp = (WMM_TPFUNC)GetProcAddress(ps->wmm, "timeBeginPeriod");
272 ps->wmm_tep = (WMM_TPFUNC)GetProcAddress(ps->wmm, "timeEndPeriod"); 272 ps->wmm_tep = (WMM_TPFUNC)GetProcAddress(ps->wmm, "timeEndPeriod");