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