patch-2.4.19 linux-2.4.19/arch/mips64/kernel/syscall.c
Next file: linux-2.4.19/arch/mips64/kernel/time.c
Previous file: linux-2.4.19/arch/mips64/kernel/smp.c
Back to the patch index
Back to the overall index
- Lines: 110
- Date:
Fri Aug 2 17:39:43 2002
- Orig file:
linux-2.4.18/arch/mips64/kernel/syscall.c
- Orig date:
Sun Sep 9 10:43:01 2001
diff -urN linux-2.4.18/arch/mips64/kernel/syscall.c linux-2.4.19/arch/mips64/kernel/syscall.c
@@ -50,12 +50,69 @@
return res;
}
+#define COLOUR_ALIGN(addr,pgoff) \
+ ((((addr)+SHMLBA-1)&~(SHMLBA-1)) + \
+ (((pgoff)<<PAGE_SHIFT) & (SHMLBA-1)))
+
+unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
+ unsigned long len, unsigned long pgoff, unsigned long flags)
+{
+ struct vm_area_struct * vmm;
+ int do_color_align;
+
+ if (flags & MAP_FIXED) {
+ /*
+ * We do not accept a shared mapping if it would violate
+ * cache aliasing constraints.
+ */
+ if ((flags & MAP_SHARED) && (addr & (SHMLBA - 1)))
+ return -EINVAL;
+ return addr;
+ }
+
+ if (len > TASK_SIZE)
+ return -ENOMEM;
+ do_color_align = 0;
+ if (filp || (flags & MAP_SHARED))
+ do_color_align = 1;
+ if (addr) {
+ if (do_color_align)
+ addr = COLOUR_ALIGN(addr, pgoff);
+ else
+ addr = PAGE_ALIGN(addr);
+ vmm = find_vma(current->mm, addr);
+ if (TASK_SIZE - len >= addr &&
+ (!vmm || addr + len <= vmm->vm_start))
+ return addr;
+ }
+ addr = TASK_UNMAPPED_BASE;
+ if (do_color_align)
+ addr = COLOUR_ALIGN(addr, pgoff);
+ else
+ addr = PAGE_ALIGN(addr);
+
+ for (vmm = find_vma(current->mm, addr); ; vmm = vmm->vm_next) {
+ /* At this point: (!vmm || addr < vmm->vm_end). */
+ if (TASK_SIZE - len < addr)
+ return -ENOMEM;
+ if (!vmm || addr + len <= vmm->vm_start)
+ return addr;
+ addr = vmm->vm_end;
+ if (do_color_align)
+ addr = COLOUR_ALIGN(addr, pgoff);
+ }
+}
+
asmlinkage unsigned long
sys_mmap(unsigned long addr, size_t len, unsigned long prot,
unsigned long flags, unsigned long fd, off_t offset)
{
struct file * file = NULL;
- unsigned long error = -EFAULT;
+ unsigned long error;
+
+ error = -EINVAL;
+ if (offset & ~PAGE_MASK)
+ goto out;
if (!(flags & MAP_ANONYMOUS)) {
error = -EBADF;
@@ -70,8 +127,8 @@
up_write(¤t->mm->mmap_sem);
if (file)
fput(file);
-out:
+out:
return error;
}
@@ -130,7 +187,7 @@
}
asmlinkage int
-_sys_sysmips(int cmd, long arg1, int arg2, int arg3)
+sys_sysmips(int cmd, long arg1, int arg2, int arg3)
{
int *p;
char *name;
@@ -151,8 +208,8 @@
down_write(&uts_sem);
strncpy(system_utsname.nodename, name, len);
- up_write(&uts_sem);
system_utsname.nodename[len] = '\0';
+ up_write(&uts_sem);
return 0;
}
@@ -259,8 +316,7 @@
/*
* No implemented yet ...
*/
-asmlinkage int
-sys_cachectl(char *addr, int nbytes, int op)
+asmlinkage int sys_cachectl(char *addr, int nbytes, int op)
{
return -ENOSYS;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)