cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

libc-compat.h (8304B)


      1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
      2/*
      3 * Compatibility interface for userspace libc header coordination:
      4 *
      5 * Define compatibility macros that are used to control the inclusion or
      6 * exclusion of UAPI structures and definitions in coordination with another
      7 * userspace C library.
      8 *
      9 * This header is intended to solve the problem of UAPI definitions that
     10 * conflict with userspace definitions. If a UAPI header has such conflicting
     11 * definitions then the solution is as follows:
     12 *
     13 * * Synchronize the UAPI header and the libc headers so either one can be
     14 *   used and such that the ABI is preserved. If this is not possible then
     15 *   no simple compatibility interface exists (you need to write translating
     16 *   wrappers and rename things) and you can't use this interface.
     17 *
     18 * Then follow this process:
     19 *
     20 * (a) Include libc-compat.h in the UAPI header.
     21 *      e.g. #include <linux/libc-compat.h>
     22 *     This include must be as early as possible.
     23 *
     24 * (b) In libc-compat.h add enough code to detect that the comflicting
     25 *     userspace libc header has been included first.
     26 *
     27 * (c) If the userspace libc header has been included first define a set of
     28 *     guard macros of the form __UAPI_DEF_FOO and set their values to 1, else
     29 *     set their values to 0.
     30 *
     31 * (d) Back in the UAPI header with the conflicting definitions, guard the
     32 *     definitions with:
     33 *     #if __UAPI_DEF_FOO
     34 *       ...
     35 *     #endif
     36 *
     37 * This fixes the situation where the linux headers are included *after* the
     38 * libc headers. To fix the problem with the inclusion in the other order the
     39 * userspace libc headers must be fixed like this:
     40 *
     41 * * For all definitions that conflict with kernel definitions wrap those
     42 *   defines in the following:
     43 *   #if !__UAPI_DEF_FOO
     44 *     ...
     45 *   #endif
     46 *
     47 * This prevents the redefinition of a construct already defined by the kernel.
     48 */
     49#ifndef _UAPI_LIBC_COMPAT_H
     50#define _UAPI_LIBC_COMPAT_H
     51
     52/* We have included glibc headers... */
     53#if defined(__GLIBC__)
     54
     55/* Coordinate with glibc net/if.h header. */
     56#if defined(_NET_IF_H) && defined(__USE_MISC)
     57
     58/* GLIBC headers included first so don't define anything
     59 * that would already be defined. */
     60
     61#define __UAPI_DEF_IF_IFCONF 0
     62#define __UAPI_DEF_IF_IFMAP 0
     63#define __UAPI_DEF_IF_IFNAMSIZ 0
     64#define __UAPI_DEF_IF_IFREQ 0
     65/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
     66#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 0
     67/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
     68#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
     69#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
     70#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
     71
     72#else /* _NET_IF_H */
     73
     74/* Linux headers included first, and we must define everything
     75 * we need. The expectation is that glibc will check the
     76 * __UAPI_DEF_* defines and adjust appropriately. */
     77
     78#define __UAPI_DEF_IF_IFCONF 1
     79#define __UAPI_DEF_IF_IFMAP 1
     80#define __UAPI_DEF_IF_IFNAMSIZ 1
     81#define __UAPI_DEF_IF_IFREQ 1
     82/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
     83#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1
     84/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
     85#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
     86
     87#endif /* _NET_IF_H */
     88
     89/* Coordinate with glibc netinet/in.h header. */
     90#if defined(_NETINET_IN_H)
     91
     92/* GLIBC headers included first so don't define anything
     93 * that would already be defined. */
     94#define __UAPI_DEF_IN_ADDR		0
     95#define __UAPI_DEF_IN_IPPROTO		0
     96#define __UAPI_DEF_IN_PKTINFO		0
     97#define __UAPI_DEF_IP_MREQ		0
     98#define __UAPI_DEF_SOCKADDR_IN		0
     99#define __UAPI_DEF_IN_CLASS		0
    100
    101#define __UAPI_DEF_IN6_ADDR		0
    102/* The exception is the in6_addr macros which must be defined
    103 * if the glibc code didn't define them. This guard matches
    104 * the guard in glibc/inet/netinet/in.h which defines the
    105 * additional in6_addr macros e.g. s6_addr16, and s6_addr32. */
    106#if defined(__USE_MISC) || defined (__USE_GNU)
    107#define __UAPI_DEF_IN6_ADDR_ALT		0
    108#else
    109#define __UAPI_DEF_IN6_ADDR_ALT		1
    110#endif
    111#define __UAPI_DEF_SOCKADDR_IN6		0
    112#define __UAPI_DEF_IPV6_MREQ		0
    113#define __UAPI_DEF_IPPROTO_V6		0
    114#define __UAPI_DEF_IPV6_OPTIONS		0
    115#define __UAPI_DEF_IN6_PKTINFO		0
    116#define __UAPI_DEF_IP6_MTUINFO		0
    117
    118#else
    119
    120/* Linux headers included first, and we must define everything
    121 * we need. The expectation is that glibc will check the
    122 * __UAPI_DEF_* defines and adjust appropriately. */
    123#define __UAPI_DEF_IN_ADDR		1
    124#define __UAPI_DEF_IN_IPPROTO		1
    125#define __UAPI_DEF_IN_PKTINFO		1
    126#define __UAPI_DEF_IP_MREQ		1
    127#define __UAPI_DEF_SOCKADDR_IN		1
    128#define __UAPI_DEF_IN_CLASS		1
    129
    130#define __UAPI_DEF_IN6_ADDR		1
    131/* We unconditionally define the in6_addr macros and glibc must
    132 * coordinate. */
    133#define __UAPI_DEF_IN6_ADDR_ALT		1
    134#define __UAPI_DEF_SOCKADDR_IN6		1
    135#define __UAPI_DEF_IPV6_MREQ		1
    136#define __UAPI_DEF_IPPROTO_V6		1
    137#define __UAPI_DEF_IPV6_OPTIONS		1
    138#define __UAPI_DEF_IN6_PKTINFO		1
    139#define __UAPI_DEF_IP6_MTUINFO		1
    140
    141#endif /* _NETINET_IN_H */
    142
    143/* Coordinate with glibc netipx/ipx.h header. */
    144#if defined(__NETIPX_IPX_H)
    145
    146#define __UAPI_DEF_SOCKADDR_IPX			0
    147#define __UAPI_DEF_IPX_ROUTE_DEFINITION		0
    148#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	0
    149#define __UAPI_DEF_IPX_CONFIG_DATA		0
    150#define __UAPI_DEF_IPX_ROUTE_DEF		0
    151
    152#else /* defined(__NETIPX_IPX_H) */
    153
    154#define __UAPI_DEF_SOCKADDR_IPX			1
    155#define __UAPI_DEF_IPX_ROUTE_DEFINITION		1
    156#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1
    157#define __UAPI_DEF_IPX_CONFIG_DATA		1
    158#define __UAPI_DEF_IPX_ROUTE_DEF		1
    159
    160#endif /* defined(__NETIPX_IPX_H) */
    161
    162/* Definitions for xattr.h */
    163#if defined(_SYS_XATTR_H)
    164#define __UAPI_DEF_XATTR		0
    165#else
    166#define __UAPI_DEF_XATTR		1
    167#endif
    168
    169/* If we did not see any headers from any supported C libraries,
    170 * or we are being included in the kernel, then define everything
    171 * that we need. Check for previous __UAPI_* definitions to give
    172 * unsupported C libraries a way to opt out of any kernel definition. */
    173#else /* !defined(__GLIBC__) */
    174
    175/* Definitions for if.h */
    176#ifndef __UAPI_DEF_IF_IFCONF
    177#define __UAPI_DEF_IF_IFCONF 1
    178#endif
    179#ifndef __UAPI_DEF_IF_IFMAP
    180#define __UAPI_DEF_IF_IFMAP 1
    181#endif
    182#ifndef __UAPI_DEF_IF_IFNAMSIZ
    183#define __UAPI_DEF_IF_IFNAMSIZ 1
    184#endif
    185#ifndef __UAPI_DEF_IF_IFREQ
    186#define __UAPI_DEF_IF_IFREQ 1
    187#endif
    188/* Everything up to IFF_DYNAMIC, matches net/if.h until glibc 2.23 */
    189#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS
    190#define __UAPI_DEF_IF_NET_DEVICE_FLAGS 1
    191#endif
    192/* For the future if glibc adds IFF_LOWER_UP, IFF_DORMANT and IFF_ECHO */
    193#ifndef __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO
    194#define __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO 1
    195#endif
    196
    197/* Definitions for in.h */
    198#ifndef __UAPI_DEF_IN_ADDR
    199#define __UAPI_DEF_IN_ADDR		1
    200#endif
    201#ifndef __UAPI_DEF_IN_IPPROTO
    202#define __UAPI_DEF_IN_IPPROTO		1
    203#endif
    204#ifndef __UAPI_DEF_IN_PKTINFO
    205#define __UAPI_DEF_IN_PKTINFO		1
    206#endif
    207#ifndef __UAPI_DEF_IP_MREQ
    208#define __UAPI_DEF_IP_MREQ		1
    209#endif
    210#ifndef __UAPI_DEF_SOCKADDR_IN
    211#define __UAPI_DEF_SOCKADDR_IN		1
    212#endif
    213#ifndef __UAPI_DEF_IN_CLASS
    214#define __UAPI_DEF_IN_CLASS		1
    215#endif
    216
    217/* Definitions for in6.h */
    218#ifndef __UAPI_DEF_IN6_ADDR
    219#define __UAPI_DEF_IN6_ADDR		1
    220#endif
    221#ifndef __UAPI_DEF_IN6_ADDR_ALT
    222#define __UAPI_DEF_IN6_ADDR_ALT		1
    223#endif
    224#ifndef __UAPI_DEF_SOCKADDR_IN6
    225#define __UAPI_DEF_SOCKADDR_IN6		1
    226#endif
    227#ifndef __UAPI_DEF_IPV6_MREQ
    228#define __UAPI_DEF_IPV6_MREQ		1
    229#endif
    230#ifndef __UAPI_DEF_IPPROTO_V6
    231#define __UAPI_DEF_IPPROTO_V6		1
    232#endif
    233#ifndef __UAPI_DEF_IPV6_OPTIONS
    234#define __UAPI_DEF_IPV6_OPTIONS		1
    235#endif
    236#ifndef __UAPI_DEF_IN6_PKTINFO
    237#define __UAPI_DEF_IN6_PKTINFO		1
    238#endif
    239#ifndef __UAPI_DEF_IP6_MTUINFO
    240#define __UAPI_DEF_IP6_MTUINFO		1
    241#endif
    242
    243/* Definitions for ipx.h */
    244#ifndef __UAPI_DEF_SOCKADDR_IPX
    245#define __UAPI_DEF_SOCKADDR_IPX			1
    246#endif
    247#ifndef __UAPI_DEF_IPX_ROUTE_DEFINITION
    248#define __UAPI_DEF_IPX_ROUTE_DEFINITION		1
    249#endif
    250#ifndef __UAPI_DEF_IPX_INTERFACE_DEFINITION
    251#define __UAPI_DEF_IPX_INTERFACE_DEFINITION	1
    252#endif
    253#ifndef __UAPI_DEF_IPX_CONFIG_DATA
    254#define __UAPI_DEF_IPX_CONFIG_DATA		1
    255#endif
    256#ifndef __UAPI_DEF_IPX_ROUTE_DEF
    257#define __UAPI_DEF_IPX_ROUTE_DEF		1
    258#endif
    259
    260/* Definitions for xattr.h */
    261#ifndef __UAPI_DEF_XATTR
    262#define __UAPI_DEF_XATTR		1
    263#endif
    264
    265#endif /* __GLIBC__ */
    266
    267#endif /* _UAPI_LIBC_COMPAT_H */