cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

syscalls.c (3279B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/*
      3 *  Implementation of various system calls for Linux/PowerPC
      4 *
      5 *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
      6 *
      7 * Derived from "arch/i386/kernel/sys_i386.c"
      8 * Adapted from the i386 version by Gary Thomas
      9 * Modified by Cort Dougan (cort@cs.nmt.edu)
     10 * and Paul Mackerras (paulus@cs.anu.edu.au).
     11 *
     12 * This file contains various random system calls that
     13 * have a non-standard calling sequence on the Linux/PPC
     14 * platform.
     15 */
     16
     17#include <linux/errno.h>
     18#include <linux/sched.h>
     19#include <linux/syscalls.h>
     20#include <linux/mm.h>
     21#include <linux/fs.h>
     22#include <linux/smp.h>
     23#include <linux/sem.h>
     24#include <linux/msg.h>
     25#include <linux/shm.h>
     26#include <linux/stat.h>
     27#include <linux/mman.h>
     28#include <linux/sys.h>
     29#include <linux/ipc.h>
     30#include <linux/utsname.h>
     31#include <linux/file.h>
     32#include <linux/personality.h>
     33
     34#include <linux/uaccess.h>
     35#include <asm/syscalls.h>
     36#include <asm/time.h>
     37#include <asm/unistd.h>
     38
     39static inline long do_mmap2(unsigned long addr, size_t len,
     40			unsigned long prot, unsigned long flags,
     41			unsigned long fd, unsigned long off, int shift)
     42{
     43	if (!arch_validate_prot(prot, addr))
     44		return -EINVAL;
     45
     46	if (!IS_ALIGNED(off, 1 << shift))
     47		return -EINVAL;
     48
     49	return ksys_mmap_pgoff(addr, len, prot, flags, fd, off >> shift);
     50}
     51
     52SYSCALL_DEFINE6(mmap2, unsigned long, addr, size_t, len,
     53		unsigned long, prot, unsigned long, flags,
     54		unsigned long, fd, unsigned long, pgoff)
     55{
     56	return do_mmap2(addr, len, prot, flags, fd, pgoff, PAGE_SHIFT-12);
     57}
     58
     59SYSCALL_DEFINE6(mmap, unsigned long, addr, size_t, len,
     60		unsigned long, prot, unsigned long, flags,
     61		unsigned long, fd, off_t, offset)
     62{
     63	return do_mmap2(addr, len, prot, flags, fd, offset, PAGE_SHIFT);
     64}
     65
     66#ifdef CONFIG_PPC32
     67/*
     68 * Due to some executables calling the wrong select we sometimes
     69 * get wrong args.  This determines how the args are being passed
     70 * (a single ptr to them all args passed) then calls
     71 * sys_select() with the appropriate args. -- Cort
     72 */
     73int
     74ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct __kernel_old_timeval __user *tvp)
     75{
     76	if ((unsigned long)n >= 4096)
     77		return sys_old_select((void __user *)n);
     78
     79	return sys_select(n, inp, outp, exp, tvp);
     80}
     81#endif
     82
     83#ifdef CONFIG_PPC64
     84long ppc64_personality(unsigned long personality)
     85{
     86	long ret;
     87
     88	if (personality(current->personality) == PER_LINUX32
     89	    && personality(personality) == PER_LINUX)
     90		personality = (personality & ~PER_MASK) | PER_LINUX32;
     91	ret = sys_personality(personality);
     92	if (personality(ret) == PER_LINUX32)
     93		ret = (ret & ~PER_MASK) | PER_LINUX;
     94	return ret;
     95}
     96#endif
     97
     98long ppc_fadvise64_64(int fd, int advice, u32 offset_high, u32 offset_low,
     99		      u32 len_high, u32 len_low)
    100{
    101	return ksys_fadvise64_64(fd, (u64)offset_high << 32 | offset_low,
    102				 (u64)len_high << 32 | len_low, advice);
    103}
    104
    105SYSCALL_DEFINE0(switch_endian)
    106{
    107	struct thread_info *ti;
    108
    109	regs_set_return_msr(current->thread.regs,
    110				current->thread.regs->msr ^ MSR_LE);
    111
    112	/*
    113	 * Set TIF_RESTOREALL so that r3 isn't clobbered on return to
    114	 * userspace. That also has the effect of restoring the non-volatile
    115	 * GPRs, so we saved them on the way in here.
    116	 */
    117	ti = current_thread_info();
    118	ti->flags |= _TIF_RESTOREALL;
    119
    120	return 0;
    121}