| 
									
										
										
										
											2008-09-12 22:13:13 +09:00
										 |  |  | #ifndef __ASM_SH_SYSCALL_64_H
 | 
					
						
							|  |  |  | #define __ASM_SH_SYSCALL_64_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-10 19:46:18 +09:00
										 |  |  | #include <linux/kernel.h>
 | 
					
						
							|  |  |  | #include <linux/sched.h>
 | 
					
						
							|  |  |  | #include <asm/ptrace.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* The system call number is given by the user in R9 */ | 
					
						
							|  |  |  | static inline long syscall_get_nr(struct task_struct *task, | 
					
						
							|  |  |  | 				  struct pt_regs *regs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return (regs->syscall_nr >= 0) ? regs->regs[9] : -1L; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void syscall_rollback(struct task_struct *task, | 
					
						
							|  |  |  | 				    struct pt_regs *regs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * XXX: This needs some thought. On SH we don't | 
					
						
							|  |  |  | 	 * save away the original R9 value anywhere. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline long syscall_get_error(struct task_struct *task, | 
					
						
							|  |  |  | 				     struct pt_regs *regs) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-29 11:21:38 +09:00
										 |  |  | 	return IS_ERR_VALUE(regs->regs[9]) ? regs->regs[9] : 0; | 
					
						
							| 
									
										
										
										
											2008-12-10 19:46:18 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline long syscall_get_return_value(struct task_struct *task, | 
					
						
							|  |  |  | 					    struct pt_regs *regs) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return regs->regs[9]; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline void syscall_set_return_value(struct task_struct *task, | 
					
						
							|  |  |  | 					    struct pt_regs *regs, | 
					
						
							|  |  |  | 					    int error, long val) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2009-01-29 11:21:38 +09:00
										 |  |  | 	if (error) | 
					
						
							| 
									
										
										
										
											2008-12-10 19:46:18 +09:00
										 |  |  | 		regs->regs[9] = -error; | 
					
						
							| 
									
										
										
										
											2009-01-29 11:21:38 +09:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2008-12-10 19:46:18 +09:00
										 |  |  | 		regs->regs[9] = val; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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); | 
					
						
							| 
									
										
										
										
											2008-12-10 20:17:15 +09:00
										 |  |  | 	memcpy(args, ®s->regs[2 + i], n * sizeof(args[0])); | 
					
						
							| 
									
										
										
										
											2008-12-10 19:46:18 +09:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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); | 
					
						
							| 
									
										
										
										
											2008-12-10 20:17:15 +09:00
										 |  |  | 	memcpy(®s->regs[2 + i], args, n * sizeof(args[0])); | 
					
						
							| 
									
										
										
										
											2008-12-10 19:46:18 +09:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-09-12 22:13:13 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif /* __ASM_SH_SYSCALL_64_H */
 |