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