linux.cc revision 11383:5ac090acd180
1/*
2 * Copyright (c) 2007 The Hewlett-Packard Development Company
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder.  You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions are
16 * met: redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer;
18 * redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution;
21 * neither the name of the copyright holders nor the names of its
22 * contributors may be used to endorse or promote products derived from
23 * this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 *
37 * Authors: Gabe Black
38 */
39
40#include "arch/x86/linux/linux.hh"
41
42#include <fcntl.h>
43#include <sys/mman.h>
44
45// open(2) flags translation table
46SyscallFlagTransTable X86Linux64::openFlagTable[] = {
47#ifdef _MSC_VER
48  { X86Linux64::TGT_O_RDONLY,    _O_RDONLY },
49  { X86Linux64::TGT_O_WRONLY,    _O_WRONLY },
50  { X86Linux64::TGT_O_RDWR,      _O_RDWR },
51  { X86Linux64::TGT_O_CREAT,     _O_CREAT },
52  { X86Linux64::TGT_O_EXCL,      _O_EXCL },
53#ifdef _O_NOCTTY
54  { X86Linux64::TGT_O_NOCTTY,    _O_NOCTTY },
55#endif
56  { X86Linux64::TGT_O_TRUNC,     _O_TRUNC },
57  { X86Linux64::TGT_O_APPEND,    _O_APPEND },
58#ifdef _O_NONBLOCK
59  { X86Linux64::TGT_O_NONBLOCK,  _O_NONBLOCK },
60#endif
61#ifdef _O_DSYNC
62  { X86Linux64::TGT_O_DSYNC ,    _O_DSYNC },
63#endif
64  { X86Linux64::TGT_FASYNC,      _O_ASYNC },
65  { X86Linux64::TGT_O_DIRECT,    _O_DIRECT },
66  { X86Linux64::TGT_O_LARGEFILE, _O_LARGEFILE },
67  { X86Linux64::TGT_O_DIRECTORY, _O_DIRECTORY },
68  { X86Linux64::TGT_O_NOFOLLOW,  _O_NOFOLLOW },
69  { X86Linux64::TGT_O_NOATIME,   _O_NOATIME },
70#ifdef _O_CLOEXEC
71  { X86Linux64::TGT_O_CLOEXEC,   _O_CLOEXEC },
72#endif
73#ifdef _O_SYNC
74  { X86Linux64::TGT_O_SYNC,      _O_SYNC },
75#endif
76#ifdef _O_PATH
77  { X86Linux64::TGT_O_PATH ,     _O_PATH },
78#endif
79#else /* !_MSC_VER */
80  { X86Linux64::TGT_O_RDONLY,    O_RDONLY },
81  { X86Linux64::TGT_O_WRONLY,    O_WRONLY },
82  { X86Linux64::TGT_O_RDWR,      O_RDWR },
83  { X86Linux64::TGT_O_CREAT,     O_CREAT },
84  { X86Linux64::TGT_O_EXCL,      O_EXCL },
85  { X86Linux64::TGT_O_NOCTTY,    O_NOCTTY },
86  { X86Linux64::TGT_O_TRUNC,     O_TRUNC },
87  { X86Linux64::TGT_O_APPEND,    O_APPEND },
88  { X86Linux64::TGT_O_NONBLOCK,  O_NONBLOCK },
89#ifdef O_DSYNC
90  { X86Linux64::TGT_O_DSYNC,     O_DSYNC },
91#endif
92  { X86Linux64::TGT_FASYNC,      O_ASYNC },
93  { X86Linux64::TGT_O_DIRECT,    O_DIRECT },
94  { X86Linux64::TGT_O_LARGEFILE, O_LARGEFILE },
95  { X86Linux64::TGT_O_DIRECTORY, O_DIRECTORY },
96  { X86Linux64::TGT_O_NOFOLLOW,  O_NOFOLLOW },
97  { X86Linux64::TGT_O_NOATIME,   O_NOATIME },
98#ifdef O_CLOEXEC
99  { X86Linux64::TGT_O_CLOEXEC,   O_CLOEXEC },
100#endif
101#ifdef O_SYNC
102  { X86Linux64::TGT_O_SYNC,      O_SYNC },
103#endif
104#ifdef O_PATH
105  { X86Linux64::TGT_O_PATH,      O_PATH },
106#endif
107#endif /* _MSC_VER */
108};
109
110const int X86Linux64::NUM_OPEN_FLAGS =
111        sizeof(X86Linux64::openFlagTable) /
112        sizeof(X86Linux64::openFlagTable[0]);
113
114// mmap(2) flags translation table
115SyscallFlagTransTable X86Linux64::mmapFlagTable[] = {
116  { X86Linux64::TGT_MAP_SHARED,     MAP_SHARED },
117  { X86Linux64::TGT_MAP_PRIVATE,    MAP_PRIVATE },
118  { X86Linux64::TGT_MAP_32BIT,      MAP_32BIT},
119  { X86Linux64::TGT_MAP_ANON,       MAP_ANON },
120  { X86Linux64::TGT_MAP_DENYWRITE,  MAP_DENYWRITE },
121  { X86Linux64::TGT_MAP_EXECUTABLE, MAP_EXECUTABLE },
122  { X86Linux64::TGT_MAP_FILE,       MAP_FILE },
123  { X86Linux64::TGT_MAP_GROWSDOWN,  MAP_GROWSDOWN },
124#ifdef MAP_HUGETLB
125  { X86Linux64::TGT_MAP_HUGETLB,    MAP_HUGETLB },
126#endif
127  { X86Linux64::TGT_MAP_LOCKED,     MAP_LOCKED },
128  { X86Linux64::TGT_MAP_NONBLOCK,   MAP_NONBLOCK },
129  { X86Linux64::TGT_MAP_NORESERVE,  MAP_NORESERVE },
130  { X86Linux64::TGT_MAP_POPULATE,   MAP_POPULATE },
131#ifdef MAP_STACK
132  { X86Linux64::TGT_MAP_STACK,      MAP_STACK },
133#endif
134  { X86Linux64::TGT_MAP_ANONYMOUS,  MAP_ANONYMOUS },
135  { X86Linux64::TGT_MAP_FIXED,      MAP_FIXED },
136};
137
138const unsigned X86Linux64::NUM_MMAP_FLAGS =
139        sizeof(X86Linux64::mmapFlagTable) /
140        sizeof(X86Linux64::mmapFlagTable[0]);
141
142// open(2) flags translation table
143SyscallFlagTransTable X86Linux32::openFlagTable[] = {
144#ifdef _MSC_VER
145  { X86Linux32::TGT_O_RDONLY,    _O_RDONLY },
146  { X86Linux32::TGT_O_WRONLY,    _O_WRONLY },
147  { X86Linux32::TGT_O_RDWR,      _O_RDWR },
148  { X86Linux32::TGT_O_CREAT,     _O_CREAT },
149  { X86Linux32::TGT_O_EXCL,      _O_EXCL },
150#ifdef _O_NOCTTY
151  { X86Linux32::TGT_O_NOCTTY,    _O_NOCTTY },
152#endif
153  { X86Linux32::TGT_O_TRUNC,     _O_TRUNC },
154  { X86Linux32::TGT_O_APPEND,    _O_APPEND },
155#ifdef _O_NONBLOCK
156  { X86Linux32::TGT_O_NONBLOCK,  _O_NONBLOCK },
157#endif
158#ifdef O_DSYNC
159  { X86Linux32::TGT_O_DSYNC,     _O_DSYNC },
160#endif
161  { X86Linux32::TGT_FASYNC,      _O_ASYNC },
162  { X86Linux32::TGT_O_DIRECT,    _O_DIRECT },
163  { X86Linux32::TGT_O_LARGEFILE, _O_LARGEFILE },
164  { X86Linux32::TGT_O_DIRECTORY, _O_DIRECTORY },
165  { X86Linux32::TGT_O_NOFOLLOW,  _O_NOFOLLOW },
166  { X86Linux32::TGT_O_NOATIME,   _O_NOATIME },
167#ifdef _O_CLOEXEC
168  { X86Linux32::TGT_O_CLOEXEC,   _O_CLOEXEC },
169#endif
170#ifdef _O_SYNC
171  { X86Linux32::TGT_O_SYNC,      _O_SYNC },
172#endif
173#ifdef _O_PATH
174  { X86Linux32::TGT_O_PATH,      _O_PATH },
175#endif
176#else /* !_MSC_VER */
177  { X86Linux32::TGT_O_RDONLY,    O_RDONLY },
178  { X86Linux32::TGT_O_WRONLY,    O_WRONLY },
179  { X86Linux32::TGT_O_RDWR,      O_RDWR },
180  { X86Linux32::TGT_O_CREAT,     O_CREAT },
181  { X86Linux32::TGT_O_EXCL,      O_EXCL },
182  { X86Linux32::TGT_O_NOCTTY,    O_NOCTTY },
183  { X86Linux32::TGT_O_TRUNC,     O_TRUNC },
184  { X86Linux32::TGT_O_APPEND,    O_APPEND },
185  { X86Linux32::TGT_O_NONBLOCK,  O_NONBLOCK },
186#ifdef O_DSYNC
187  { X86Linux32::TGT_O_DSYNC,     O_DSYNC },
188#endif
189  { X86Linux32::TGT_FASYNC,      O_ASYNC },
190  { X86Linux32::TGT_O_DIRECT,    O_DIRECT },
191  { X86Linux32::TGT_O_LARGEFILE, O_LARGEFILE },
192  { X86Linux32::TGT_O_DIRECTORY, O_DIRECTORY },
193  { X86Linux32::TGT_O_NOFOLLOW,  O_NOFOLLOW },
194  { X86Linux32::TGT_O_NOATIME,   O_NOATIME },
195#ifdef O_CLOEXEC
196  { X86Linux32::TGT_O_CLOEXEC,   O_CLOEXEC },
197#endif
198#ifdef O_SYNC
199  { X86Linux32::TGT_O_SYNC,      O_SYNC },
200#endif
201#ifdef O_PATH
202  { X86Linux32::TGT_O_PATH,      O_PATH },
203#endif
204#endif /* _MSC_VER */
205};
206
207const int X86Linux32::NUM_OPEN_FLAGS =
208        sizeof(X86Linux32::openFlagTable) /
209        sizeof(X86Linux32::openFlagTable[0]);
210
211// mmap(2) flags translation table
212SyscallFlagTransTable X86Linux32::mmapFlagTable[] = {
213  { X86Linux32::TGT_MAP_SHARED,     MAP_SHARED },
214  { X86Linux32::TGT_MAP_PRIVATE,    MAP_PRIVATE },
215  { X86Linux32::TGT_MAP_32BIT,      MAP_32BIT},
216  { X86Linux32::TGT_MAP_ANON,       MAP_ANON },
217  { X86Linux32::TGT_MAP_DENYWRITE,  MAP_DENYWRITE },
218  { X86Linux32::TGT_MAP_EXECUTABLE, MAP_EXECUTABLE },
219  { X86Linux32::TGT_MAP_FILE,       MAP_FILE },
220  { X86Linux32::TGT_MAP_GROWSDOWN,  MAP_GROWSDOWN },
221#ifdef MAP_HUGETLB
222  { X86Linux32::TGT_MAP_HUGETLB,    MAP_HUGETLB },
223#endif
224  { X86Linux32::TGT_MAP_LOCKED,     MAP_LOCKED },
225  { X86Linux32::TGT_MAP_NONBLOCK,   MAP_NONBLOCK },
226  { X86Linux32::TGT_MAP_NORESERVE,  MAP_NORESERVE },
227  { X86Linux32::TGT_MAP_POPULATE,   MAP_POPULATE },
228#ifdef MAP_STACK
229  { X86Linux32::TGT_MAP_STACK,      MAP_STACK },
230#endif
231  { X86Linux32::TGT_MAP_ANONYMOUS,  MAP_ANONYMOUS },
232  { X86Linux32::TGT_MAP_FIXED,      MAP_FIXED },
233};
234
235const unsigned X86Linux32::NUM_MMAP_FLAGS =
236        sizeof(X86Linux32::mmapFlagTable) /
237        sizeof(X86Linux32::mmapFlagTable[0]);
238