1//===-- sanitizer_platform_limits_linux.cc --------------------------------===// 2// 3// This file is distributed under the University of Illinois Open Source 4// License. See LICENSE.TXT for details. 5// 6//===----------------------------------------------------------------------===// 7// 8// This file is a part of Sanitizer common code. 9// 10// Sizes and layouts of linux kernel data structures. 11//===----------------------------------------------------------------------===// 12 13// This is a separate compilation unit for linux headers that conflict with 14// userspace headers. 15// Most "normal" includes go in sanitizer_platform_limits_posix.cc 16 17#include "sanitizer_platform.h" 18#if SANITIZER_LINUX 19 20#include "sanitizer_internal_defs.h" 21#include "sanitizer_platform_limits_posix.h" 22 23// For offsetof -> __builtin_offsetof definition. 24#include <stddef.h> 25 26// With old kernels (and even new kernels on powerpc) asm/stat.h uses types that 27// are not defined anywhere in userspace headers. Fake them. This seems to work 28// fine with newer headers, too. Beware that with <sys/stat.h>, struct stat 29// takes the form of struct stat64 on 32-bit platforms if _FILE_OFFSET_BITS=64. 30// Also, for some platforms (e.g. mips) there are additional members in the 31// <sys/stat.h> struct stat:s. 32#include <linux/posix_types.h> 33#if defined(__x86_64__) 34#include <sys/stat.h> 35#else 36#define ino_t __kernel_ino_t 37#define mode_t __kernel_mode_t 38#define nlink_t __kernel_nlink_t 39#define uid_t __kernel_uid_t 40#define gid_t __kernel_gid_t 41#define off_t __kernel_off_t 42#define time_t __kernel_time_t 43// This header seems to contain the definitions of _kernel_ stat* structs. 44#include <asm/stat.h> 45#undef ino_t 46#undef mode_t 47#undef nlink_t 48#undef uid_t 49#undef gid_t 50#undef off_t 51#endif 52 53#include <linux/aio_abi.h> 54 55#if !SANITIZER_ANDROID 56#include <sys/statfs.h> 57#include <linux/perf_event.h> 58#endif 59 60using namespace __sanitizer; 61 62namespace __sanitizer { 63#if !SANITIZER_ANDROID 64 unsigned struct_statfs64_sz = sizeof(struct statfs64); 65#endif 66} // namespace __sanitizer 67 68#if !defined(__powerpc64__) && !defined(__x86_64__) && !defined(__aarch64__)\ 69 && !defined(__mips__) && !defined(__s390__)\ 70 && !defined(__sparc__) 71COMPILER_CHECK(struct___old_kernel_stat_sz == sizeof(struct __old_kernel_stat)); 72#endif 73 74COMPILER_CHECK(struct_kernel_stat_sz == sizeof(struct stat)); 75 76#if defined(__i386__) 77COMPILER_CHECK(struct_kernel_stat64_sz == sizeof(struct stat64)); 78#endif 79 80CHECK_TYPE_SIZE(io_event); 81CHECK_SIZE_AND_OFFSET(io_event, data); 82CHECK_SIZE_AND_OFFSET(io_event, obj); 83CHECK_SIZE_AND_OFFSET(io_event, res); 84CHECK_SIZE_AND_OFFSET(io_event, res2); 85 86#if !SANITIZER_ANDROID 87COMPILER_CHECK(sizeof(struct __sanitizer_perf_event_attr) <= 88 sizeof(struct perf_event_attr)); 89CHECK_SIZE_AND_OFFSET(perf_event_attr, type); 90CHECK_SIZE_AND_OFFSET(perf_event_attr, size); 91#endif 92 93COMPILER_CHECK(iocb_cmd_pread == IOCB_CMD_PREAD); 94COMPILER_CHECK(iocb_cmd_pwrite == IOCB_CMD_PWRITE); 95#if !SANITIZER_ANDROID 96COMPILER_CHECK(iocb_cmd_preadv == IOCB_CMD_PREADV); 97COMPILER_CHECK(iocb_cmd_pwritev == IOCB_CMD_PWRITEV); 98#endif 99 100CHECK_TYPE_SIZE(iocb); 101CHECK_SIZE_AND_OFFSET(iocb, aio_data); 102// Skip aio_key, it's weird. 103CHECK_SIZE_AND_OFFSET(iocb, aio_lio_opcode); 104CHECK_SIZE_AND_OFFSET(iocb, aio_reqprio); 105CHECK_SIZE_AND_OFFSET(iocb, aio_fildes); 106CHECK_SIZE_AND_OFFSET(iocb, aio_buf); 107CHECK_SIZE_AND_OFFSET(iocb, aio_nbytes); 108CHECK_SIZE_AND_OFFSET(iocb, aio_offset); 109 110#endif // SANITIZER_LINUX 111