| /* |
| * Copyright (C) 2012 Regents of the University of California |
| * Copyright (C) 2014 Darius Rad <darius@bluespec.com> |
| * Copyright (C) 2017 SiFive |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation, version 2. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #include <linux/syscalls.h> |
| #include <asm/cmpxchg.h> |
| #include <asm/unistd.h> |
| |
| static long riscv_sys_mmap(unsigned long addr, unsigned long len, |
| unsigned long prot, unsigned long flags, |
| unsigned long fd, off_t offset, |
| unsigned long page_shift_offset) |
| { |
| if (unlikely(offset & (~PAGE_MASK >> page_shift_offset))) |
| return -EINVAL; |
| return sys_mmap_pgoff(addr, len, prot, flags, fd, |
| offset >> (PAGE_SHIFT - page_shift_offset)); |
| } |
| |
| #ifdef CONFIG_64BIT |
| SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, |
| unsigned long, prot, unsigned long, flags, |
| unsigned long, fd, off_t, offset) |
| { |
| return riscv_sys_mmap(addr, len, prot, flags, fd, offset, 0); |
| } |
| #else |
| SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, |
| unsigned long, prot, unsigned long, flags, |
| unsigned long, fd, off_t, offset) |
| { |
| /* |
| * Note that the shift for mmap2 is constant (12), |
| * regardless of PAGE_SIZE |
| */ |
| return riscv_sys_mmap(addr, len, prot, flags, fd, offset, 12); |
| } |
| #endif /* !CONFIG_64BIT */ |