Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
powerpc
include
asm
syscall.h
Go to the documentation of this file.
1
/*
2
* Access to user system call parameters and results
3
*
4
* Copyright (C) 2008 Red Hat, Inc. All rights reserved.
5
*
6
* This copyrighted material is made available to anyone wishing to use,
7
* modify, copy, or redistribute it subject to the terms and conditions
8
* of the GNU General Public License v.2.
9
*
10
* See asm-generic/syscall.h for descriptions of what we must do here.
11
*/
12
13
#ifndef _ASM_SYSCALL_H
14
#define _ASM_SYSCALL_H 1
15
16
#include <linux/sched.h>
17
18
/* ftrace syscalls requires exporting the sys_call_table */
19
#ifdef CONFIG_FTRACE_SYSCALLS
20
extern
const
unsigned
long
*
sys_call_table
;
21
#endif
/* CONFIG_FTRACE_SYSCALLS */
22
23
static
inline
long
syscall_get_nr
(
struct
task_struct
*
task
,
24
struct
pt_regs
*
regs
)
25
{
26
return
TRAP
(regs) == 0xc00 ? regs->
gpr
[0] : -1
L
;
27
}
28
29
static
inline
void
syscall_rollback
(
struct
task_struct
*
task
,
30
struct
pt_regs
*
regs
)
31
{
32
regs->
gpr
[3] = regs->
orig_gpr3
;
33
}
34
35
static
inline
long
syscall_get_error
(
struct
task_struct
*
task
,
36
struct
pt_regs
*
regs
)
37
{
38
return
(regs->
ccr
& 0x10000000) ? -regs->
gpr
[3] : 0;
39
}
40
41
static
inline
long
syscall_get_return_value
(
struct
task_struct
*task,
42
struct
pt_regs
*regs)
43
{
44
return
regs->
gpr
[3];
45
}
46
47
static
inline
void
syscall_set_return_value
(
struct
task_struct
*task,
48
struct
pt_regs
*regs,
49
int
error
,
long
val
)
50
{
51
if
(error) {
52
regs->
ccr
|= 0x10000000
L
;
53
regs->
gpr
[3] = -
error
;
54
}
else
{
55
regs->
ccr
&= ~0x10000000
L
;
56
regs->
gpr
[3] =
val
;
57
}
58
}
59
60
static
inline
void
syscall_get_arguments
(
struct
task_struct
*task,
61
struct
pt_regs
*regs,
62
unsigned
int
i
,
unsigned
int
n
,
63
unsigned
long
*args)
64
{
65
BUG_ON
(i + n > 6);
66
#ifdef CONFIG_PPC64
67
if
(test_tsk_thread_flag(task, TIF_32BIT)) {
68
/*
69
* Zero-extend 32-bit argument values. The high bits are
70
* garbage ignored by the actual syscall dispatch.
71
*/
72
while
(n-- > 0)
73
args[
n
] = (
u32
) regs->
gpr
[3 + i + n];
74
return
;
75
}
76
#endif
77
memcpy
(args, ®s->
gpr
[3 + i], n *
sizeof
(args[0]));
78
}
79
80
static
inline
void
syscall_set_arguments
(
struct
task_struct
*task,
81
struct
pt_regs
*regs,
82
unsigned
int
i,
unsigned
int
n,
83
const
unsigned
long
*args)
84
{
85
BUG_ON
(i + n > 6);
86
memcpy
(®s->
gpr
[3 + i], args, n *
sizeof
(args[0]));
87
}
88
89
#endif
/* _ASM_SYSCALL_H */
Generated on Thu Jan 10 2013 12:55:23 for Linux Kernel by
1.8.2