]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - 6/contrib/gcc/config/s390/linux.h
merge fix for boot-time hang on centos' xen
[FreeBSD/FreeBSD.git] / 6 / contrib / gcc / config / s390 / linux.h
1 /* Definitions for Linux for S/390.
2    Copyright (C) 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
3    Contributed by Hartmut Penner (hpenner@de.ibm.com) and
4                   Ulrich Weigand (uweigand@de.ibm.com).
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING.  If not, write to the Free
20 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
21 02111-1307, USA.  */
22
23 #ifndef _LINUX_H
24 #define _LINUX_H
25
26 /* Target specific version string.  */
27
28 #ifdef DEFAULT_TARGET_64BIT
29 #undef  TARGET_VERSION
30 #define TARGET_VERSION fprintf (stderr, " (Linux for zSeries)");
31 #else
32 #undef  TARGET_VERSION
33 #define TARGET_VERSION fprintf (stderr, " (Linux for S/390)");
34 #endif
35
36
37 /* Target specific type definitions.  */
38
39 /* ??? Do we really want long as size_t on 31-bit?  */
40 #undef  SIZE_TYPE
41 #define SIZE_TYPE (TARGET_64BIT ? "long unsigned int" : "long unsigned int")
42 #undef  PTRDIFF_TYPE
43 #define PTRDIFF_TYPE (TARGET_64BIT ? "long int" : "int")
44
45 #undef  WCHAR_TYPE
46 #define WCHAR_TYPE "int"
47 #undef  WCHAR_TYPE_SIZE
48 #define WCHAR_TYPE_SIZE 32
49
50
51 /* Target specific preprocessor settings.  */
52
53 #define TARGET_OS_CPP_BUILTINS()                \
54   do                                            \
55     {                                           \
56       LINUX_TARGET_OS_CPP_BUILTINS();           \
57       if (flag_pic)                             \
58         {                                       \
59           builtin_define ("__PIC__");           \
60           builtin_define ("__pic__");           \
61         }                                       \
62     }                                           \
63   while (0)
64
65
66 /* Target specific assembler settings.  */
67
68 #undef  ASM_SPEC
69 #define ASM_SPEC "%{m31&m64}%{mesa&mzarch}%{march=*}"
70
71
72 /* Target specific linker settings.  */
73
74 #ifdef DEFAULT_TARGET_64BIT
75 #define MULTILIB_DEFAULTS { "m64" }
76 #else
77 #define MULTILIB_DEFAULTS { "m31" }
78 #endif
79
80 #undef  LINK_SPEC
81 #define LINK_SPEC \
82   "%{m31:-m elf_s390}%{m64:-m elf64_s390} \
83    %{shared:-shared} \
84    %{!shared: \
85       %{static:-static} \
86       %{!static: \
87         %{rdynamic:-export-dynamic} \
88         %{!dynamic-linker: \
89           %{m31:-dynamic-linker /lib/ld.so.1} \
90           %{m64:-dynamic-linker /lib/ld64.so.1}}}}"
91
92
93 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
94
95 /* Do code reading to identify a signal frame, and set the frame
96    state data appropriately.  See unwind-dw2.c for the structs.  */
97
98 #define MD_FALLBACK_FRAME_STATE_FOR(CONTEXT, FS, SUCCESS)               \
99   do {                                                                  \
100     unsigned char *pc_ = (CONTEXT)->ra;                                 \
101     long new_cfa_;                                                      \
102     int i_;                                                             \
103                                                                         \
104     typedef struct                                                      \
105       {                                                                 \
106         unsigned long psw_mask;                                         \
107         unsigned long psw_addr;                                         \
108         unsigned long gprs[16];                                         \
109         unsigned int  acrs[16];                                         \
110         unsigned int  fpc;                                              \
111         unsigned int  __pad;                                            \
112         double        fprs[16];                                         \
113       } __attribute__ ((__aligned__ (8))) sigregs_;                     \
114                                                                         \
115     sigregs_ *regs_;                                                    \
116                                                                         \
117     /* svc $__NR_sigreturn or svc $__NR_rt_sigreturn  */                \
118     if (pc_[0] != 0x0a || (pc_[1] != 119 && pc_[1] != 173))             \
119       break;                                                            \
120                                                                         \
121     /* New-style RT frame:                                              \
122         retcode + alignment (8 bytes)                                   \
123         siginfo (128 bytes)                                             \
124         ucontext (contains sigregs)  */                                 \
125     if ((CONTEXT)->ra == (CONTEXT)->cfa)                                \
126       {                                                                 \
127         struct ucontext_                                                \
128           {                                                             \
129             unsigned long     uc_flags;                                 \
130             struct ucontext_ *uc_link;                                  \
131             unsigned long     uc_stack[3];                              \
132             sigregs_          uc_mcontext;                              \
133           } *uc_ = (CONTEXT)->cfa + 8 + 128;                            \
134                                                                         \
135         regs_ = &uc_->uc_mcontext;                                      \
136       }                                                                 \
137                                                                         \
138     /* Old-style RT frame and all non-RT frames:                        \
139         old signal mask (8 bytes)                                       \
140         pointer to sigregs  */                                          \
141     else                                                                \
142       {                                                                 \
143         regs_ = *(sigregs_ **)((CONTEXT)->cfa + 8);                     \
144       }                                                                 \
145                                                                         \
146     new_cfa_ = regs_->gprs[15] + 16*sizeof(long) + 32;                  \
147     (FS)->cfa_how = CFA_REG_OFFSET;                                     \
148     (FS)->cfa_reg = 15;                                                 \
149     (FS)->cfa_offset =                                                  \
150       new_cfa_ - (long) (CONTEXT)->cfa + 16*sizeof(long) + 32;          \
151                                                                         \
152     for (i_ = 0; i_ < 16; i_++)                                         \
153       {                                                                 \
154         (FS)->regs.reg[i_].how = REG_SAVED_OFFSET;                      \
155         (FS)->regs.reg[i_].loc.offset =                                 \
156           (long)&regs_->gprs[i_] - new_cfa_;                            \
157       }                                                                 \
158     for (i_ = 0; i_ < 16; i_++)                                         \
159       {                                                                 \
160         (FS)->regs.reg[16+i_].how = REG_SAVED_OFFSET;                   \
161         (FS)->regs.reg[16+i_].loc.offset =                              \
162           (long)&regs_->fprs[i_] - new_cfa_;                            \
163       }                                                                 \
164                                                                         \
165     /* Load return addr from PSW into dummy register 32.  */            \
166     (FS)->regs.reg[32].how = REG_SAVED_OFFSET;                          \
167     (FS)->regs.reg[32].loc.offset = (long)&regs_->psw_addr - new_cfa_;  \
168     (FS)->retaddr_column = 32;                                          \
169                                                                         \
170     goto SUCCESS;                                                       \
171   } while (0)
172
173 #endif