126 lines · 2.9 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0-only *//* * Copyright (C) 2012 ARM Ltd. */#ifndef __ASM_SYSCALL_H#define __ASM_SYSCALL_H #include <uapi/linux/audit.h>#include <linux/compat.h>#include <linux/err.h> typedef long (*syscall_fn_t)(const struct pt_regs *regs); extern const syscall_fn_t sys_call_table[]; #ifdef CONFIG_COMPATextern const syscall_fn_t compat_sys_call_table[];#endif static inline int syscall_get_nr(struct task_struct *task,				 struct pt_regs *regs){	return regs->syscallno;} static inline void syscall_rollback(struct task_struct *task,				    struct pt_regs *regs){	regs->regs[0] = regs->orig_x0;} static inline long syscall_get_return_value(struct task_struct *task,					    struct pt_regs *regs){	unsigned long val = regs->regs[0]; 	if (is_compat_thread(task_thread_info(task)))		val = sign_extend64(val, 31); 	return val;} static inline long syscall_get_error(struct task_struct *task,				     struct pt_regs *regs){	unsigned long error = syscall_get_return_value(task, regs); 	return IS_ERR_VALUE(error) ? error : 0;} static inline void syscall_set_return_value(struct task_struct *task,					    struct pt_regs *regs,					    int error, long val){	if (error)		val = error; 	if (is_compat_thread(task_thread_info(task)))		val = lower_32_bits(val); 	regs->regs[0] = val;} static inline void syscall_set_nr(struct task_struct *task,				  struct pt_regs *regs,				  int nr){	regs->syscallno = nr;	if (nr == -1) {		/*		 * When the syscall number is set to -1, the syscall will be		 * skipped.  In this case the syscall return value has to be		 * set explicitly, otherwise the first syscall argument is		 * returned as the syscall return value.		 */		syscall_set_return_value(task, regs, -ENOSYS, 0);	}} static inline void syscall_get_arguments(struct task_struct *task,					 struct pt_regs *regs,					 unsigned long *args){	args[0] = regs->orig_x0;	args[1] = regs->regs[1];	args[2] = regs->regs[2];	args[3] = regs->regs[3];	args[4] = regs->regs[4];	args[5] = regs->regs[5];} static inline void syscall_set_arguments(struct task_struct *task,					 struct pt_regs *regs,					 const unsigned long *args){	regs->regs[0] = args[0];	regs->regs[1] = args[1];	regs->regs[2] = args[2];	regs->regs[3] = args[3];	regs->regs[4] = args[4];	regs->regs[5] = args[5]; 	/*	 * Also copy the first argument into orig_x0	 * so that syscall_get_arguments() would return it	 * instead of the previous value.	 */	regs->orig_x0 = regs->regs[0];} /* * We don't care about endianness (__AUDIT_ARCH_LE bit) here because * AArch64 has the same system calls both on little- and big- endian. */static inline int syscall_get_arch(struct task_struct *task){	if (is_compat_thread(task_thread_info(task)))		return AUDIT_ARCH_ARM; 	return AUDIT_ARCH_AARCH64;} int syscall_trace_enter(struct pt_regs *regs);void syscall_trace_exit(struct pt_regs *regs); #endif	/* __ASM_SYSCALL_H */

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t