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