patch-2.3.45 linux/arch/ia64/ia32/sys_ia32.c
Next file: linux/arch/ia64/kernel/efi.c
Previous file: linux/arch/ia64/ia32/ia32_signal.c
Back to the patch index
Back to the overall index
- Lines: 124
- Date:
Sun Feb 13 10:30:38 2000
- Orig file:
v2.3.44/linux/arch/ia64/ia32/sys_ia32.c
- Orig date:
Thu Feb 10 17:11:03 2000
diff -u --recursive --new-file v2.3.44/linux/arch/ia64/ia32/sys_ia32.c linux/arch/ia64/ia32/sys_ia32.c
@@ -240,18 +240,29 @@
return -EINVAL;
if (prot & PROT_WRITE)
prot |= PROT_EXEC;
+#ifdef DDD
+#else // DDD
+ prot |= PROT_WRITE;
+#endif // DDD
front = NULL;
back = NULL;
if ((baddr = (addr & PAGE_MASK)) != addr && get_user(c, (char *)baddr) == 0) {
front = kmalloc(addr - baddr, GFP_KERNEL);
memcpy(front, (void *)baddr, addr - baddr);
}
- if ((addr + len) & ~PAGE_MASK && get_user(c, (char *)(addr + len)) == 0) {
+#ifndef DDD
+ if (addr)
+#endif
+ if (((addr + len) & ~PAGE_MASK) && get_user(c, (char *)(addr + len)) == 0) {
back = kmalloc(PAGE_SIZE - ((addr + len) & ~PAGE_MASK), GFP_KERNEL);
memcpy(back, addr + len, PAGE_SIZE - ((addr + len) & ~PAGE_MASK));
}
if ((r = do_mmap(0, baddr, len + (addr - baddr), prot, flags | MAP_ANONYMOUS, 0)) < 0)
return(r);
+#ifndef DDD
+ if (addr == 0)
+ addr = r;
+#endif // DDD
if (back) {
memcpy(addr + len, back, PAGE_SIZE - ((addr + len) & ~PAGE_MASK));
kfree(back);
@@ -315,7 +326,11 @@
}
a.flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
+#ifdef DDD
if ((a.flags & MAP_FIXED) && ((a.addr & ~PAGE_MASK) || (a.offset & ~PAGE_MASK))) {
+#else // DDD
+ if (1) {
+#endif // DDD
unlock_kernel();
up(¤t->mm->mmap_sem);
error = do_mmap_fake(file, a.addr, a.len, a.prot, a.flags, a.offset);
@@ -665,7 +680,7 @@
};
static void
-xlate_dirent(void *dirent, long n)
+xlate_dirent(void *dirent64, void *dirent32, long n)
{
long off;
struct dirent *dirp;
@@ -673,9 +688,9 @@
off = 0;
while (off < n) {
- dirp = (struct dirent *)(dirent + off);
+ dirp = (struct dirent *)(dirent64 + off);
+ dirp32 = (struct dirent32 *)(dirent32 + off);
off += dirp->d_reclen;
- dirp32 = (struct dirent32 *)dirp;
dirp32->d_ino = dirp->d_ino;
dirp32->d_off = (unsigned int)dirp->d_off;
dirp32->d_reclen = dirp->d_reclen;
@@ -685,26 +700,27 @@
}
asmlinkage long
-sys32_getdents(unsigned int fd, void * dirent, unsigned int count)
+sys32_getdents(unsigned int fd, void * dirent32, unsigned int count)
{
long n;
+ void *dirent64;
- if ((n = sys_getdents(fd, dirent, count)) < 0)
+ dirent64 = (unsigned long)(dirent32 + (sizeof(long) - 1)) & ~(sizeof(long) - 1);
+ if ((n = sys_getdents(fd, dirent64, count - (dirent64 - dirent32))) < 0)
return(n);
- xlate_dirent(dirent, n);
+ xlate_dirent(dirent64, dirent32, n);
return(n);
}
asmlinkage int
-sys32_readdir(unsigned int fd, void * dirent, unsigned int count)
+sys32_readdir(unsigned int fd, void * dirent32, unsigned int count)
{
int n;
- struct dirent *dirp;
+ struct dirent dirent64;
- if ((n = old_readdir(fd, dirent, count)) < 0)
+ if ((n = old_readdir(fd, &dirent64, count)) < 0)
return(n);
- dirp = (struct dirent *)dirent;
- xlate_dirent(dirent, dirp->d_reclen);
+ xlate_dirent(&dirent64, dirent32, dirent64.d_reclen);
return(n);
}
@@ -807,6 +823,23 @@
kfree(bits);
out_nofds:
return ret;
+}
+
+struct sel_arg_struct {
+ unsigned int n;
+ unsigned int inp;
+ unsigned int outp;
+ unsigned int exp;
+ unsigned int tvp;
+};
+
+asmlinkage int old_select(struct sel_arg_struct *arg)
+{
+ struct sel_arg_struct a;
+
+ if (copy_from_user(&a, arg, sizeof(a)))
+ return -EFAULT;
+ return sys32_select(a.n, a.inp, a.outp, a.exp, a.tvp);
}
struct rusage32 {
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)