Annotation of qemu/dyngen-exec.h, revision 1.1.1.6

1.1       root        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, write to the Free Software
1.1.1.6 ! root       18:  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
1.1       root       19:  */
                     20: #if !defined(__DYNGEN_EXEC_H__)
                     21: #define __DYNGEN_EXEC_H__
                     22: 
1.1.1.2   root       23: /* prevent Solaris from trying to typedef FILE in gcc's
                     24:    include/floatingpoint.h which will conflict with the
                     25:    definition down below */
                     26: #ifdef __sun__
                     27: #define _FILEDEFED
                     28: #endif
                     29: 
1.1       root       30: /* NOTE: standard headers should be used with special care at this
                     31:    point because host CPU registers are used as global variables. Some
                     32:    host headers do not allow that. */
                     33: #include <stddef.h>
                     34: 
1.1.1.6 ! root       35: #ifdef __OpenBSD__
        !            36: #include <sys/types.h>
        !            37: #else
1.1       root       38: typedef unsigned char uint8_t;
                     39: typedef unsigned short uint16_t;
                     40: typedef unsigned int uint32_t;
1.1.1.3   root       41: // Linux/Sparc64 defines uint64_t
1.1.1.6 ! root       42: #if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__))
1.1       root       43: /* XXX may be done for all 64 bits targets ? */
1.1.1.6 ! root       44: #if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(_ARCH_PPC64)
1.1       root       45: typedef unsigned long uint64_t;
                     46: #else
                     47: typedef unsigned long long uint64_t;
                     48: #endif
1.1.1.3   root       49: #endif
1.1       root       50: 
1.1.1.2   root       51: /* if Solaris/__sun__, don't typedef int8_t, as it will be typedef'd
                     52:    prior to this and will cause an error in compliation, conflicting
                     53:    with /usr/include/sys/int_types.h, line 75 */
                     54: #ifndef __sun__
1.1       root       55: typedef signed char int8_t;
1.1.1.2   root       56: #endif
1.1       root       57: typedef signed short int16_t;
                     58: typedef signed int int32_t;
1.1.1.3   root       59: // Linux/Sparc64 defines int64_t
1.1.1.6 ! root       60: #if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__))
        !            61: #if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(_ARCH_PPC64)
1.1       root       62: typedef signed long int64_t;
                     63: #else
                     64: typedef signed long long int64_t;
                     65: #endif
1.1.1.3   root       66: #endif
1.1.1.6 ! root       67: #endif
1.1       root       68: 
1.1.1.4   root       69: /* XXX: This may be wrong for 64-bit ILP32 hosts.  */
                     70: typedef void * host_reg_t;
                     71: 
1.1       root       72: #define INT8_MIN               (-128)
                     73: #define INT16_MIN              (-32767-1)
                     74: #define INT32_MIN              (-2147483647-1)
                     75: #define INT64_MIN              (-(int64_t)(9223372036854775807)-1)
                     76: #define INT8_MAX               (127)
                     77: #define INT16_MAX              (32767)
                     78: #define INT32_MAX              (2147483647)
                     79: #define INT64_MAX              ((int64_t)(9223372036854775807))
                     80: #define UINT8_MAX              (255)
                     81: #define UINT16_MAX             (65535)
                     82: #define UINT32_MAX             (4294967295U)
                     83: #define UINT64_MAX             ((uint64_t)(18446744073709551615))
                     84: 
1.1.1.5   root       85: #ifdef _BSD
                     86: typedef struct __sFILE FILE;
                     87: #else
1.1       root       88: typedef struct FILE FILE;
1.1.1.5   root       89: #endif
1.1       root       90: extern int fprintf(FILE *, const char *, ...);
1.1.1.5   root       91: extern int fputs(const char *, FILE *);
1.1       root       92: extern int printf(const char *, ...);
                     93: #undef NULL
                     94: #define NULL 0
                     95: 
1.1.1.5   root       96: #if defined(__i386__)
1.1       root       97: #define AREG0 "ebp"
                     98: #define AREG1 "ebx"
                     99: #define AREG2 "esi"
                    100: #define AREG3 "edi"
1.1.1.5   root      101: #elif defined(__x86_64__)
                    102: #define AREG0 "r14"
                    103: #define AREG1 "r15"
1.1       root      104: #define AREG2 "r12"
                    105: #define AREG3 "r13"
1.1.1.5   root      106: //#define AREG4 "rbp"
                    107: //#define AREG5 "rbx"
