2 * linux/arch/x86_64/kernel/sys_x86_64.c
5 #include <linux/errno.h>
6 #include <linux/sched.h>
7 #include <linux/syscalls.h>
10 #include <linux/smp_lock.h>
11 #include <linux/sem.h>
12 #include <linux/msg.h>
13 #include <linux/shm.h>
14 #include <linux/stat.h>
15 #include <linux/mman.h>
16 #include <linux/file.h>
17 #include <linux/utsname.h>
18 #include <linux/personality.h>
20 #include <asm/uaccess.h>
25 * sys_pipe() is the normal C calling standard for creating
26 * a pipe. It's not the way Unix traditionally does this, though.
28 asmlinkage long sys_pipe(int *fildes)
35 if (copy_to_user(fildes, fd, 2*sizeof(int)))
41 long sys_mmap(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags,
42 unsigned long fd, unsigned long off)
53 flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
54 if (!(flags & MAP_ANONYMOUS)) {
59 down_write(¤t->mm->mmap_sem);
60 error = do_mmap_pgoff(file, addr, len, prot, flags, off >> PAGE_SHIFT);
61 up_write(¤t->mm->mmap_sem);
69 static void find_start_end(unsigned long flags, unsigned long *begin,
72 #ifdef CONFIG_IA32_EMULATION
73 if (test_thread_flag(TIF_IA32)) {
74 *begin = TASK_UNMAPPED_32;
75 *end = IA32_PAGE_OFFSET;
78 if (flags & MAP_32BIT) {
79 /* This is usually used needed to map code in small
80 model, so it needs to be in the first 31bit. Limit
81 it to that. This means we need to move the
82 unmapped base down for this case. This can give
83 conflicts with the heap, but we assume that glibc
84 malloc knows how to fall back to mmap. Give it 1GB
85 of playground for now. -AK */
89 *begin = TASK_UNMAPPED_64;
95 arch_get_unmapped_area(struct file *filp, unsigned long addr,
96 unsigned long len, unsigned long pgoff, unsigned long flags)
98 struct mm_struct *mm = current->mm;
99 struct vm_area_struct *vma;
100 unsigned long start_addr;
101 unsigned long begin, end;
103 find_start_end(flags, &begin, &end);
109 addr = PAGE_ALIGN(addr);
110 vma = find_vma(mm, addr);
111 if (end - len >= addr &&
112 (!vma || addr + len <= vma->vm_start))
115 addr = mm->free_area_cache;
121 for (vma = find_vma(mm, addr); ; vma = vma->vm_next) {
122 /* At this point: (!vma || addr < vma->vm_end). */
123 if (end - len < addr) {
125 * Start a new search - just in case we missed
128 if (start_addr != begin) {
129 start_addr = addr = begin;
134 if (!vma || addr + len <= vma->vm_start) {
136 * Remember the place where we stopped the search:
138 mm->free_area_cache = addr + len;
145 asmlinkage long sys_uname(struct new_utsname * name)
149 err = copy_to_user(name, &system_utsname, sizeof (*name));
151 if (personality(current->personality) == PER_LINUX32)
152 err |= copy_to_user(&name->machine, "i686", 5);
153 return err ? -EFAULT : 0;
156 asmlinkage long wrap_sys_shmat(int shmid, char *shmaddr, int shmflg)
159 return do_shmat(shmid,shmaddr,shmflg,&raddr) ?: (long)raddr;
162 asmlinkage long sys_time64(long * tloc)
167 do_gettimeofday(&now);
170 if (put_user(i,tloc))