Provide helper macros for fields which represent pointers in kernel-userspace ABI. This facilitates handling of 32-bit user-space by 64-bit kernels by defining those fields as 32-bit 0-padding and 32-bit integer on 32-bit architectures, which allows the kernel to treat those as 64-bit integers. The order of padding and 32-bit integer depends on the endianness.
Showing the changes to include/uapi/linux (1 of 1 file). Show all
Unified · Split
| @@ -0,0 +1,50 @@ | ||
| 1 | +/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ | |
| 2 | +#ifndef _UAPI_LINUX_TYPES_32_64_H | |
| 3 | +#define _UAPI_LINUX_TYPES_32_64_H | |
| 4 | + | |
| 5 | +/* | |
| 6 | + * linux/types_32_64.h | |
| 7 | + * | |
| 8 | + * Integer type declaration for pointers across 32-bit and 64-bit systems. | |
| 9 | + * | |
| 10 | + * Copyright (c) 2015-2018 Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | |
| 11 | + */ | |
| 12 | + | |
| 13 | +#ifdef __KERNEL__ | |
| 14 | +# include <linux/types.h> | |
| 15 | +#else | |
| 16 | +# include <stdint.h> | |
| 17 | +#endif | |
| 18 | + | |
| 19 | +#include <asm/byteorder.h> | |
| 20 | + | |
| 21 | +#ifdef __BYTE_ORDER | |
| 22 | +# if (__BYTE_ORDER == __BIG_ENDIAN) | |
| 23 | +# define LINUX_BYTE_ORDER_BIG_ENDIAN | |
| 24 | +# else | |
| 25 | +# define LINUX_BYTE_ORDER_LITTLE_ENDIAN | |
| 26 | +# endif | |
| 27 | +#else | |
| 28 | +# ifdef __BIG_ENDIAN | |
| 29 | +# define LINUX_BYTE_ORDER_BIG_ENDIAN | |
| 30 | +# else | |
| 31 | +# define LINUX_BYTE_ORDER_LITTLE_ENDIAN | |
| 32 | +# endif | |
| 33 | +#endif | |
| 34 | + | |
| 35 | +#ifdef __LP64__ | |
| 36 | +# define LINUX_FIELD_u32_u64(field) __u64 field | |
| 37 | +# define LINUX_FIELD_u32_u64_INIT_ONSTACK(field, v) field = (intptr_t)v | |
| 38 | +#else | |
| 39 | +# ifdef LINUX_BYTE_ORDER_BIG_ENDIAN | |
| 40 | +# define LINUX_FIELD_u32_u64(field) __u32 field ## _padding, field | |
| 41 | +# define LINUX_FIELD_u32_u64_INIT_ONSTACK(field, v) \ | |
| 42 | + field ## _padding = 0, field = (intptr_t)v | |
| 43 | +# else | |
| 44 | +# define LINUX_FIELD_u32_u64(field) __u32 field, field ## _padding | |
| 45 | +# define LINUX_FIELD_u32_u64_INIT_ONSTACK(field, v) \ | |
| 46 | + field = (intptr_t)v, field ## _padding = 0 | |
| 47 | +# endif | |
| 48 | +#endif | |
| 49 | + | |
| 50 | +#endif /* _UAPI_LINUX_TYPES_32_64_H */ | |