-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Richard Kuo <rkuo@codeaurora.org> Signed-off-by: Linas Vepstas <linas@codeaurora.org> Acked-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
- Loading branch information
Richard Kuo
authored and
Linus Torvalds
committed
Nov 1, 2011
1 parent
7508501
commit b9398a8
Showing
4 changed files
with
212 additions
and
0 deletions.
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/* | ||
* Syscall support for the Hexagon architecture | ||
* | ||
* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 and | ||
* only version 2 as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
* 02110-1301, USA. | ||
*/ | ||
|
||
#ifndef _ASM_HEXAGON_SYSCALL_H | ||
#define _ASM_HEXAGON_SYSCALL_H | ||
|
||
typedef long (*syscall_fn)(unsigned long, unsigned long, | ||
unsigned long, unsigned long, | ||
unsigned long, unsigned long); | ||
|
||
asmlinkage int sys_execve(char __user *ufilename, char __user * __user *argv, | ||
char __user * __user *envp); | ||
asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, | ||
unsigned long parent_tidp, unsigned long child_tidp); | ||
|
||
#define sys_execve sys_execve | ||
#define sys_clone sys_clone | ||
|
||
#include <asm-generic/syscalls.h> | ||
|
||
extern void *sys_call_table[]; | ||
|
||
static inline long syscall_get_nr(struct task_struct *task, | ||
struct pt_regs *regs) | ||
{ | ||
return regs->r06; | ||
} | ||
|
||
static inline void syscall_get_arguments(struct task_struct *task, | ||
struct pt_regs *regs, | ||
unsigned int i, unsigned int n, | ||
unsigned long *args) | ||
{ | ||
BUG_ON(i + n > 6); | ||
memcpy(args, &(®s->r00)[i], n * sizeof(args[0])); | ||
} | ||
#endif |
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 |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* Syscall support for Hexagon | ||
* | ||
* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 and | ||
* only version 2 as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
* 02110-1301, USA. | ||
*/ | ||
|
||
#if !defined(_ASM_HEXAGON_UNISTD_H) || defined(__SYSCALL) | ||
#define _ASM_HEXAGON_UNISTD_H | ||
|
||
/* | ||
* The kernel pulls this unistd.h in three different ways: | ||
* 1. the "normal" way which gets all the __NR defines | ||
* 2. with __SYSCALL defined to produce function declarations | ||
* 3. with __SYSCALL defined to produce syscall table initialization | ||
* See also: syscalltab.c | ||
*/ | ||
|
||
#define sys_mmap2 sys_mmap_pgoff | ||
|
||
#include <asm-generic/unistd.h> | ||
|
||
#endif |
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 |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/* | ||
* Hexagon system calls | ||
* | ||
* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 and | ||
* only version 2 as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
* 02110-1301, USA. | ||
*/ | ||
|
||
#include <linux/file.h> | ||
#include <linux/fs.h> | ||
#include <linux/linkage.h> | ||
#include <linux/mm.h> | ||
#include <linux/module.h> | ||
#include <linux/sched.h> | ||
#include <linux/slab.h> | ||
#include <linux/syscalls.h> | ||
#include <linux/unistd.h> | ||
#include <asm/mman.h> | ||
#include <asm/registers.h> | ||
|
||
/* | ||
* System calls with architecture-specific wrappers. | ||
* See signal.c for signal-related system call wrappers. | ||
*/ | ||
|
||
asmlinkage int sys_execve(char __user *ufilename, | ||
const char __user *const __user *argv, | ||
const char __user *const __user *envp) | ||
{ | ||
struct pt_regs *pregs = current_thread_info()->regs; | ||
char *filename; | ||
int retval; | ||
|
||
filename = getname(ufilename); | ||
retval = PTR_ERR(filename); | ||
if (IS_ERR(filename)) | ||
return retval; | ||
|
||
retval = do_execve(filename, argv, envp, pregs); | ||
putname(filename); | ||
|
||
return retval; | ||
} | ||
|
||
asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, | ||
unsigned long parent_tidp, unsigned long child_tidp) | ||
{ | ||
struct pt_regs *pregs = current_thread_info()->regs; | ||
|
||
if (!newsp) | ||
newsp = pregs->SP; | ||
return do_fork(clone_flags, newsp, pregs, 0, (int __user *)parent_tidp, | ||
(int __user *)child_tidp); | ||
} | ||
|
||
/* | ||
* Do a system call from the kernel, so as to have a proper pt_regs | ||
* and recycle the sys_execvpe infrustructure. | ||
*/ | ||
int kernel_execve(const char *filename, | ||
const char *const argv[], const char *const envp[]) | ||
{ | ||
register unsigned long __a0 asm("r0") = (unsigned long) filename; | ||
register unsigned long __a1 asm("r1") = (unsigned long) argv; | ||
register unsigned long __a2 asm("r2") = (unsigned long) envp; | ||
int retval; | ||
|
||
__asm__ volatile( | ||
" R6 = #%4;\n" | ||
" trap0(#1);\n" | ||
" %0 = R0;\n" | ||
: "=r" (retval) | ||
: "r" (__a0), "r" (__a1), "r" (__a2), "i" (__NR_execve) | ||
); | ||
|
||
return retval; | ||
} | ||
EXPORT_SYMBOL(kernel_execve); |
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 |
---|---|---|
@@ -0,0 +1,32 @@ | ||
/* | ||
* System call table for Hexagon | ||
* | ||
* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved. | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 and | ||
* only version 2 as published by the Free Software Foundation. | ||
* | ||
* This program is distributed in the hope that it will be useful, | ||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
* GNU General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU General Public License | ||
* along with this program; if not, write to the Free Software | ||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
* 02110-1301, USA. | ||
*/ | ||
|
||
#include <linux/syscalls.h> | ||
#include <linux/signal.h> | ||
#include <linux/unistd.h> | ||
|
||
#include <asm/syscall.h> | ||
|
||
#undef __SYSCALL | ||
#define __SYSCALL(nr, call) [nr] = (call), | ||
|
||
void *sys_call_table[__NR_syscalls] = { | ||
#include <asm/unistd.h> | ||
}; |