forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 440
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This enables /proc/<pid>/syscall and the ptrace PTRACE_GETREGSET and PTRACE_SETREGSET operations. Signed-off-by: Ralf Baechle <[email protected]>
- Loading branch information
1 parent
6a9c001
commit c0ff3c5
Showing
3 changed files
with
81 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,81 @@ | ||
/* | ||
* Access to user system call parameters and results | ||
* | ||
* This file is subject to the terms and conditions of the GNU General Public | ||
* License. See the file "COPYING" in the main directory of this archive | ||
* for more details. | ||
* | ||
* See asm-generic/syscall.h for descriptions of what we must do here. | ||
* | ||
* Copyright (C) 2012 Ralf Baechle <[email protected]> | ||
*/ | ||
|
||
#ifndef __ASM_MIPS_SYSCALL_H | ||
#define __ASM_MIPS_SYSCALL_H | ||
|
||
#include <linux/kernel.h> | ||
#include <linux/sched.h> | ||
#include <linux/uaccess.h> | ||
#include <asm/ptrace.h> | ||
|
||
static inline long syscall_get_nr(struct task_struct *task, | ||
struct pt_regs *regs) | ||
{ | ||
return regs->regs[2]; | ||
} | ||
|
||
static inline unsigned long mips_get_syscall_arg(unsigned long *arg, | ||
struct task_struct *task, struct pt_regs *regs, unsigned int n) | ||
{ | ||
unsigned long usp = regs->regs[29]; | ||
|
||
switch (n) { | ||
case 0: case 1: case 2: case 3: | ||
*arg = regs->regs[4 + n]; | ||
|
||
return 0; | ||
|
||
#ifdef CONFIG_32BIT | ||
case 4: case 5: case 6: case 7: | ||
return get_user(*arg, (int *)usp + 4 * n); | ||
#endif | ||
|
||
#ifdef CONFIG_64BIT | ||
case 4: case 5: case 6: case 7: | ||
#ifdef CONFIG_MIPS32_O32 | ||
if (test_thread_flag(TIF_32BIT_REGS)) | ||
return get_user(*arg, (int *)usp + 4 * n); | ||
else | ||
#endif | ||
*arg = regs->regs[4 + n]; | ||
|
||
return 0; | ||
#endif | ||
|
||
default: | ||
BUG(); | ||
} | ||
} | ||
|
||
static inline void syscall_get_arguments(struct task_struct *task, | ||
struct pt_regs *regs, | ||
unsigned int i, unsigned int n, | ||
unsigned long *args) | ||
{ | ||
unsigned long arg; | ||
int ret; | ||
|
||
while (n--) | ||
ret |= mips_get_syscall_arg(&arg, task, regs, i++); | ||
|
||
/* | ||
* No way to communicate an error because this is a void function. | ||
*/ | ||
#if 0 | ||
return ret; | ||
#endif | ||
} | ||
|
||
extern const unsigned long sys_call_table[]; | ||
extern const unsigned long sys32_call_table[]; | ||
extern const unsigned long sysn32_call_table[]; | ||
|