1353944Sdim//===-- sanitizer_platform_limits_linux.cpp -------------------------------===// 2353944Sdim// 3353944Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353944Sdim// See https://llvm.org/LICENSE.txt for license information. 5353944Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6353944Sdim// 7353944Sdim//===----------------------------------------------------------------------===// 8353944Sdim// 9353944Sdim// This file is a part of Sanitizer common code. 10353944Sdim// 11353944Sdim// Sizes and layouts of linux kernel data structures. 12353944Sdim//===----------------------------------------------------------------------===// 13353944Sdim 14353944Sdim// This is a separate compilation unit for linux headers that conflict with 15353944Sdim// userspace headers. 16353944Sdim// Most "normal" includes go in sanitizer_platform_limits_posix.cpp 17353944Sdim 18353944Sdim#include "sanitizer_platform.h" 19353944Sdim#if SANITIZER_LINUX 20353944Sdim 21353944Sdim#include "sanitizer_internal_defs.h" 22353944Sdim#include "sanitizer_platform_limits_posix.h" 23353944Sdim 24353944Sdim// For offsetof -> __builtin_offsetof definition. 25353944Sdim#include <stddef.h> 26353944Sdim 27353944Sdim// With old kernels (and even new kernels on powerpc) asm/stat.h uses types that 28353944Sdim// are not defined anywhere in userspace headers. Fake them. This seems to work 29353944Sdim// fine with newer headers, too. 30353944Sdim#include <linux/posix_types.h> 31353944Sdim#if defined(__x86_64__) || defined(__mips__) 32353944Sdim#include <sys/stat.h> 33353944Sdim#else 34353944Sdim#define ino_t __kernel_ino_t 35353944Sdim#define mode_t __kernel_mode_t 36353944Sdim#define nlink_t __kernel_nlink_t 37353944Sdim#define uid_t __kernel_uid_t 38353944Sdim#define gid_t __kernel_gid_t 39353944Sdim#define off_t __kernel_off_t 40353944Sdim#define time_t __kernel_time_t 41353944Sdim// This header seems to contain the definitions of _kernel_ stat* structs. 42353944Sdim#include <asm/stat.h> 43353944Sdim#undef ino_t 44353944Sdim#undef mode_t 45353944Sdim#undef nlink_t 46353944Sdim#undef uid_t 47353944Sdim#undef gid_t 48353944Sdim#undef off_t 49353944Sdim#endif 50353944Sdim 51353944Sdim#include <linux/aio_abi.h> 52353944Sdim 53353944Sdim#if !SANITIZER_ANDROID 54353944Sdim#include <sys/statfs.h> 55353944Sdim#include <linux/perf_event.h> 56353944Sdim#endif 57353944Sdim 58353944Sdimusing namespace __sanitizer; 59353944Sdim 60353944Sdimnamespace __sanitizer { 61353944Sdim#if !SANITIZER_ANDROID 62353944Sdim unsigned struct_statfs64_sz = sizeof(struct statfs64); 63353944Sdim#endif 64353944Sdim} // namespace __sanitizer 65353944Sdim 66353944Sdim#if !defined(__powerpc64__) && !defined(__x86_64__) && !defined(__aarch64__)\ 67353944Sdim && !defined(__mips__) && !defined(__s390__)\ 68357095Sdim && !defined(__sparc__) && !defined(__riscv) 69353944SdimCOMPILER_CHECK(struct___old_kernel_stat_sz == sizeof(struct __old_kernel_stat)); 70353944Sdim#endif 71353944Sdim 72353944SdimCOMPILER_CHECK(struct_kernel_stat_sz == sizeof(struct stat)); 73353944Sdim 74353944Sdim#if defined(__i386__) 75353944SdimCOMPILER_CHECK(struct_kernel_stat64_sz == sizeof(struct stat64)); 76353944Sdim#endif 77353944Sdim 78353944SdimCHECK_TYPE_SIZE(io_event); 79353944SdimCHECK_SIZE_AND_OFFSET(io_event, data); 80353944SdimCHECK_SIZE_AND_OFFSET(io_event, obj); 81353944SdimCHECK_SIZE_AND_OFFSET(io_event, res); 82353944SdimCHECK_SIZE_AND_OFFSET(io_event, res2); 83353944Sdim 84353944Sdim#if !SANITIZER_ANDROID 85353944SdimCOMPILER_CHECK(sizeof(struct __sanitizer_perf_event_attr) <= 86353944Sdim sizeof(struct perf_event_attr)); 87353944SdimCHECK_SIZE_AND_OFFSET(perf_event_attr, type); 88353944SdimCHECK_SIZE_AND_OFFSET(perf_event_attr, size); 89353944Sdim#endif 90353944Sdim 91353944SdimCOMPILER_CHECK(iocb_cmd_pread == IOCB_CMD_PREAD); 92353944SdimCOMPILER_CHECK(iocb_cmd_pwrite == IOCB_CMD_PWRITE); 93353944Sdim#if !SANITIZER_ANDROID 94353944SdimCOMPILER_CHECK(iocb_cmd_preadv == IOCB_CMD_PREADV); 95353944SdimCOMPILER_CHECK(iocb_cmd_pwritev == IOCB_CMD_PWRITEV); 96353944Sdim#endif 97353944Sdim 98353944SdimCHECK_TYPE_SIZE(iocb); 99353944SdimCHECK_SIZE_AND_OFFSET(iocb, aio_data); 100353944Sdim// Skip aio_key, it's weird. 101353944SdimCHECK_SIZE_AND_OFFSET(iocb, aio_lio_opcode); 102353944SdimCHECK_SIZE_AND_OFFSET(iocb, aio_reqprio); 103353944SdimCHECK_SIZE_AND_OFFSET(iocb, aio_fildes); 104353944SdimCHECK_SIZE_AND_OFFSET(iocb, aio_buf); 105353944SdimCHECK_SIZE_AND_OFFSET(iocb, aio_nbytes); 106353944SdimCHECK_SIZE_AND_OFFSET(iocb, aio_offset); 107353944Sdim 108353944Sdim#endif // SANITIZER_LINUX 109