Commit 5cd4393b14b68a4e80a3ffa74c04efff2b9590a5
1 parent
7ed601b7
first vm86 support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@60 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
162 additions
and
33 deletions
linux-user/syscall.c
@@ -103,10 +103,10 @@ extern int personality(int); | @@ -103,10 +103,10 @@ extern int personality(int); | ||
103 | extern int flock(int, int); | 103 | extern int flock(int, int); |
104 | extern int setfsuid(int); | 104 | extern int setfsuid(int); |
105 | extern int setfsgid(int); | 105 | extern int setfsgid(int); |
106 | -extern int setresuid(int,int,int); | ||
107 | -extern int getresuid(int *,int *,int *); | ||
108 | -extern int setresgid(int,int,int); | ||
109 | -extern int getresgid(int *,int *,int *); | 106 | +extern int setresuid(uid_t, uid_t, uid_t); |
107 | +extern int getresuid(uid_t *, uid_t *, uid_t *); | ||
108 | +extern int setresgid(gid_t, gid_t, gid_t); | ||
109 | +extern int getresgid(gid_t *, gid_t *, gid_t *); | ||
110 | 110 | ||
111 | static inline long get_errno(long ret) | 111 | static inline long get_errno(long ret) |
112 | { | 112 | { |
@@ -210,14 +210,14 @@ static inline void host_to_target_fds(target_long *target_fds, | @@ -210,14 +210,14 @@ static inline void host_to_target_fds(target_long *target_fds, | ||
210 | } | 210 | } |
211 | 211 | ||
212 | static inline void target_to_host_timeval(struct timeval *tv, | 212 | static inline void target_to_host_timeval(struct timeval *tv, |
213 | - struct target_timeval *target_tv) | 213 | + const struct target_timeval *target_tv) |
214 | { | 214 | { |
215 | tv->tv_sec = tswapl(target_tv->tv_sec); | 215 | tv->tv_sec = tswapl(target_tv->tv_sec); |
216 | tv->tv_usec = tswapl(target_tv->tv_usec); | 216 | tv->tv_usec = tswapl(target_tv->tv_usec); |
217 | } | 217 | } |
218 | 218 | ||
219 | static inline void host_to_target_timeval(struct target_timeval *target_tv, | 219 | static inline void host_to_target_timeval(struct target_timeval *target_tv, |
220 | - struct timeval *tv) | 220 | + const struct timeval *tv) |
221 | { | 221 | { |
222 | target_tv->tv_sec = tswapl(tv->tv_sec); | 222 | target_tv->tv_sec = tswapl(tv->tv_sec); |
223 | target_tv->tv_usec = tswapl(tv->tv_usec); | 223 | target_tv->tv_usec = tswapl(tv->tv_usec); |
@@ -238,8 +238,7 @@ static long do_select(long n, | @@ -238,8 +238,7 @@ static long do_select(long n, | ||
238 | efds_ptr = target_to_host_fds(&efds, target_efds, n); | 238 | efds_ptr = target_to_host_fds(&efds, target_efds, n); |
239 | 239 | ||
240 | if (target_tv) { | 240 | if (target_tv) { |
241 | - tv.tv_sec = tswapl(target_tv->tv_sec); | ||
242 | - tv.tv_usec = tswapl(target_tv->tv_usec); | 241 | + target_to_host_timeval(&tv, target_tv); |
243 | tv_ptr = &tv; | 242 | tv_ptr = &tv; |
244 | } else { | 243 | } else { |
245 | tv_ptr = NULL; | 244 | tv_ptr = NULL; |
@@ -251,8 +250,7 @@ static long do_select(long n, | @@ -251,8 +250,7 @@ static long do_select(long n, | ||
251 | host_to_target_fds(target_efds, efds_ptr, n); | 250 | host_to_target_fds(target_efds, efds_ptr, n); |
252 | 251 | ||
253 | if (target_tv) { | 252 | if (target_tv) { |
254 | - target_tv->tv_sec = tswapl(tv.tv_sec); | ||
255 | - target_tv->tv_usec = tswapl(tv.tv_usec); | 253 | + host_to_target_timeval(target_tv, &tv); |
256 | } | 254 | } |
257 | } | 255 | } |
258 | return ret; | 256 | return ret; |
@@ -755,7 +753,7 @@ install: | @@ -755,7 +753,7 @@ install: | ||
755 | } | 753 | } |
756 | 754 | ||
757 | /* specific and weird i386 syscalls */ | 755 | /* specific and weird i386 syscalls */ |
758 | -int gemu_modify_ldt(CPUX86State *env, int func, void *ptr, unsigned long bytecount) | 756 | +int do_modify_ldt(CPUX86State *env, int func, void *ptr, unsigned long bytecount) |
759 | { | 757 | { |
760 | int ret = -ENOSYS; | 758 | int ret = -ENOSYS; |
761 | 759 | ||
@@ -773,6 +771,79 @@ int gemu_modify_ldt(CPUX86State *env, int func, void *ptr, unsigned long bytecou | @@ -773,6 +771,79 @@ int gemu_modify_ldt(CPUX86State *env, int func, void *ptr, unsigned long bytecou | ||
773 | return ret; | 771 | return ret; |
774 | } | 772 | } |
775 | 773 | ||
774 | +/* vm86 emulation */ | ||
775 | + | ||
776 | +#define SAFE_MASK (0xDD5) | ||
777 | + | ||
778 | +int do_vm86(CPUX86State *env, long subfunction, | ||
779 | + struct target_vm86plus_struct * target_v86) | ||
780 | +{ | ||
781 | + TaskState *ts = env->opaque; | ||
782 | + int ret; | ||
783 | + | ||
784 | + switch (subfunction) { | ||
785 | + case TARGET_VM86_REQUEST_IRQ: | ||
786 | + case TARGET_VM86_FREE_IRQ: | ||
787 | + case TARGET_VM86_GET_IRQ_BITS: | ||
788 | + case TARGET_VM86_GET_AND_RESET_IRQ: | ||
789 | + gemu_log("qemu: unsupported vm86 subfunction (%ld)\n", subfunction); | ||
790 | + ret = -EINVAL; | ||
791 | + goto out; | ||
792 | + case TARGET_VM86_PLUS_INSTALL_CHECK: | ||
793 | + /* NOTE: on old vm86 stuff this will return the error | ||
794 | + from verify_area(), because the subfunction is | ||
795 | + interpreted as (invalid) address to vm86_struct. | ||
796 | + So the installation check works. | ||
797 | + */ | ||
798 | + ret = 0; | ||
799 | + goto out; | ||
800 | + } | ||
801 | + | ||
802 | + ts->target_v86 = target_v86; | ||
803 | + | ||
804 | + /* save current CPU regs */ | ||
805 | + ts->vm86_saved_regs.eax = 0; /* default vm86 syscall return code */ | ||
806 | + ts->vm86_saved_regs.ebx = env->regs[R_EBX]; | ||
807 | + ts->vm86_saved_regs.ecx = env->regs[R_ECX]; | ||
808 | + ts->vm86_saved_regs.edx = env->regs[R_EDX]; | ||
809 | + ts->vm86_saved_regs.esi = env->regs[R_ESI]; | ||
810 | + ts->vm86_saved_regs.edi = env->regs[R_EDI]; | ||
811 | + ts->vm86_saved_regs.ebp = env->regs[R_EBP]; | ||
812 | + ts->vm86_saved_regs.esp = env->regs[R_ESP]; | ||
813 | + ts->vm86_saved_regs.eflags = env->eflags; | ||
814 | + ts->vm86_saved_regs.eip = env->eip; | ||
815 | + ts->vm86_saved_regs.cs = env->segs[R_CS]; | ||
816 | + ts->vm86_saved_regs.ss = env->segs[R_SS]; | ||
817 | + ts->vm86_saved_regs.ds = env->segs[R_DS]; | ||
818 | + ts->vm86_saved_regs.es = env->segs[R_ES]; | ||
819 | + ts->vm86_saved_regs.fs = env->segs[R_FS]; | ||
820 | + ts->vm86_saved_regs.gs = env->segs[R_GS]; | ||
821 | + | ||
822 | + /* build vm86 CPU state */ | ||
823 | + env->eflags = (env->eflags & ~SAFE_MASK) | | ||
824 | + (tswap32(target_v86->regs.eflags) & SAFE_MASK) | VM_MASK; | ||
825 | + | ||
826 | + env->regs[R_EBX] = tswap32(target_v86->regs.ebx); | ||
827 | + env->regs[R_ECX] = tswap32(target_v86->regs.ecx); | ||
828 | + env->regs[R_EDX] = tswap32(target_v86->regs.edx); | ||
829 | + env->regs[R_ESI] = tswap32(target_v86->regs.esi); | ||
830 | + env->regs[R_EDI] = tswap32(target_v86->regs.edi); | ||
831 | + env->regs[R_EBP] = tswap32(target_v86->regs.ebp); | ||
832 | + env->regs[R_ESP] = tswap32(target_v86->regs.esp); | ||
833 | + env->eip = tswap32(target_v86->regs.eip); | ||
834 | + cpu_x86_load_seg(env, R_CS, tswap16(target_v86->regs.cs)); | ||
835 | + cpu_x86_load_seg(env, R_SS, tswap16(target_v86->regs.ss)); | ||
836 | + cpu_x86_load_seg(env, R_DS, tswap16(target_v86->regs.ds)); | ||
837 | + cpu_x86_load_seg(env, R_ES, tswap16(target_v86->regs.es)); | ||
838 | + cpu_x86_load_seg(env, R_FS, tswap16(target_v86->regs.fs)); | ||
839 | + cpu_x86_load_seg(env, R_GS, tswap16(target_v86->regs.gs)); | ||
840 | + ret = tswap32(target_v86->regs.eax); /* eax will be restored at | ||
841 | + the end of the syscall */ | ||
842 | + /* now the virtual CPU is ready for vm86 execution ! */ | ||
843 | + out: | ||
844 | + return ret; | ||
845 | +} | ||
846 | + | ||
776 | /* this stack is the equivalent of the kernel stack associated with a | 847 | /* this stack is the equivalent of the kernel stack associated with a |
777 | thread/process */ | 848 | thread/process */ |
778 | #define NEW_STACK_SIZE 8192 | 849 | #define NEW_STACK_SIZE 8192 |
@@ -788,19 +859,26 @@ static int clone_func(void *arg) | @@ -788,19 +859,26 @@ static int clone_func(void *arg) | ||
788 | int do_fork(CPUX86State *env, unsigned int flags, unsigned long newsp) | 859 | int do_fork(CPUX86State *env, unsigned int flags, unsigned long newsp) |
789 | { | 860 | { |
790 | int ret; | 861 | int ret; |
862 | + TaskState *ts; | ||
791 | uint8_t *new_stack; | 863 | uint8_t *new_stack; |
792 | CPUX86State *new_env; | 864 | CPUX86State *new_env; |
793 | 865 | ||
794 | if (flags & CLONE_VM) { | 866 | if (flags & CLONE_VM) { |
795 | if (!newsp) | 867 | if (!newsp) |
796 | newsp = env->regs[R_ESP]; | 868 | newsp = env->regs[R_ESP]; |
797 | - new_stack = malloc(NEW_STACK_SIZE); | ||
798 | - | 869 | + ts = malloc(sizeof(TaskState) + NEW_STACK_SIZE); |
870 | + memset(ts, 0, sizeof(TaskState)); | ||
871 | + new_stack = ts->stack; | ||
872 | + ts->used = 1; | ||
873 | + /* add in task state list */ | ||
874 | + ts->next = first_task_state; | ||
875 | + first_task_state = ts; | ||
799 | /* we create a new CPU instance. */ | 876 | /* we create a new CPU instance. */ |
800 | new_env = cpu_x86_init(); | 877 | new_env = cpu_x86_init(); |
801 | memcpy(new_env, env, sizeof(CPUX86State)); | 878 | memcpy(new_env, env, sizeof(CPUX86State)); |
802 | new_env->regs[R_ESP] = newsp; | 879 | new_env->regs[R_ESP] = newsp; |
803 | new_env->regs[R_EAX] = 0; | 880 | new_env->regs[R_EAX] = 0; |
881 | + new_env->opaque = ts; | ||
804 | ret = clone(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env); | 882 | ret = clone(clone_func, new_stack + NEW_STACK_SIZE, flags, new_env); |
805 | } else { | 883 | } else { |
806 | /* if no CLONE_VM, we consider it is a fork */ | 884 | /* if no CLONE_VM, we consider it is a fork */ |
@@ -1281,8 +1359,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1281,8 +1359,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1281 | struct timeval tv; | 1359 | struct timeval tv; |
1282 | ret = get_errno(gettimeofday(&tv, NULL)); | 1360 | ret = get_errno(gettimeofday(&tv, NULL)); |
1283 | if (!is_error(ret)) { | 1361 | if (!is_error(ret)) { |
1284 | - target_tv->tv_sec = tswapl(tv.tv_sec); | ||
1285 | - target_tv->tv_usec = tswapl(tv.tv_usec); | 1362 | + host_to_target_timeval(target_tv, &tv); |
1286 | } | 1363 | } |
1287 | } | 1364 | } |
1288 | break; | 1365 | break; |
@@ -1290,8 +1367,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1290,8 +1367,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1290 | { | 1367 | { |
1291 | struct target_timeval *target_tv = (void *)arg1; | 1368 | struct target_timeval *target_tv = (void *)arg1; |
1292 | struct timeval tv; | 1369 | struct timeval tv; |
1293 | - tv.tv_sec = tswapl(target_tv->tv_sec); | ||
1294 | - tv.tv_usec = tswapl(target_tv->tv_usec); | 1370 | + target_to_host_timeval(&tv, target_tv); |
1295 | ret = get_errno(settimeofday(&tv, NULL)); | 1371 | ret = get_errno(settimeofday(&tv, NULL)); |
1296 | } | 1372 | } |
1297 | break; | 1373 | break; |
@@ -1487,8 +1563,6 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1487,8 +1563,6 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1487 | break; | 1563 | break; |
1488 | case TARGET_NR_idle: | 1564 | case TARGET_NR_idle: |
1489 | goto unimplemented; | 1565 | goto unimplemented; |
1490 | - case TARGET_NR_vm86old: | ||
1491 | - goto unimplemented; | ||
1492 | case TARGET_NR_wait4: | 1566 | case TARGET_NR_wait4: |
1493 | { | 1567 | { |
1494 | int status; | 1568 | int status; |
@@ -1548,7 +1622,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1548,7 +1622,12 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1548 | break; | 1622 | break; |
1549 | #ifdef TARGET_I386 | 1623 | #ifdef TARGET_I386 |
1550 | case TARGET_NR_modify_ldt: | 1624 | case TARGET_NR_modify_ldt: |
1551 | - ret = get_errno(gemu_modify_ldt(cpu_env, arg1, (void *)arg2, arg3)); | 1625 | + ret = get_errno(do_modify_ldt(cpu_env, arg1, (void *)arg2, arg3)); |
1626 | + break; | ||
1627 | + case TARGET_NR_vm86old: | ||
1628 | + goto unimplemented; | ||
1629 | + case TARGET_NR_vm86: | ||
1630 | + ret = do_vm86(cpu_env, arg1, (void *)arg2); | ||
1552 | break; | 1631 | break; |
1553 | #endif | 1632 | #endif |
1554 | case TARGET_NR_adjtimex: | 1633 | case TARGET_NR_adjtimex: |
@@ -1652,13 +1731,13 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1652,13 +1731,13 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1652 | 1731 | ||
1653 | pfd = alloca(sizeof(struct pollfd) * nfds); | 1732 | pfd = alloca(sizeof(struct pollfd) * nfds); |
1654 | for(i = 0; i < nfds; i++) { | 1733 | for(i = 0; i < nfds; i++) { |
1655 | - pfd->fd = tswap32(target_pfd->fd); | ||
1656 | - pfd->events = tswap16(target_pfd->events); | 1734 | + pfd[i].fd = tswap32(target_pfd[i].fd); |
1735 | + pfd[i].events = tswap16(target_pfd[i].events); | ||
1657 | } | 1736 | } |
1658 | ret = get_errno(poll(pfd, nfds, timeout)); | 1737 | ret = get_errno(poll(pfd, nfds, timeout)); |
1659 | if (!is_error(ret)) { | 1738 | if (!is_error(ret)) { |
1660 | for(i = 0; i < nfds; i++) { | 1739 | for(i = 0; i < nfds; i++) { |
1661 | - target_pfd->revents = tswap16(pfd->revents); | 1740 | + target_pfd[i].revents = tswap16(pfd[i].revents); |
1662 | } | 1741 | } |
1663 | } | 1742 | } |
1664 | } | 1743 | } |
@@ -1702,25 +1781,59 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1702,25 +1781,59 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1702 | ret = get_errno(getsid(arg1)); | 1781 | ret = get_errno(getsid(arg1)); |
1703 | break; | 1782 | break; |
1704 | case TARGET_NR_fdatasync: | 1783 | case TARGET_NR_fdatasync: |
1705 | - goto unimplemented; | 1784 | + ret = get_errno(fdatasync(arg1)); |
1785 | + break; | ||
1706 | case TARGET_NR__sysctl: | 1786 | case TARGET_NR__sysctl: |
1707 | goto unimplemented; | 1787 | goto unimplemented; |
1708 | case TARGET_NR_sched_setparam: | 1788 | case TARGET_NR_sched_setparam: |
1709 | - goto unimplemented; | 1789 | + { |
1790 | + struct sched_param *target_schp = (void *)arg2; | ||
1791 | + struct sched_param schp; | ||
1792 | + schp.sched_priority = tswap32(target_schp->sched_priority); | ||
1793 | + ret = get_errno(sched_setparam(arg1, &schp)); | ||
1794 | + } | ||
1795 | + break; | ||
1710 | case TARGET_NR_sched_getparam: | 1796 | case TARGET_NR_sched_getparam: |
1711 | - goto unimplemented; | 1797 | + { |
1798 | + struct sched_param *target_schp = (void *)arg2; | ||
1799 | + struct sched_param schp; | ||
1800 | + ret = get_errno(sched_getparam(arg1, &schp)); | ||
1801 | + if (!is_error(ret)) { | ||
1802 | + target_schp->sched_priority = tswap32(schp.sched_priority); | ||
1803 | + } | ||
1804 | + } | ||
1805 | + break; | ||
1712 | case TARGET_NR_sched_setscheduler: | 1806 | case TARGET_NR_sched_setscheduler: |
1713 | - goto unimplemented; | 1807 | + { |
1808 | + struct sched_param *target_schp = (void *)arg3; | ||
1809 | + struct sched_param schp; | ||
1810 | + schp.sched_priority = tswap32(target_schp->sched_priority); | ||
1811 | + ret = get_errno(sched_setscheduler(arg1, arg2, &schp)); | ||
1812 | + } | ||
1813 | + break; | ||
1714 | case TARGET_NR_sched_getscheduler: | 1814 | case TARGET_NR_sched_getscheduler: |
1715 | - goto unimplemented; | 1815 | + ret = get_errno(sched_getscheduler(arg1)); |
1816 | + break; | ||
1716 | case TARGET_NR_sched_yield: | 1817 | case TARGET_NR_sched_yield: |
1717 | ret = get_errno(sched_yield()); | 1818 | ret = get_errno(sched_yield()); |
1718 | break; | 1819 | break; |
1719 | case TARGET_NR_sched_get_priority_max: | 1820 | case TARGET_NR_sched_get_priority_max: |
1821 | + ret = get_errno(sched_get_priority_max(arg1)); | ||
1822 | + break; | ||
1720 | case TARGET_NR_sched_get_priority_min: | 1823 | case TARGET_NR_sched_get_priority_min: |
1824 | + ret = get_errno(sched_get_priority_min(arg1)); | ||
1825 | + break; | ||
1721 | case TARGET_NR_sched_rr_get_interval: | 1826 | case TARGET_NR_sched_rr_get_interval: |
1722 | - goto unimplemented; | ||
1723 | - | 1827 | + { |
1828 | + struct target_timespec *target_ts = (void *)arg2; | ||
1829 | + struct timespec ts; | ||
1830 | + ret = get_errno(sched_rr_get_interval(arg1, &ts)); | ||
1831 | + if (!is_error(ret)) { | ||
1832 | + target_ts->tv_sec = tswapl(ts.tv_sec); | ||
1833 | + target_ts->tv_nsec = tswapl(ts.tv_nsec); | ||
1834 | + } | ||
1835 | + } | ||
1836 | + break; | ||
1724 | case TARGET_NR_nanosleep: | 1837 | case TARGET_NR_nanosleep: |
1725 | { | 1838 | { |
1726 | struct target_timespec *target_req = (void *)arg1; | 1839 | struct target_timespec *target_req = (void *)arg1; |
@@ -1767,11 +1880,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1767,11 +1880,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1767 | } | 1880 | } |
1768 | } | 1881 | } |
1769 | break; | 1882 | break; |
1770 | - case TARGET_NR_vm86: | ||
1771 | case TARGET_NR_query_module: | 1883 | case TARGET_NR_query_module: |
1884 | + goto unimplemented; | ||
1772 | case TARGET_NR_nfsservctl: | 1885 | case TARGET_NR_nfsservctl: |
1886 | + goto unimplemented; | ||
1773 | case TARGET_NR_prctl: | 1887 | case TARGET_NR_prctl: |
1888 | + goto unimplemented; | ||
1774 | case TARGET_NR_pread: | 1889 | case TARGET_NR_pread: |
1890 | + goto unimplemented; | ||
1775 | case TARGET_NR_pwrite: | 1891 | case TARGET_NR_pwrite: |
1776 | goto unimplemented; | 1892 | goto unimplemented; |
1777 | case TARGET_NR_chown: | 1893 | case TARGET_NR_chown: |
@@ -1781,16 +1897,24 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1781,16 +1897,24 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1781 | ret = get_errno(sys_getcwd1((char *)arg1, arg2)); | 1897 | ret = get_errno(sys_getcwd1((char *)arg1, arg2)); |
1782 | break; | 1898 | break; |
1783 | case TARGET_NR_capget: | 1899 | case TARGET_NR_capget: |
1900 | + goto unimplemented; | ||
1784 | case TARGET_NR_capset: | 1901 | case TARGET_NR_capset: |
1902 | + goto unimplemented; | ||
1785 | case TARGET_NR_sigaltstack: | 1903 | case TARGET_NR_sigaltstack: |
1904 | + goto unimplemented; | ||
1786 | case TARGET_NR_sendfile: | 1905 | case TARGET_NR_sendfile: |
1906 | + goto unimplemented; | ||
1787 | case TARGET_NR_getpmsg: | 1907 | case TARGET_NR_getpmsg: |
1908 | + goto unimplemented; | ||
1788 | case TARGET_NR_putpmsg: | 1909 | case TARGET_NR_putpmsg: |
1910 | + goto unimplemented; | ||
1789 | case TARGET_NR_vfork: | 1911 | case TARGET_NR_vfork: |
1790 | ret = get_errno(do_fork(cpu_env, CLONE_VFORK | CLONE_VM | SIGCHLD, 0)); | 1912 | ret = get_errno(do_fork(cpu_env, CLONE_VFORK | CLONE_VM | SIGCHLD, 0)); |
1791 | break; | 1913 | break; |
1792 | case TARGET_NR_ugetrlimit: | 1914 | case TARGET_NR_ugetrlimit: |
1915 | + goto unimplemented; | ||
1793 | case TARGET_NR_truncate64: | 1916 | case TARGET_NR_truncate64: |
1917 | + goto unimplemented; | ||
1794 | case TARGET_NR_ftruncate64: | 1918 | case TARGET_NR_ftruncate64: |
1795 | goto unimplemented; | 1919 | goto unimplemented; |
1796 | case TARGET_NR_stat64: | 1920 | case TARGET_NR_stat64: |
@@ -1919,6 +2043,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1919,6 +2043,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1919 | ret = get_errno(gettid()); | 2043 | ret = get_errno(gettid()); |
1920 | break; | 2044 | break; |
1921 | case TARGET_NR_readahead: | 2045 | case TARGET_NR_readahead: |
2046 | + goto unimplemented; | ||
1922 | case TARGET_NR_setxattr: | 2047 | case TARGET_NR_setxattr: |
1923 | case TARGET_NR_lsetxattr: | 2048 | case TARGET_NR_lsetxattr: |
1924 | case TARGET_NR_fsetxattr: | 2049 | case TARGET_NR_fsetxattr: |
@@ -1931,10 +2056,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | @@ -1931,10 +2056,14 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, | ||
1931 | case TARGET_NR_removexattr: | 2056 | case TARGET_NR_removexattr: |
1932 | case TARGET_NR_lremovexattr: | 2057 | case TARGET_NR_lremovexattr: |
1933 | case TARGET_NR_fremovexattr: | 2058 | case TARGET_NR_fremovexattr: |
1934 | - goto unimplemented; | 2059 | + goto unimplemented_nowarn; |
2060 | + case TARGET_NR_set_thread_area: | ||
2061 | + case TARGET_NR_get_thread_area: | ||
2062 | + goto unimplemented_nowarn; | ||
1935 | default: | 2063 | default: |
1936 | unimplemented: | 2064 | unimplemented: |
1937 | - gemu_log("gemu: Unsupported syscall: %d\n", num); | 2065 | + gemu_log("qemu: Unsupported syscall: %d\n", num); |
2066 | + unimplemented_nowarn: | ||
1938 | ret = -ENOSYS; | 2067 | ret = -ENOSYS; |
1939 | break; | 2068 | break; |
1940 | } | 2069 | } |