| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) | 
 | 3 |  * Licensed under the GPL | 
 | 4 |  */ | 
 | 5 |  | 
 | 6 | #ifndef __SYSDEP_STUB_H | 
 | 7 | #define __SYSDEP_STUB_H | 
 | 8 |  | 
| Jeff Dike | 5b7b15a | 2005-12-18 17:50:39 +0100 | [diff] [blame] | 9 | #include <sys/mman.h> | 
| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 10 | #include <asm/ptrace.h> | 
 | 11 | #include <asm/unistd.h> | 
| Jeff Dike | 54ae36f | 2007-10-16 01:27:33 -0700 | [diff] [blame] | 12 | #include "as-layout.h" | 
| Jeff Dike | 5b7b15a | 2005-12-18 17:50:39 +0100 | [diff] [blame] | 13 | #include "stub-data.h" | 
 | 14 | #include "kern_constants.h" | 
 | 15 | #include "uml-config.h" | 
| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 16 |  | 
 | 17 | extern void stub_segv_handler(int sig); | 
| Bodo Stroesser | 9786a8f | 2005-07-07 17:56:50 -0700 | [diff] [blame] | 18 | extern void stub_clone_handler(void); | 
| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 19 |  | 
 | 20 | #define STUB_SYSCALL_RET EAX | 
 | 21 | #define STUB_MMAP_NR __NR_mmap2 | 
| Jeff Dike | 71f926f | 2007-10-16 01:26:44 -0700 | [diff] [blame] | 22 | #define MMAP_OFFSET(o) ((o) >> UM_KERN_PAGE_SHIFT) | 
| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 23 |  | 
| Jeff Dike | 17d4697 | 2005-11-21 21:32:09 -0800 | [diff] [blame] | 24 | static inline long stub_syscall0(long syscall) | 
 | 25 | { | 
 | 26 | 	long ret; | 
 | 27 |  | 
 | 28 | 	__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall)); | 
 | 29 |  | 
 | 30 | 	return ret; | 
 | 31 | } | 
 | 32 |  | 
| Paolo 'Blaisorblade' Giarrusso | 4f02724 | 2005-11-07 00:58:46 -0800 | [diff] [blame] | 33 | static inline long stub_syscall1(long syscall, long arg1) | 
 | 34 | { | 
 | 35 | 	long ret; | 
 | 36 |  | 
 | 37 | 	__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1)); | 
 | 38 |  | 
 | 39 | 	return ret; | 
 | 40 | } | 
 | 41 |  | 
| Bodo Stroesser | 9786a8f | 2005-07-07 17:56:50 -0700 | [diff] [blame] | 42 | static inline long stub_syscall2(long syscall, long arg1, long arg2) | 
 | 43 | { | 
 | 44 | 	long ret; | 
 | 45 |  | 
| Paolo 'Blaisorblade' Giarrusso | 4f02724 | 2005-11-07 00:58:46 -0800 | [diff] [blame] | 46 | 	__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), | 
 | 47 | 			"c" (arg2)); | 
 | 48 |  | 
 | 49 | 	return ret; | 
| Bodo Stroesser | 9786a8f | 2005-07-07 17:56:50 -0700 | [diff] [blame] | 50 | } | 
 | 51 |  | 
 | 52 | static inline long stub_syscall3(long syscall, long arg1, long arg2, long arg3) | 
 | 53 | { | 
| Paolo 'Blaisorblade' Giarrusso | 4f02724 | 2005-11-07 00:58:46 -0800 | [diff] [blame] | 54 | 	long ret; | 
 | 55 |  | 
 | 56 | 	__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), | 
 | 57 | 			"c" (arg2), "d" (arg3)); | 
 | 58 |  | 
 | 59 | 	return ret; | 
| Bodo Stroesser | 9786a8f | 2005-07-07 17:56:50 -0700 | [diff] [blame] | 60 | } | 
 | 61 |  | 
 | 62 | static inline long stub_syscall4(long syscall, long arg1, long arg2, long arg3, | 
 | 63 | 				 long arg4) | 
 | 64 | { | 
| Paolo 'Blaisorblade' Giarrusso | 4f02724 | 2005-11-07 00:58:46 -0800 | [diff] [blame] | 65 | 	long ret; | 
 | 66 |  | 
 | 67 | 	__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), | 
 | 68 | 			"c" (arg2), "d" (arg3), "S" (arg4)); | 
 | 69 |  | 
 | 70 | 	return ret; | 
 | 71 | } | 
 | 72 |  | 
 | 73 | static inline long stub_syscall5(long syscall, long arg1, long arg2, long arg3, | 
 | 74 | 				 long arg4, long arg5) | 
 | 75 | { | 
 | 76 | 	long ret; | 
 | 77 |  | 
 | 78 | 	__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), | 
 | 79 | 			"c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)); | 
 | 80 |  | 
 | 81 | 	return ret; | 
| Bodo Stroesser | 9786a8f | 2005-07-07 17:56:50 -0700 | [diff] [blame] | 82 | } | 
 | 83 |  | 
| Bodo Stroesser | 9786a8f | 2005-07-07 17:56:50 -0700 | [diff] [blame] | 84 | static inline void trap_myself(void) | 
 | 85 | { | 
 | 86 | 	__asm("int3"); | 
 | 87 | } | 
 | 88 |  | 
| Jeff Dike | 5b7b15a | 2005-12-18 17:50:39 +0100 | [diff] [blame] | 89 | static inline void remap_stack(int fd, unsigned long offset) | 
 | 90 | { | 
 | 91 | 	__asm__ volatile ("movl %%eax,%%ebp ; movl %0,%%eax ; int $0x80 ;" | 
 | 92 | 			  "movl %7, %%ebx ; movl %%eax, (%%ebx)" | 
| Jeff Dike | 54ae36f | 2007-10-16 01:27:33 -0700 | [diff] [blame] | 93 | 			  : : "g" (STUB_MMAP_NR), "b" (STUB_DATA), | 
 | 94 | 			    "c" (UM_KERN_PAGE_SIZE), | 
| Jeff Dike | 5b7b15a | 2005-12-18 17:50:39 +0100 | [diff] [blame] | 95 | 			    "d" (PROT_READ | PROT_WRITE), | 
| Jeff Dike | 54ae36f | 2007-10-16 01:27:33 -0700 | [diff] [blame] | 96 | 			    "S" (MAP_FIXED | MAP_SHARED), "D" (fd), | 
 | 97 | 			    "a" (offset), | 
 | 98 | 			    "i" (&((struct stub_data *) STUB_DATA)->err) | 
| Jeff Dike | 5b7b15a | 2005-12-18 17:50:39 +0100 | [diff] [blame] | 99 | 			  : "memory"); | 
 | 100 | } | 
 | 101 |  | 
| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 102 | #endif |