File Index
Files and directories
Sign in
FILE

syscall.h

File preview with syntax highlighting.

linux-6.19.14/arch/arc/include/asm/syscall.h C
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
  4 */
  5
  6#ifndef _ASM_ARC_SYSCALL_H
  7#define _ASM_ARC_SYSCALL_H  1
  8
  9#include <uapi/linux/audit.h>
 10#include <linux/err.h>
 11#include <linux/sched.h>
 12#include <asm/unistd.h>
 13#include <asm/ptrace.h>		/* in_syscall() */
 14
 15extern void *sys_call_table[];
 16
 17static inline long
 18syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
 19{
 20	if (user_mode(regs) && in_syscall(regs))
 21		return regs->r8;
 22	else
 23		return -1;
 24}
 25
 26static inline void
 27syscall_set_nr(struct task_struct *task, struct pt_regs *regs, int nr)
 28{
 29	/*
 30	 * Unlike syscall_get_nr(), syscall_set_nr() can be called only when
 31	 * the target task is stopped for tracing on entering syscall, so
 32	 * there is no need to have the same check syscall_get_nr() has.
 33	 */
 34	regs->r8 = nr;
 35}
 36
 37static inline void
 38syscall_rollback(struct task_struct *task, struct pt_regs *regs)
 39{
 40	regs->r0 = regs->orig_r0;
 41}
 42
 43static inline long
 44syscall_get_error(struct task_struct *task, struct pt_regs *regs)
 45{
 46	/* 0 if syscall succeeded, otherwise -Errorcode */
 47	return IS_ERR_VALUE(regs->r0) ? regs->r0 : 0;
 48}
 49
 50static inline long
 51syscall_get_return_value(struct task_struct *task, struct pt_regs *regs)
 52{
 53	return regs->r0;
 54}
 55
 56static inline void
 57syscall_set_return_value(struct task_struct *task, struct pt_regs *regs,
 58			 int error, long val)
 59{
 60	regs->r0 = (long) error ?: val;
 61}
 62
 63/*
 64 * @i:      argument index [0,5]
 65 * @n:      number of arguments; n+i must be [1,6].
 66 */
 67static inline void
 68syscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
 69		      unsigned long *args)
 70{
 71	unsigned long *inside_ptregs = &(regs->r0);
 72	unsigned int n = 6;
 73	unsigned int i = 0;
 74
 75	while (n--) {
 76		args[i++] = (*inside_ptregs);
 77		inside_ptregs--;
 78	}
 79}
 80
 81static inline void
 82syscall_set_arguments(struct task_struct *task, struct pt_regs *regs,
 83		      unsigned long *args)
 84{
 85	unsigned long *inside_ptregs = &regs->r0;
 86	unsigned int n = 6;
 87	unsigned int i = 0;
 88
 89	while (n--) {
 90		*inside_ptregs = args[i++];
 91		inside_ptregs--;
 92	}
 93}
 94
 95static inline int
 96syscall_get_arch(struct task_struct *task)
 97{
 98	return IS_ENABLED(CONFIG_ISA_ARCOMPACT)
 99		? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
100			? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT)
101		: (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
102			? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2);
103}
104
105#endif
~/ Read-only file preview.