target_original_brk = new_brk;
}
-static long do_brk(char *new_brk)
+long do_brk(char *new_brk)
{
char *brk_page;
long mapped_addr;
case SO_OOBINLINE:
case SO_NO_CHECK:
case SO_PRIORITY:
+#ifdef SO_BSDCOMPAT
case SO_BSDCOMPAT:
+#endif
case SO_PASSCRED:
case SO_TIMESTAMP:
case SO_RCVLOWAT:
if (!ldt_table)
return -ENOMEM;
memset(ldt_table, 0, TARGET_LDT_ENTRIES * TARGET_LDT_ENTRY_SIZE);
- env->ldt.base = ldt_table;
+ env->ldt.base = (long)ldt_table;
env->ldt.limit = 0xffff;
}
#ifdef HAVE_GPROF
_mcleanup();
#endif
+ gdb_exit(cpu_env, arg1);
/* XXX: should free thread stack and CPU env */
_exit(arg1);
ret = 0; /* avoid warning */
case TARGET_NR_chdir:
ret = get_errno(chdir((const char *)arg1));
break;
+#ifdef TARGET_NR_time
case TARGET_NR_time:
{
int *time_ptr = (int *)arg1;
tswap32s(time_ptr);
}
break;
+#endif
case TARGET_NR_mknod:
ret = get_errno(mknod((const char *)arg1, arg2, arg3));
break;
ret = get_errno(utime((const char *)arg1, tbuf1));
}
break;
+ case TARGET_NR_utimes:
+ {
+ struct target_timeval *target_tvp = (struct target_timeval *)arg2;
+ struct timeval *tvp, tv[2];
+ if (target_tvp) {
+ target_to_host_timeval(&tv[0], &target_tvp[0]);
+ target_to_host_timeval(&tv[1], &target_tvp[1]);
+ tvp = tv;
+ } else {
+ tvp = NULL;
+ }
+ ret = get_errno(utimes((const char *)arg1, tvp));
+ }
+ break;
#ifdef TARGET_NR_stty
case TARGET_NR_stty:
goto unimplemented;
arg6));
#endif
break;
+#ifdef TARGET_NR_mmap2
case TARGET_NR_mmap2:
#if defined(TARGET_SPARC)
#define MMAP_SHIFT 12
arg5,
arg6 << MMAP_SHIFT));
break;
+#endif
case TARGET_NR_munmap:
ret = get_errno(target_munmap(arg1, arg2));
break;
case TARGET_NR_idle:
goto unimplemented;
#endif
+#ifdef TARGET_NR_syscall
+ case TARGET_NR_syscall:
+ ret = do_syscall(cpu_env,arg1 & 0xffff,arg2,arg3,arg4,arg5,arg6,0);
+ break;
+#endif
case TARGET_NR_wait4:
{
int status;
#ifdef __NR_exit_group
/* new thread calls */
case TARGET_NR_exit_group:
+ gdb_exit(cpu_env, arg1);
ret = get_errno(exit_group(arg1));
break;
#endif
break;
case TARGET_NR_getdents:
#if TARGET_LONG_SIZE != 4
-#error not supported
+#warning not supported
#elif TARGET_LONG_SIZE == 4 && HOST_LONG_SIZE == 8
{
struct target_dirent *target_dirp = (void *)arg2;
tnamelen = treclen - (2 * sizeof(target_long) + 2);
if (tnamelen > 256)
tnamelen = 256;
+ /* XXX: may not be correct */
strncpy(tde->d_name, de->d_name, tnamelen);
de = (struct dirent *)((char *)de + reclen);
len -= reclen;
break;
}
#endif
+#ifdef TARGET_NR_truncate64
case TARGET_NR_truncate64:
goto unimplemented;
+#endif
+#ifdef TARGET_NR_ftruncate64
case TARGET_NR_ftruncate64:
goto unimplemented;
+#endif
+#ifdef TARGET_NR_stat64
case TARGET_NR_stat64:
ret = get_errno(stat(path((const char *)arg1), &st));
goto do_stat64;
+#endif
+#ifdef TARGET_NR_lstat64
case TARGET_NR_lstat64:
ret = get_errno(lstat(path((const char *)arg1), &st));
goto do_stat64;
+#endif
+#ifdef TARGET_NR_fstat64
case TARGET_NR_fstat64:
{
ret = get_errno(fstat(arg1, &st));
}
}
break;
-
+#endif
#ifdef USE_UID16
case TARGET_NR_lchown:
ret = get_errno(lchown((const char *)arg1, low2highuid(arg2), low2highgid(arg3)));
break;
#endif /* USE_UID16 */
+#ifdef TARGET_NR_lchown32
case TARGET_NR_lchown32:
ret = get_errno(lchown((const char *)arg1, arg2, arg3));
break;
+#endif
+#ifdef TARGET_NR_getuid32
case TARGET_NR_getuid32:
ret = get_errno(getuid());
break;
+#endif
+#ifdef TARGET_NR_getgid32
case TARGET_NR_getgid32:
ret = get_errno(getgid());
break;
+#endif
+#ifdef TARGET_NR_geteuid32
case TARGET_NR_geteuid32:
ret = get_errno(geteuid());
break;
+#endif
+#ifdef TARGET_NR_getegid32
case TARGET_NR_getegid32:
ret = get_errno(getegid());
break;
+#endif
+#ifdef TARGET_NR_setreuid32
case TARGET_NR_setreuid32:
ret = get_errno(setreuid(arg1, arg2));
break;
+#endif
+#ifdef TARGET_NR_setregid32
case TARGET_NR_setregid32:
ret = get_errno(setregid(arg1, arg2));
break;
+#endif
+#ifdef TARGET_NR_getgroups32
case TARGET_NR_getgroups32:
- goto unimplemented;
+ {
+ int gidsetsize = arg1;
+ uint32_t *target_grouplist = (void *)arg2;
+ gid_t *grouplist;
+ int i;
+
+ grouplist = alloca(gidsetsize * sizeof(gid_t));
+ ret = get_errno(getgroups(gidsetsize, grouplist));
+ if (!is_error(ret)) {
+ for(i = 0;i < gidsetsize; i++)
+ put_user(grouplist[i], &target_grouplist[i]);
+ }
+ }
+ break;
+#endif
+#ifdef TARGET_NR_setgroups32
case TARGET_NR_setgroups32:
- goto unimplemented;
+ {
+ int gidsetsize = arg1;
+ uint32_t *target_grouplist = (void *)arg2;
+ gid_t *grouplist;
+ int i;
+
+ grouplist = alloca(gidsetsize * sizeof(gid_t));
+ for(i = 0;i < gidsetsize; i++)
+ get_user(grouplist[i], &target_grouplist[i]);
+ ret = get_errno(setgroups(gidsetsize, grouplist));
+ }
+ break;
+#endif
+#ifdef TARGET_NR_fchown32
case TARGET_NR_fchown32:
ret = get_errno(fchown(arg1, arg2, arg3));
break;
+#endif
+#ifdef TARGET_NR_setresuid32
case TARGET_NR_setresuid32:
ret = get_errno(setresuid(arg1, arg2, arg3));
break;
+#endif
+#ifdef TARGET_NR_getresuid32
case TARGET_NR_getresuid32:
{
int ruid, euid, suid;
}
}
break;
+#endif
+#ifdef TARGET_NR_setresgid32
case TARGET_NR_setresgid32:
ret = get_errno(setresgid(arg1, arg2, arg3));
break;
+#endif
+#ifdef TARGET_NR_getresgid32
case TARGET_NR_getresgid32:
{
int rgid, egid, sgid;
}
}
break;
+#endif
+#ifdef TARGET_NR_chown32
case TARGET_NR_chown32:
ret = get_errno(chown((const char *)arg1, arg2, arg3));
break;
+#endif
+#ifdef TARGET_NR_setuid32
case TARGET_NR_setuid32:
ret = get_errno(setuid(arg1));
break;
+#endif
+#ifdef TARGET_NR_setgid32
case TARGET_NR_setgid32:
ret = get_errno(setgid(arg1));
break;
+#endif
+#ifdef TARGET_NR_setfsuid32
case TARGET_NR_setfsuid32:
ret = get_errno(setfsuid(arg1));
break;
+#endif
+#ifdef TARGET_NR_setfsgid32
case TARGET_NR_setfsgid32:
ret = get_errno(setfsgid(arg1));
break;
+#endif
case TARGET_NR_pivot_root:
goto unimplemented;
default:
unimplemented:
gemu_log("qemu: Unsupported syscall: %d\n", num);
+#if defined(TARGET_NR_setxattr) || defined(TARGET_NR_set_thread_area)
unimplemented_nowarn:
+#endif
ret = -ENOSYS;
break;
}