Commit b03c60f35194db4ba1f53673ab02ade29f54701e
1 parent
9de5e440
more syscalls
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@43 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
96 additions
and
6 deletions
TODO
1 | 1 | - optimize translated cache chaining (DLL PLT-like system) |
2 | -- more syscalls (in particular all 64 bit ones, IPCs, fix 64 bit issues) | |
2 | +- more syscalls (in particular all 64 bit ones, IPCs, fix 64 bit | |
3 | + issues, fix 16 bit uid issues) | |
3 | 4 | - finish signal handing (fp87 state, more siginfo conversions) |
4 | 5 | - verify thread support (clone() and various locks) |
5 | 6 | - vm86 syscall support | ... | ... |
linux-user/syscall.c
... | ... | @@ -103,6 +103,10 @@ extern int personality(int); |
103 | 103 | extern int flock(int, int); |
104 | 104 | extern int setfsuid(int); |
105 | 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 | 110 | |
107 | 111 | static inline long get_errno(long ret) |
108 | 112 | { |
... | ... | @@ -809,6 +813,10 @@ int do_fork(CPUX86State *env, unsigned int flags, unsigned long newsp) |
809 | 813 | |
810 | 814 | #endif |
811 | 815 | |
816 | +#define high2lowuid(x) (x) | |
817 | +#define high2lowgid(x) (x) | |
818 | +#define low2highuid(x) (x) | |
819 | +#define low2highgid(x) (x) | |
812 | 820 | |
813 | 821 | void syscall_init(void) |
814 | 822 | { |
... | ... | @@ -913,7 +921,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
913 | 921 | ret = get_errno(umount((const char *)arg1)); |
914 | 922 | break; |
915 | 923 | case TARGET_NR_setuid: |
916 | - ret = get_errno(setuid(arg1)); | |
924 | + ret = get_errno(setuid(low2highuid(arg1))); | |
917 | 925 | break; |
918 | 926 | case TARGET_NR_getuid: |
919 | 927 | ret = get_errno(getuid()); |
... | ... | @@ -984,7 +992,7 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
984 | 992 | case TARGET_NR_prof: |
985 | 993 | goto unimplemented; |
986 | 994 | case TARGET_NR_setgid: |
987 | - ret = get_errno(setgid(arg1)); | |
995 | + ret = get_errno(setgid(low2highgid(arg1))); | |
988 | 996 | break; |
989 | 997 | case TARGET_NR_getgid: |
990 | 998 | ret = get_errno(getgid()); |
... | ... | @@ -1727,14 +1735,41 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
1727 | 1735 | } |
1728 | 1736 | } |
1729 | 1737 | break; |
1730 | - | |
1731 | 1738 | case TARGET_NR_setresuid: |
1739 | + ret = get_errno(setresuid(low2highuid(arg1), | |
1740 | + low2highuid(arg2), | |
1741 | + low2highuid(arg3))); | |
1742 | + break; | |
1732 | 1743 | case TARGET_NR_getresuid: |
1744 | + { | |
1745 | + int ruid, euid, suid; | |
1746 | + ret = get_errno(getresuid(&ruid, &euid, &suid)); | |
1747 | + if (!is_error(ret)) { | |
1748 | + *(uint16_t *)arg1 = tswap16(high2lowuid(ruid)); | |
1749 | + *(uint16_t *)arg2 = tswap16(high2lowuid(euid)); | |
1750 | + *(uint16_t *)arg3 = tswap16(high2lowuid(suid)); | |
1751 | + } | |
1752 | + } | |
1753 | + break; | |
1754 | + case TARGET_NR_setresgid: | |
1755 | + ret = get_errno(setresgid(low2highgid(arg1), | |
1756 | + low2highgid(arg2), | |
1757 | + low2highgid(arg3))); | |
1758 | + break; | |
1759 | + case TARGET_NR_getresgid: | |
1760 | + { | |
1761 | + int rgid, egid, sgid; | |
1762 | + ret = get_errno(getresgid(&rgid, &egid, &sgid)); | |
1763 | + if (!is_error(ret)) { | |
1764 | + *(uint16_t *)arg1 = high2lowgid(tswap16(rgid)); | |
1765 | + *(uint16_t *)arg2 = high2lowgid(tswap16(egid)); | |
1766 | + *(uint16_t *)arg3 = high2lowgid(tswap16(sgid)); | |
1767 | + } | |
1768 | + } | |
1769 | + break; | |
1733 | 1770 | case TARGET_NR_vm86: |
1734 | 1771 | case TARGET_NR_query_module: |
1735 | 1772 | case TARGET_NR_nfsservctl: |
1736 | - case TARGET_NR_setresgid: | |
1737 | - case TARGET_NR_getresgid: | |
1738 | 1773 | case TARGET_NR_prctl: |
1739 | 1774 | case TARGET_NR_pread: |
1740 | 1775 | case TARGET_NR_pwrite: |
... | ... | @@ -1789,26 +1824,80 @@ long do_syscall(void *cpu_env, int num, long arg1, long arg2, long arg3, |
1789 | 1824 | break; |
1790 | 1825 | |
1791 | 1826 | case TARGET_NR_lchown32: |
1827 | + ret = get_errno(lchown((const char *)arg1, arg2, arg3)); | |
1828 | + break; | |
1792 | 1829 | case TARGET_NR_getuid32: |
1830 | + ret = get_errno(getuid()); | |
1831 | + break; | |
1793 | 1832 | case TARGET_NR_getgid32: |
1833 | + ret = get_errno(getgid()); | |
1834 | + break; | |
1794 | 1835 | case TARGET_NR_geteuid32: |
1836 | + ret = get_errno(geteuid()); | |
1837 | + break; | |
1795 | 1838 | case TARGET_NR_getegid32: |
1839 | + ret = get_errno(getegid()); | |
1840 | + break; | |
1796 | 1841 | case TARGET_NR_setreuid32: |
1842 | + ret = get_errno(setreuid(arg1, arg2)); | |
1843 | + break; | |
1797 | 1844 | case TARGET_NR_setregid32: |
1845 | + ret = get_errno(setregid(arg1, arg2)); | |
1846 | + break; | |
1798 | 1847 | case TARGET_NR_getgroups32: |
1848 | + goto unimplemented; | |
1799 | 1849 | case TARGET_NR_setgroups32: |
1850 | + goto unimplemented; | |
1800 | 1851 | case TARGET_NR_fchown32: |
1852 | + ret = get_errno(fchown(arg1, arg2, arg3)); | |
1853 | + break; | |
1801 | 1854 | case TARGET_NR_setresuid32: |
1855 | + ret = get_errno(setresuid(arg1, arg2, arg3)); | |
1856 | + break; | |
1802 | 1857 | case TARGET_NR_getresuid32: |
1858 | + { | |
1859 | + int ruid, euid, suid; | |
1860 | + ret = get_errno(getresuid(&ruid, &euid, &suid)); | |
1861 | + if (!is_error(ret)) { | |
1862 | + *(uint32_t *)arg1 = tswap32(ruid); | |
1863 | + *(uint32_t *)arg2 = tswap32(euid); | |
1864 | + *(uint32_t *)arg3 = tswap32(suid); | |
1865 | + } | |
1866 | + } | |
1867 | + break; | |
1803 | 1868 | case TARGET_NR_setresgid32: |
1869 | + ret = get_errno(setresgid(arg1, arg2, arg3)); | |
1870 | + break; | |
1804 | 1871 | case TARGET_NR_getresgid32: |
1872 | + { | |
1873 | + int rgid, egid, sgid; | |
1874 | + ret = get_errno(getresgid(&rgid, &egid, &sgid)); | |
1875 | + if (!is_error(ret)) { | |
1876 | + *(uint32_t *)arg1 = tswap32(rgid); | |
1877 | + *(uint32_t *)arg2 = tswap32(egid); | |
1878 | + *(uint32_t *)arg3 = tswap32(sgid); | |
1879 | + } | |
1880 | + } | |
1881 | + break; | |
1805 | 1882 | case TARGET_NR_chown32: |
1883 | + ret = get_errno(chown((const char *)arg1, arg2, arg3)); | |
1884 | + break; | |
1806 | 1885 | case TARGET_NR_setuid32: |
1886 | + ret = get_errno(setuid(arg1)); | |
1887 | + break; | |
1807 | 1888 | case TARGET_NR_setgid32: |
1889 | + ret = get_errno(setgid(arg1)); | |
1890 | + break; | |
1808 | 1891 | case TARGET_NR_setfsuid32: |
1892 | + ret = get_errno(setfsuid(arg1)); | |
1893 | + break; | |
1809 | 1894 | case TARGET_NR_setfsgid32: |
1895 | + ret = get_errno(setfsgid(arg1)); | |
1896 | + break; | |
1810 | 1897 | case TARGET_NR_pivot_root: |
1898 | + goto unimplemented; | |
1811 | 1899 | case TARGET_NR_mincore: |
1900 | + goto unimplemented; | |
1812 | 1901 | case TARGET_NR_madvise: |
1813 | 1902 | goto unimplemented; |
1814 | 1903 | #if TARGET_LONG_BITS == 32 | ... | ... |