/* Linux version of mmap */ asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd, unsigned long off) { struct file * file = NULL; long retval; if (!(flags & MAP_ANONYMOUS)) { if (fd >= NR_OPEN || !(file = current->files->fd[fd])){ return -EBADF; } } if(!(flags & MAP_FIXED) && !addr) { addr = get_sparc_unmapped_area(len); if(!addr){ return -ENOMEM; } } retval = do_mmap(file, addr, len, prot, flags, off); return retval; }
/* We use the SunOS mmap() semantics. */ asmlinkage unsigned long sunos_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd, unsigned long off) { struct file * file = NULL; unsigned long retval, ret_type; if(flags & MAP_NORESERVE) { printk("%s: unimplemented SunOS MAP_NORESERVE mmap() flag\n", current->comm); flags &= ~MAP_NORESERVE; } if(!(flags & MAP_ANONYMOUS)) if (fd >= NR_OPEN || !(file = current->files->fd[fd])) return -EBADF; if(!(flags & MAP_FIXED) && !addr) { addr = get_sparc_unmapped_area(len); if(!addr) return -ENOMEM; } /* If this is ld.so or a shared library doing an mmap * of /dev/zero, transform it into an anonymous mapping. * SunOS is so stupid some times... hmph! */ if(MAJOR(file->f_inode->i_rdev) == MEM_MAJOR && MINOR(file->f_inode->i_rdev) == 5) { flags |= MAP_ANONYMOUS; file = 0; } ret_type = flags & _MAP_NEW; flags &= ~_MAP_NEW; retval = do_mmap(file, addr, len, prot, flags, off); if(ret_type) return retval; else return ((retval < KERNBASE) ? 0 : retval); }