Commit b03c60f35194db4ba1f53673ab02ade29f54701e

Authored by bellard
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
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
... ...