1 /* 2 * dyngen defines for micro operation code 3 * 4 * Copyright (c) 2003 Fabrice Bellard 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with this library; if not, see <http://www.gnu.org/licenses/>. 18 */ 19 #if !defined(__DYNGEN_EXEC_H__) 20 #define __DYNGEN_EXEC_H__ 21 22 #include "qemu-common.h" 23 24 #ifdef __OpenBSD__ 25 #include <sys/types.h> 26 #endif 27 28 /* XXX: This may be wrong for 64-bit ILP32 hosts. */ 29 typedef void * host_reg_t; 30 31 #if defined(__i386__) 32 #define AREG0 "ebp" 33 #elif defined(__x86_64__) 34 #define AREG0 "r14" 35 #elif defined(_ARCH_PPC) 36 #define AREG0 "r27" 37 #elif defined(__arm__) 38 #define AREG0 "r7" 39 #elif defined(__hppa__) 40 #define AREG0 "r17" 41 #elif defined(__mips__) 42 #define AREG0 "s0" 43 #elif defined(__sparc__) 44 #ifdef CONFIG_SOLARIS 45 #define AREG0 "g2" 46 #else 47 #ifdef __sparc_v9__ 48 #define AREG0 "g5" 49 #else 50 #define AREG0 "g6" 51 #endif 52 #endif 53 #elif defined(__s390__) 54 #define AREG0 "r10" 55 #elif defined(__alpha__) 56 /* Note $15 is the frame pointer, so anything in op-i386.c that would 57 require a frame pointer, like alloca, would probably loose. */ 58 #define AREG0 "$15" 59 #elif defined(__mc68000) 60 #define AREG0 "%a5" 61 #elif defined(__ia64__) 62 #define AREG0 "r7" 63 #else 64 #error unsupported CPU 65 #endif 66 67 #define xglue(x, y) x ## y 68 #define glue(x, y) xglue(x, y) 69 #define stringify(s) tostring(s) 70 #define tostring(s) #s 71 72 /* The return address may point to the start of the next instruction. 73 Subtracting one gets us the call instruction itself. */ 74 #if defined(__s390__) && !defined(__s390x__) 75 # define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1)) 76 #elif defined(__arm__) 77 /* Thumb return addresses have the low bit set, so we need to subtract two. 78 This is still safe in ARM mode because instructions are 4 bytes. */ 79 # define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2)) 80 #else 81 # define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1)) 82 #endif 83 84 #endif /* !defined(__DYNGEN_EXEC_H__) */ 85