Blame view
arch/x86/include/asm/syscall.h
4.41 KB
68bd0f4ef x86: tracehook: a... |
1 2 3 |
/* * Access to user system call parameters and results * |
18c1e2c80 x86: syscall_get_... |
4 |
* Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. |
68bd0f4ef x86: tracehook: a... |
5 6 7 8 9 10 11 |
* * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU General Public License v.2. * * See asm-generic/syscall.h for descriptions of what we must do here. */ |
5e1b00758 x86: canonicalize... |
12 13 |
#ifndef _ASM_X86_SYSCALL_H #define _ASM_X86_SYSCALL_H |
68bd0f4ef x86: tracehook: a... |
14 15 |
#include <linux/sched.h> |
4ab4ba32a x86, tracehook: c... |
16 |
#include <linux/err.h> |
72142fd41 x86: Move <asm/as... |
17 |
#include <asm/asm-offsets.h> /* For NR_syscalls */ |
68bd0f4ef x86: tracehook: a... |
18 |
|
e7b8e675d tracing: Unify ar... |
19 |
extern const unsigned long sys_call_table[]; |
18c1e2c80 x86: syscall_get_... |
20 21 22 23 24 25 |
/* * Only the low 32 bits of orig_ax are meaningful, so we return int. * This importantly ignores the high bits on 64-bit, so comparisons * sign-extend the low 32 bits. */ static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) |
68bd0f4ef x86: tracehook: a... |
26 |
{ |
68bd0f4ef x86: tracehook: a... |
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
return regs->orig_ax; } static inline void syscall_rollback(struct task_struct *task, struct pt_regs *regs) { regs->ax = regs->orig_ax; } static inline long syscall_get_error(struct task_struct *task, struct pt_regs *regs) { unsigned long error = regs->ax; #ifdef CONFIG_IA32_EMULATION /* * TS_COMPAT is set for 32-bit syscall entries and then * remains set until we return to user mode. */ if (task_thread_info(task)->status & TS_COMPAT) /* * Sign-extend the value so (int)-EFOO becomes (long)-EFOO * and will match correctly in comparisons. */ error = (long) (int) error; #endif |
4ab4ba32a x86, tracehook: c... |
52 |
return IS_ERR_VALUE(error) ? error : 0; |
68bd0f4ef x86: tracehook: a... |
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
} static inline long syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) { return regs->ax; } static inline void syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, int error, long val) { regs->ax = (long) error ?: val; } #ifdef CONFIG_X86_32 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->bx + i, n * sizeof(args[0])); } static inline void syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, unsigned int i, unsigned int n, const unsigned long *args) { BUG_ON(i + n > 6); memcpy(®s->bx + i, args, n * sizeof(args[0])); } #else /* CONFIG_X86_64 */ static inline void syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, unsigned int i, unsigned int n, unsigned long *args) { # ifdef CONFIG_IA32_EMULATION if (task_thread_info(task)->status & TS_COMPAT) |
746e7cef1 x86 syscall.h: fi... |
97 98 |
switch (i) { case 0: |
68bd0f4ef x86: tracehook: a... |
99 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
100 101 |
*args++ = regs->bx; case 1: |
68bd0f4ef x86: tracehook: a... |
102 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
103 104 |
*args++ = regs->cx; case 2: |
68bd0f4ef x86: tracehook: a... |
105 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
106 |
*args++ = regs->dx; |
68bd0f4ef x86: tracehook: a... |
107 108 |
case 3: if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
109 110 |
*args++ = regs->si; case 4: |
68bd0f4ef x86: tracehook: a... |
111 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
112 113 |
*args++ = regs->di; case 5: |
68bd0f4ef x86: tracehook: a... |
114 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
115 116 |
*args++ = regs->bp; case 6: |
68bd0f4ef x86: tracehook: a... |
117 118 119 120 121 122 123 |
if (!n--) break; default: BUG(); break; } else # endif |
746e7cef1 x86 syscall.h: fi... |
124 125 |
switch (i) { case 0: |
68bd0f4ef x86: tracehook: a... |
126 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
127 128 |
*args++ = regs->di; case 1: |
68bd0f4ef x86: tracehook: a... |
129 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
130 131 |
*args++ = regs->si; case 2: |
68bd0f4ef x86: tracehook: a... |
132 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
133 |
*args++ = regs->dx; |
68bd0f4ef x86: tracehook: a... |
134 135 |
case 3: if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
136 137 |
*args++ = regs->r10; case 4: |
68bd0f4ef x86: tracehook: a... |
138 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
139 140 |
*args++ = regs->r8; case 5: |
68bd0f4ef x86: tracehook: a... |
141 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
142 143 |
*args++ = regs->r9; case 6: |
68bd0f4ef x86: tracehook: a... |
144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
if (!n--) break; default: BUG(); break; } } static inline void syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, unsigned int i, unsigned int n, const unsigned long *args) { # ifdef CONFIG_IA32_EMULATION if (task_thread_info(task)->status & TS_COMPAT) |
746e7cef1 x86 syscall.h: fi... |
158 159 |
switch (i) { case 0: |
68bd0f4ef x86: tracehook: a... |
160 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
161 162 |
regs->bx = *args++; case 1: |
68bd0f4ef x86: tracehook: a... |
163 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
164 165 |
regs->cx = *args++; case 2: |
68bd0f4ef x86: tracehook: a... |
166 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
167 |
regs->dx = *args++; |
68bd0f4ef x86: tracehook: a... |
168 169 |
case 3: if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
170 171 |
regs->si = *args++; case 4: |
68bd0f4ef x86: tracehook: a... |
172 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
173 174 |
regs->di = *args++; case 5: |
68bd0f4ef x86: tracehook: a... |
175 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
176 177 |
regs->bp = *args++; case 6: |
68bd0f4ef x86: tracehook: a... |
178 179 180 |
if (!n--) break; default: BUG(); |
746e7cef1 x86 syscall.h: fi... |
181 |
break; |
68bd0f4ef x86: tracehook: a... |
182 183 184 |
} else # endif |
746e7cef1 x86 syscall.h: fi... |
185 186 |
switch (i) { case 0: |
68bd0f4ef x86: tracehook: a... |
187 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
188 189 |
regs->di = *args++; case 1: |
68bd0f4ef x86: tracehook: a... |
190 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
191 192 |
regs->si = *args++; case 2: |
68bd0f4ef x86: tracehook: a... |
193 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
194 |
regs->dx = *args++; |
68bd0f4ef x86: tracehook: a... |
195 196 |
case 3: if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
197 198 |
regs->r10 = *args++; case 4: |
68bd0f4ef x86: tracehook: a... |
199 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
200 201 |
regs->r8 = *args++; case 5: |
68bd0f4ef x86: tracehook: a... |
202 |
if (!n--) break; |
746e7cef1 x86 syscall.h: fi... |
203 204 |
regs->r9 = *args++; case 6: |
68bd0f4ef x86: tracehook: a... |
205 206 207 |
if (!n--) break; default: BUG(); |
746e7cef1 x86 syscall.h: fi... |
208 |
break; |
68bd0f4ef x86: tracehook: a... |
209 210 211 212 |
} } #endif /* CONFIG_X86_32 */ |
5e1b00758 x86: canonicalize... |
213 |
#endif /* _ASM_X86_SYSCALL_H */ |