1.1.1.6 ! root      108: #elif defined(_ARCH_PPC)
1.1       root      109: #define AREG0 "r27"
                    110: #define AREG1 "r24"
                    111: #define AREG2 "r25"
                    112: #define AREG3 "r26"
                    113: /* XXX: suppress this hack */
                    114: #if defined(CONFIG_USER_ONLY)
                    115: #define AREG4 "r16"
                    116: #define AREG5 "r17"
                    117: #define AREG6 "r18"
                    118: #define AREG7 "r19"
                    119: #define AREG8 "r20"
                    120: #define AREG9 "r21"
                    121: #define AREG10 "r22"
                    122: #define AREG11 "r23"
                    123: #endif
1.1.1.5   root      124: #elif defined(__arm__)
1.1       root      125: #define AREG0 "r7"
                    126: #define AREG1 "r4"
                    127: #define AREG2 "r5"
                    128: #define AREG3 "r6"
1.1.1.6 ! root      129: #elif defined(__hppa__)
        !           130: #define AREG0 "r17"
        !           131: #define AREG1 "r14"
        !           132: #define AREG2 "r15"
        !           133: #define AREG3 "r16"
1.1.1.5   root      134: #elif defined(__mips__)
                    135: #define AREG0 "fp"
1.1       root      136: #define AREG1 "s0"
                    137: #define AREG2 "s1"
                    138: #define AREG3 "s2"
1.1.1.5   root      139: #define AREG4 "s3"
                    140: #define AREG5 "s4"
                    141: #define AREG6 "s5"
                    142: #define AREG7 "s6"
                    143: #define AREG8 "s7"
                    144: #elif defined(__sparc__)
1.1.1.3   root      145: #ifdef HOST_SOLARIS
                    146: #define AREG0 "g2"
                    147: #define AREG1 "g3"
                    148: #define AREG2 "g4"
                    149: #define AREG3 "g5"
                    150: #define AREG4 "g6"
                    151: #else
                    152: #ifdef __sparc_v9__
1.1.1.6 ! root      153: #define AREG0 "g5"
        !           154: #define AREG1 "g6"
        !           155: #define AREG2 "g7"
1.1.1.3   root      156: #else
1.1       root      157: #define AREG0 "g6"
                    158: #define AREG1 "g1"
                    159: #define AREG2 "g2"
                    160: #define AREG3 "g3"
                    161: #define AREG4 "l0"
                    162: #define AREG5 "l1"
                    163: #define AREG6 "l2"
                    164: #define AREG7 "l3"
                    165: #define AREG8 "l4"
                    166: #define AREG9 "l5"
                    167: #define AREG10 "l6"
                    168: #define AREG11 "l7"
1.1.1.3   root      169: #endif
                    170: #endif
1.1.1.5   root      171: #elif defined(__s390__)
1.1       root      172: #define AREG0 "r10"
                    173: #define AREG1 "r7"
                    174: #define AREG2 "r8"
                    175: #define AREG3 "r9"
1.1.1.5   root      176: #elif defined(__alpha__)
1.1       root      177: /* Note $15 is the frame pointer, so anything in op-i386.c that would
                    178:    require a frame pointer, like alloca, would probably loose.  */
                    179: #define AREG0 "$15"
                    180: #define AREG1 "$9"
                    181: #define AREG2 "$10"
                    182: #define AREG3 "$11"
                    183: #define AREG4 "$12"
                    184: #define AREG5 "$13"
                    185: #define AREG6 "$14"
1.1.1.5   root      186: #elif defined(__mc68000)
1.1       root      187: #define AREG0 "%a5"
                    188: #define AREG1 "%a4"
                    189: #define AREG2 "%d7"
                    190: #define AREG3 "%d6"
                    191: #define AREG4 "%d5"
1.1.1.5   root      192: #elif defined(__ia64__)
1.1       root      193: #define AREG0 "r7"
                    194: #define AREG1 "r4"
                    195: #define AREG2 "r5"
                    196: #define AREG3 "r6"
1.1.1.5   root      197: #else
                    198: #error unsupported CPU
1.1       root      199: #endif
                    200: 
                    201: #define xglue(x, y) x ## y
                    202: #define glue(x, y) xglue(x, y)
                    203: #define stringify(s)   tostring(s)
                    204: #define tostring(s)    #s
                    205: 
1.1.1.6 ! root      206: /* The return address may point to the start of the next instruction.
        !           207:    Subtracting one gets us the call instruction itself.  */
        !           208: #if defined(__s390__)
        !           209: # define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1))
1.1.1.5   root      210: #elif defined(__arm__)
1.1.1.6 ! root      211: /* Thumb return addresses have the low bit set, so we need to subtract two.
        !           212:    This is still safe in ARM mode because instructions are 4 bytes.  */
        !           213: # define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2))
1.1.1.5   root      214: #else
1.1.1.6 ! root      215: # define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1))
1.1       root      216: #endif
                    217: 
                    218: #endif /* !defined(__DYNGEN_EXEC_H__) */

unix.superglobalmegacorp.com