diff options
author | midipix <writeonce@midipix.org> | 2015-04-05 17:05:57 -0400 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2015-04-05 17:05:57 -0400 |
commit | 296178913c5dfbc2b35842fc16ed680ef51fd402 (patch) | |
tree | 6720928dbc03c3d656229d2509eda38f6eb0628b /src/thread/nt32/clone.c | |
parent | 20a5ca45ef2f5716e8f2dea42c7e8a6b3367619f (diff) | |
download | mmglue-296178913c5dfbc2b35842fc16ed680ef51fd402.tar.bz2 mmglue-296178913c5dfbc2b35842fc16ed680ef51fd402.tar.xz |
nt32: initial commit of core port files.
signed-off by Z. Gilboa; see copying.midipix (9cd0746c) for additional information.
Diffstat (limited to 'src/thread/nt32/clone.c')
-rw-r--r-- | src/thread/nt32/clone.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/thread/nt32/clone.c b/src/thread/nt32/clone.c new file mode 100644 index 0000000..fb53501 --- /dev/null +++ b/src/thread/nt32/clone.c @@ -0,0 +1,54 @@ +#include <syscall.h> + +struct pt_regs { + unsigned long ebp; + unsigned long ebx; + unsigned long eax; + unsigned long ecx; + unsigned long edx; + unsigned long esi; + unsigned long edi; + unsigned long orig_eax; + unsigned long eip; + unsigned long cs; + unsigned long eflags; + unsigned long esp; + unsigned long ss; +}; + +typedef long __sys_clone( + unsigned long flags, + void * child_stack, + void * ptid, + void * ctid, + struct pt_regs *regs); + +typedef int __entry_point(void *); + +extern unsigned long ** __syscall_vtbl; + +int __clone( + __entry_point * fn, + void * child_stack, + int flags, + void * arg, + int * ptid, + void * pthread_self_addr, + int * ctid) +{ + struct pt_regs regs; + __sys_clone * pfn_clone; + + regs.eip = (unsigned long)fn; + regs.ecx = (unsigned long)arg; + regs.edx = (unsigned long)pthread_self_addr; + + pfn_clone = (__sys_clone *)(__syscall_vtbl[SYS_clone]); + + return (int)pfn_clone( + flags, + child_stack, + ptid, + ctid, + ®s); +} |