93 lines
2.9 KiB
Diff
93 lines
2.9 KiB
Diff
--- linux-user/syscall.c
|
|
+++ linux-user/syscall.c
|
|
@@ -140,6 +140,7 @@
|
|
#define __NR_sys_getdents __NR_getdents
|
|
#define __NR_sys_getdents64 __NR_getdents64
|
|
#define __NR_sys_rt_sigqueueinfo __NR_rt_sigqueueinfo
|
|
+#define __NR_sys_syslog __NR_syslog
|
|
|
|
#if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__)
|
|
#define __NR__llseek __NR_lseek
|
|
@@ -159,6 +160,7 @@
|
|
_syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo,
|
|
loff_t *, res, uint, wh);
|
|
_syscall3(int,sys_rt_sigqueueinfo,int,pid,int,sig,siginfo_t *,uinfo)
|
|
+_syscall3(int,sys_syslog,int,type,char*,bufp,int,len)
|
|
#ifdef __NR_exit_group
|
|
_syscall1(int,exit_group,int,error_code)
|
|
#endif
|
|
@@ -172,6 +174,7 @@
|
|
extern int setresgid(gid_t, gid_t, gid_t);
|
|
extern int getresgid(gid_t *, gid_t *, gid_t *);
|
|
extern int setgroups(int, gid_t *);
|
|
+extern int uselib(const char*);
|
|
|
|
static inline long get_errno(long ret)
|
|
{
|
|
@@ -2709,7 +2712,9 @@
|
|
}
|
|
break;
|
|
case TARGET_NR_uselib:
|
|
- goto unimplemented;
|
|
+ ret = get_errno(uselib(path((const char*)arg1)));
|
|
+ break;
|
|
+
|
|
case TARGET_NR_swapon:
|
|
p = lock_user_string(arg1);
|
|
ret = get_errno(swapon(p, arg2));
|
|
@@ -2949,7 +2954,9 @@
|
|
#endif
|
|
|
|
case TARGET_NR_syslog:
|
|
- goto unimplemented;
|
|
+ ret = get_errno(sys_syslog((int)arg1, (char*)arg2, (int)arg3));
|
|
+ break;
|
|
+
|
|
case TARGET_NR_setitimer:
|
|
{
|
|
struct itimerval value, ovalue, *pvalue;
|
|
@@ -3824,7 +3831,9 @@
|
|
goto unimplemented;
|
|
#ifdef TARGET_NR_mincore
|
|
case TARGET_NR_mincore:
|
|
- goto unimplemented;
|
|
+ page_unprotect_range((void*)arg3, ((size_t)arg2 + TARGET_PAGE_SIZE - 1) / TARGET_PAGE_SIZE);
|
|
+ ret = get_errno(mincore((void*)arg1, (size_t)arg2, (unsigned char*)arg3));
|
|
+ break;
|
|
#endif
|
|
#ifdef TARGET_NR_madvise
|
|
case TARGET_NR_madvise:
|
|
@@ -3921,7 +3930,8 @@
|
|
ret = get_errno(gettid());
|
|
break;
|
|
case TARGET_NR_readahead:
|
|
- goto unimplemented;
|
|
+ ret = get_errno(readahead((int)arg1, (off64_t)arg2, (size_t)arg3));
|
|
+ break;
|
|
#ifdef TARGET_NR_setxattr
|
|
case TARGET_NR_setxattr:
|
|
case TARGET_NR_lsetxattr:
|
|
@@ -3946,6 +3956,22 @@
|
|
case TARGET_NR_getdomainname:
|
|
goto unimplemented_nowarn;
|
|
#endif
|
|
+#ifdef TARGET_NR_clock_gettime
|
|
+ case TARGET_NR_clock_gettime:
|
|
+ {
|
|
+ struct target_timespec* ttp = (struct target_timespec*)arg2;
|
|
+ struct timespec htp;
|
|
+ if(ttp) {
|
|
+ htp.tv_sec = tswapl(ttp->tv_sec);
|
|
+ htp.tv_nsec = tswapl(ttp->tv_nsec);
|
|
+ ret = get_errno(clock_gettime((clockid_t)arg1, &htp));
|
|
+ ttp->tv_sec = tswapl(htp.tv_sec);
|
|
+ ttp->tv_nsec = tswapl(htp.tv_nsec);
|
|
+ } else
|
|
+ ret = get_errno(clock_gettime((clockid_t)arg1, NULL));
|
|
+ break;
|
|
+ }
|
|
+#endif
|
|
default:
|
|
unimplemented:
|
|
gemu_log("qemu: Unsupported syscall: %d\n", num);
|