2 * linux/arch/x86_64/kernel/sys_x86_64.c
5 #include <linux/errno.h>
6 #include <linux/sched.h>
9 #include <linux/smp_lock.h>
10 #include <linux/sem.h>
11 #include <linux/msg.h>
12 #include <linux/shm.h>
13 #include <linux/stat.h>
14 #include <linux/mman.h>
15 #include <linux/file.h>
16 #include <linux/utsname.h>
17 #include <linux/personality.h>
19 #include <asm/uaccess.h>
24 * sys_pipe() is the normal C calling standard for creating
25 * a pipe. It's not the way Unix traditionally does this, though.
27 asmlinkage long sys_pipe(int *fildes)
34 if (copy_to_user(fildes, fd, 2*sizeof(int)))
40 long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags,
41 unsigned long fd, unsigned long off)
52 flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
53 if (!(flags & MAP_ANONYMOUS)) {
58 down_write(¤t->mm->mmap_sem);
59 error = do_mmap_pgoff(current->mm, file, addr, len, prot, flags, off >> PAGE_SHIFT);
60 up_write(¤t->mm->mmap_sem);
68 unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsigned long len, unsigned long pgoff, unsigned long flags)
70 struct vm_area_struct *vma;
71 unsigned long end = TASK_SIZE;
73 #ifdef CONFIG_IA32_EMULATION
74 if (test_thread_flag(TIF_IA32)) {
76 addr = TASK_UNMAPPED_32;
77 end = IA32_PAGE_OFFSET;
80 if (flags & MAP_32BIT) {
81 /* This is usually used needed to map code in small model, so it needs to
82 be in the first 31bit. Limit it to that.
83 This means we need to move the unmapped base down for this case. This can
84 give conflicts with the heap, but we assume that glibc malloc knows how
85 to fall back to mmap. Give it 1GB of playground for now. -AK */
91 addr = TASK_UNMAPPED_64;
97 addr = PAGE_ALIGN(addr);
99 for (vma = find_vma(current->mm, addr); ; vma = vma->vm_next) {
100 /* At this point: (!vma || addr < vma->vm_end). */
101 if (end - len < addr)
103 if (!vma || addr + len <= vma->vm_start)
109 asmlinkage long sys_uname(struct new_utsname * name)
113 err = copy_to_user(name, &system_utsname, sizeof (*name));
115 if (current->personality == PER_LINUX32)
116 err |= copy_to_user(&name->machine, "i386", 5);
117 return err ? -EFAULT : 0;
120 asmlinkage long wrap_sys_shmat(int shmid, char *shmaddr, int shmflg)
123 return sys_shmat(shmid,shmaddr,shmflg,&raddr) ?: (long)raddr;
126 asmlinkage long sys_time64(long * tloc)
131 do_gettimeofday(&now);
134 if (put_user(i,tloc))