1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Syscall support for the Hexagon architecture
4 *
5 * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved.
6 */
7
8 #ifndef _ASM_HEXAGON_SYSCALL_H
9 #define _ASM_HEXAGON_SYSCALL_H
10
11 #include <uapi/linux/audit.h>
12 #include <linux/err.h>
13 #include <asm/ptrace.h>
14
15 typedef long (*syscall_fn)(unsigned long, unsigned long,
16 unsigned long, unsigned long,
17 unsigned long, unsigned long);
18
19 #include <asm-generic/syscalls.h>
20
21 extern void *sys_call_table[];
22
syscall_get_nr(struct task_struct * task,struct pt_regs * regs)23 static inline long syscall_get_nr(struct task_struct *task,
24 struct pt_regs *regs)
25 {
26 return regs->r06;
27 }
28
syscall_set_nr(struct task_struct * task,struct pt_regs * regs,int nr)29 static inline void syscall_set_nr(struct task_struct *task,
30 struct pt_regs *regs,
31 int nr)
32 {
33 regs->r06 = nr;
34 }
35
syscall_get_arguments(struct task_struct * task,struct pt_regs * regs,unsigned long * args)36 static inline void syscall_get_arguments(struct task_struct *task,
37 struct pt_regs *regs,
38 unsigned long *args)
39 {
40 memcpy(args, &(®s->r00)[0], 6 * sizeof(args[0]));
41 }
42
syscall_set_arguments(struct task_struct * task,struct pt_regs * regs,unsigned long * args)43 static inline void syscall_set_arguments(struct task_struct *task,
44 struct pt_regs *regs,
45 unsigned long *args)
46 {
47 memcpy(&(®s->r00)[0], args, 6 * sizeof(args[0]));
48 }
49
syscall_get_error(struct task_struct * task,struct pt_regs * regs)50 static inline long syscall_get_error(struct task_struct *task,
51 struct pt_regs *regs)
52 {
53 return IS_ERR_VALUE(regs->r00) ? regs->r00 : 0;
54 }
55
syscall_get_return_value(struct task_struct * task,struct pt_regs * regs)56 static inline long syscall_get_return_value(struct task_struct *task,
57 struct pt_regs *regs)
58 {
59 return regs->r00;
60 }
61
syscall_set_return_value(struct task_struct * task,struct pt_regs * regs,int error,long val)62 static inline void syscall_set_return_value(struct task_struct *task,
63 struct pt_regs *regs,
64 int error, long val)
65 {
66 regs->r00 = (long) error ?: val;
67 }
68
syscall_get_arch(struct task_struct * task)69 static inline int syscall_get_arch(struct task_struct *task)
70 {
71 return AUDIT_ARCH_HEXAGON;
72 }
73
74 #endif
75