summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--psxscl.local.patch15
-rw-r--r--psxscl.local@lucio-vm.local.patch189
2 files changed, 190 insertions, 14 deletions
diff --git a/psxscl.local.patch b/psxscl.local.patch
index 491b7cc4..1b3b9c02 100644
--- a/psxscl.local.patch
+++ b/psxscl.local.patch
@@ -134,17 +134,4 @@ index a623d2a..80dd4a9 100644
+ NT_SEC_RESERVE,
image->info.hfile)))
return __execve_return(tlca,0,target,-ENOEXEC);
-
---- psxscl/src/mman/_mmap.c.orig 2016-03-07 14:29:56.539765500 +0100
-+++ psxscl/src/mman/_mmap.c 2016-03-07 14:37:21.460223800 +0100
-@@ -95,7 +95,9 @@
- return (void *)__psx_sig_epilog(m.tlca,-EINVAL,EPSXONLY);
-
- /* protection */
-- if (__psx_convert_flags_to_native(
-+ if (!prot)
-+ m.cprot = NT_PAGE_NOACCESS;
-+ else if (__psx_convert_flags_to_native(
- __mmap_section_prot,
- prot,&m.cprot,0))
- return (void *)__psx_sig_epilog(m.tlca,-EINVAL,EPSXONLY);
+
diff --git a/psxscl.local@lucio-vm.local.patch b/psxscl.local@lucio-vm.local.patch
index 86ef312b..1ef8615c 100644
--- a/psxscl.local@lucio-vm.local.patch
+++ b/psxscl.local@lucio-vm.local.patch
@@ -11,3 +11,192 @@ index 924b1b8..02846ba 100644
#endif
int32_t __psx_init_cwd(void)
+diff --git a/project/common.mk b/project/common.mk
+index 4390578..fa6df57 100644
+--- a/project/common.mk
++++ b/project/common.mk
+@@ -102,6 +102,7 @@ COMMON_SRCS = \
+ src/kernel/_systime.c \
+ src/kernel/_uname.c \
+ src/mman/_mmap.c \
++ src/mman/_mprotect.c \
+ src/mman/_mremap.c \
+ src/mman/_munmap.c \
+ src/mount/_mount.c \
+diff --git a/src/init/psx_dev_wip.c b/src/init/psx_dev_wip.c
+index fe319bc..3915590 100644
+--- a/src/init/psx_dev_wip.c
++++ b/src/init/psx_dev_wip.c
+@@ -89,6 +89,7 @@ static void __populate_syscall_vtbl(void)
+
+ /* mman */
+ set_syscall_pointer(mmap);
++ set_syscall_pointer(mprotect);
+ set_syscall_pointer(mremap);
+ set_syscall_pointer(munmap);
+
+@@ -263,6 +264,7 @@ static void __populate_strace_vtbl(void)
+
+ /* mman */
+ set_strace_pointer(mmap);
++ set_strace_pointer(mprotect);
+ set_strace_pointer(mremap);
+ set_strace_pointer(munmap);
+
+diff --git a/src/internal/psx.h b/src/internal/psx.h
+index 1791bda..21efa46 100644
+--- a/src/internal/psx.h
++++ b/src/internal/psx.h
+@@ -97,6 +97,7 @@ typedef intptr_t __sys_routine(uname)(struct __utsname *);
+
+ /* mman */
+ typedef void * __sys_routine(mmap)(void * addr, size_t length, int prot, int flags, int,off_t offset);
++typedef intptr_t __sys_routine(mprotect)(void * addr, size_t length, int prot);
+ typedef void * __sys_routine(mremap)(void * mapaddr, size_t mapsize, size_t newsize, int flags);
+ typedef intptr_t __sys_routine(munmap)(void * addr, size_t length);
+
+@@ -270,6 +271,7 @@ __sys_interface(uname);
+
+ /* mman */
+ __sys_interface(mmap);
++__sys_interface(mprotect);
+ __sys_interface(mremap);
+ __sys_interface(munmap);
+
+diff --git a/src/internal/psx_strace.c b/src/internal/psx_strace.c
+index 6d39093..45e7ecd 100644
+--- a/src/internal/psx_strace.c
++++ b/src/internal/psx_strace.c
+@@ -859,6 +859,22 @@ void * __strace_mmap(void * addr,size_t length,int prot,int flags,int fd,off_t o
+
+ }
+
++intptr_t __strace_mprotect(void * addr,size_t length,int prot)
++{
++ struct __strace_params params = {
++ __STRACE_MPROTECT,3,
++ {__STRACE_SINTEGER,0},
++ {{__STRACE_POINTER,(intptr_t)addr},
++ {__STRACE_SINTEGER,length},
++ {__STRACE_SINTEGER,prot}}};
++
++ if (!addr) params.params[0].type = __STRACE_SINTEGER;
++ params.ret.value = (intptr_t)__sys_mprotect(addr,length,prot);
++ __strace(&params);
++ return (void *)params.ret.value;
++
++}
++
+ void * __strace_mremap(void * mapaddr, size_t mapsize, size_t newsize, int flags)
+ {
+ struct __strace_params params = {
+diff --git a/src/internal/psx_strace.h b/src/internal/psx_strace.h
+index 67eecce..293cfdf 100644
+--- a/src/internal/psx_strace.h
++++ b/src/internal/psx_strace.h
+@@ -60,6 +60,7 @@ enum __strace_sysids {
+ __STRACE_SYSINFO,
+ __STRACE_UNAME,
+ __STRACE_MMAP,
++ __STRACE_MPROTECT,
+ __STRACE_MREMAP,
+ __STRACE_MUNMAP,
+ __STRACE_MOUNT,
+@@ -197,6 +198,7 @@ enum __strace_sysids {
+ "sysinfo", \
+ "uname", \
+ "mmap", \
++ "mprotect", \
+ "mremap", \
+ "munmap", \
+ "mount", \
+@@ -346,6 +348,7 @@ __strace_interface(uname);
+
+ /* mman */
+ __strace_interface(mmap);
++__strace_interface(mprotect);
+ __strace_interface(mremap);
+ __strace_interface(munmap);
+
+diff --git a/src/mman/_mmap.c b/src/mman/_mmap.c
+index 13762e3..27ea942 100644
+--- a/src/mman/_mmap.c
++++ b/src/mman/_mmap.c
+@@ -95,7 +95,9 @@ void * __sys_mmap(
+ return (void *)__psx_sig_epilog(m.tlca,-EINVAL,EPSXONLY);
+
+ /* protection */
+- if (__psx_convert_flags_to_native(
++ if (!prot)
++ m.cprot = NT_PAGE_NOACCESS;
++ else if (__psx_convert_flags_to_native(
+ __mmap_section_prot,
+ prot,&m.cprot,0))
+ return (void *)__psx_sig_epilog(m.tlca,-EINVAL,EPSXONLY);
+diff --git a/src/mman/_mprotect.c b/src/mman/_mprotect.c
+new file mode 100644
+index 0000000..7ac46d3
+--- /dev/null
++++ b/src/mman/_mprotect.c
+@@ -0,0 +1,61 @@
++/********************************************************/
++/* psxscl: a thread-safe system call layer library */
++/* Copyright (C) 2013--2016 Z. Gilboa */
++/* Released under GPLv2 and GPLv3; see COPYING.PSXSCL. */
++/********************************************************/
++
++#include <ntapi/ntapi.h>
++#include "psx_systypes.h"
++#include "psx_tlca.h"
++#include "psx_errno.h"
++#include "psx_flags.h"
++#include "psx_mman.h"
++#include "psx_signal.h"
++#include "psx_ofd.h"
++#include "psx_acl.h"
++#include "psx.h"
++
++static const struct __flag_set __mmap_section_prot[] = {
++ {PROT_READ, NT_PAGE_READONLY},
++ {PROT_WRITE, NT_PAGE_READWRITE},
++ {PROT_EXEC, NT_PAGE_EXECUTE},
++ {PROT_NONE, 0},
++ {0, 0}};
++
++
++__psx_api
++intptr_t __sys_mprotect(
++ void * addr,
++ size_t length,
++ int prot)
++{
++ int32_t status;
++ struct __psx_tlca * tlca;
++ struct __psx_ctx * ctx;
++ uint32_t cprot, protect_type_old;
++
++ /* prolog */
++ tlca = __tlca_self();
++ if (!(ctx = __tlca_shared_ctx(tlca))) return 0;
++ __psx_sig_prolog(tlca);
++
++
++ /* protection */
++ if (!prot)
++ cprot = NT_PAGE_NOACCESS;
++ else if (__psx_convert_flags_to_native(
++ __mmap_section_prot,
++ prot,&cprot,0))
++ return __psx_sig_epilog(tlca,-EINVAL,EPSXONLY);
++
++ if (cprot & NT_PAGE_READWRITE)
++ cprot = NT_PAGE_READWRITE;
++
++ if ((status = __ntapi->zw_protect_virtual_memory(
++ NT_CURRENT_PROCESS_HANDLE,
++ &addr, &length,
++ cprot, &protect_type_old)))
++ return __psx_sig_epilog(tlca,-ENOMEM,status);
++
++ return __psx_sig_epilog(tlca,0,status);
++}