1*c2e0c6b5SAndroid Build Coastguard Worker /* 2*c2e0c6b5SAndroid Build Coastguard Worker * The PCI Library -- System-Dependent Stuff 3*c2e0c6b5SAndroid Build Coastguard Worker * 4*c2e0c6b5SAndroid Build Coastguard Worker * Copyright (c) 1997--2020 Martin Mares <[email protected]> 5*c2e0c6b5SAndroid Build Coastguard Worker * 6*c2e0c6b5SAndroid Build Coastguard Worker * Can be freely distributed and used under the terms of the GNU GPL v2+ 7*c2e0c6b5SAndroid Build Coastguard Worker * 8*c2e0c6b5SAndroid Build Coastguard Worker * SPDX-License-Identifier: GPL-2.0-or-later 9*c2e0c6b5SAndroid Build Coastguard Worker */ 10*c2e0c6b5SAndroid Build Coastguard Worker 11*c2e0c6b5SAndroid Build Coastguard Worker #ifdef __GNUC__ 12*c2e0c6b5SAndroid Build Coastguard Worker #define UNUSED __attribute__((unused)) 13*c2e0c6b5SAndroid Build Coastguard Worker #define NONRET __attribute__((noreturn)) 14*c2e0c6b5SAndroid Build Coastguard Worker #define FORMAT_CHECK(x,y,z) __attribute__((format(x,y,z))) 15*c2e0c6b5SAndroid Build Coastguard Worker #else 16*c2e0c6b5SAndroid Build Coastguard Worker #define UNUSED 17*c2e0c6b5SAndroid Build Coastguard Worker #define NONRET 18*c2e0c6b5SAndroid Build Coastguard Worker #define FORMAT_CHECK(x,y,z) 19*c2e0c6b5SAndroid Build Coastguard Worker #define inline 20*c2e0c6b5SAndroid Build Coastguard Worker #endif 21*c2e0c6b5SAndroid Build Coastguard Worker 22*c2e0c6b5SAndroid Build Coastguard Worker typedef u8 byte; 23*c2e0c6b5SAndroid Build Coastguard Worker typedef u16 word; 24*c2e0c6b5SAndroid Build Coastguard Worker 25*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_WINDOWS 26*c2e0c6b5SAndroid Build Coastguard Worker #define strcasecmp _strcmpi 27*c2e0c6b5SAndroid Build Coastguard Worker #define strncasecmp _strnicmp 28*c2e0c6b5SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER < 1800 29*c2e0c6b5SAndroid Build Coastguard Worker #if _MSC_VER < 1300 30*c2e0c6b5SAndroid Build Coastguard Worker #define strtoull strtoul 31*c2e0c6b5SAndroid Build Coastguard Worker #else 32*c2e0c6b5SAndroid Build Coastguard Worker #define strtoull _strtoui64 33*c2e0c6b5SAndroid Build Coastguard Worker #endif 34*c2e0c6b5SAndroid Build Coastguard Worker #endif 35*c2e0c6b5SAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER < 1900 36*c2e0c6b5SAndroid Build Coastguard Worker #define snprintf _snprintf 37*c2e0c6b5SAndroid Build Coastguard Worker #define vsnprintf _vsnprintf 38*c2e0c6b5SAndroid Build Coastguard Worker #endif 39*c2e0c6b5SAndroid Build Coastguard Worker #endif 40*c2e0c6b5SAndroid Build Coastguard Worker 41*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_HAVE_LINUX_BYTEORDER_H 42*c2e0c6b5SAndroid Build Coastguard Worker 43*c2e0c6b5SAndroid Build Coastguard Worker #include <asm/byteorder.h> 44*c2e0c6b5SAndroid Build Coastguard Worker #define cpu_to_le16 __cpu_to_le16 45*c2e0c6b5SAndroid Build Coastguard Worker #define cpu_to_le32 __cpu_to_le32 46*c2e0c6b5SAndroid Build Coastguard Worker #define le16_to_cpu __le16_to_cpu 47*c2e0c6b5SAndroid Build Coastguard Worker #define le32_to_cpu __le32_to_cpu 48*c2e0c6b5SAndroid Build Coastguard Worker 49*c2e0c6b5SAndroid Build Coastguard Worker #else 50*c2e0c6b5SAndroid Build Coastguard Worker 51*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_LINUX 52*c2e0c6b5SAndroid Build Coastguard Worker #include <endian.h> 53*c2e0c6b5SAndroid Build Coastguard Worker #define BYTE_ORDER __BYTE_ORDER 54*c2e0c6b5SAndroid Build Coastguard Worker #define BIG_ENDIAN __BIG_ENDIAN 55*c2e0c6b5SAndroid Build Coastguard Worker #endif 56*c2e0c6b5SAndroid Build Coastguard Worker 57*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_SUNOS 58*c2e0c6b5SAndroid Build Coastguard Worker #include <sys/byteorder.h> 59*c2e0c6b5SAndroid Build Coastguard Worker #if defined(__i386) && defined(LITTLE_ENDIAN) 60*c2e0c6b5SAndroid Build Coastguard Worker # define BYTE_ORDER LITTLE_ENDIAN 61*c2e0c6b5SAndroid Build Coastguard Worker #elif defined(__sparc) && defined(BIG_ENDIAN) 62*c2e0c6b5SAndroid Build Coastguard Worker # define BYTE_ORDER BIG_ENDIAN 63*c2e0c6b5SAndroid Build Coastguard Worker #else 64*c2e0c6b5SAndroid Build Coastguard Worker #define BIG_ENDIAN 4321 65*c2e0c6b5SAndroid Build Coastguard Worker #endif 66*c2e0c6b5SAndroid Build Coastguard Worker #ifndef BYTE_ORDER 67*c2e0c6b5SAndroid Build Coastguard Worker #ifdef _LITTLE_ENDIAN 68*c2e0c6b5SAndroid Build Coastguard Worker #define BYTE_ORDER 1234 69*c2e0c6b5SAndroid Build Coastguard Worker #else 70*c2e0c6b5SAndroid Build Coastguard Worker #define BYTE_ORDER 4321 71*c2e0c6b5SAndroid Build Coastguard Worker #endif 72*c2e0c6b5SAndroid Build Coastguard Worker #endif /* BYTE_ORDER */ 73*c2e0c6b5SAndroid Build Coastguard Worker #endif /* PCI_OS_SUNOS */ 74*c2e0c6b5SAndroid Build Coastguard Worker 75*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_WINDOWS 76*c2e0c6b5SAndroid Build Coastguard Worker #ifdef __MINGW32__ 77*c2e0c6b5SAndroid Build Coastguard Worker #include <sys/param.h> 78*c2e0c6b5SAndroid Build Coastguard Worker #else 79*c2e0c6b5SAndroid Build Coastguard Worker #include <io.h> 80*c2e0c6b5SAndroid Build Coastguard Worker #define BIG_ENDIAN 4321 81*c2e0c6b5SAndroid Build Coastguard Worker #define LITTLE_ENDIAN 1234 82*c2e0c6b5SAndroid Build Coastguard Worker #define BYTE_ORDER LITTLE_ENDIAN 83*c2e0c6b5SAndroid Build Coastguard Worker #endif 84*c2e0c6b5SAndroid Build Coastguard Worker #endif 85*c2e0c6b5SAndroid Build Coastguard Worker 86*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_HAIKU 87*c2e0c6b5SAndroid Build Coastguard Worker #include <endian.h> 88*c2e0c6b5SAndroid Build Coastguard Worker #endif 89*c2e0c6b5SAndroid Build Coastguard Worker 90*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_SYLIXOS 91*c2e0c6b5SAndroid Build Coastguard Worker #include <endian.h> 92*c2e0c6b5SAndroid Build Coastguard Worker #endif 93*c2e0c6b5SAndroid Build Coastguard Worker 94*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_DJGPP 95*c2e0c6b5SAndroid Build Coastguard Worker #define BIG_ENDIAN 4321 96*c2e0c6b5SAndroid Build Coastguard Worker #define LITTLE_ENDIAN 1234 97*c2e0c6b5SAndroid Build Coastguard Worker #define BYTE_ORDER LITTLE_ENDIAN 98*c2e0c6b5SAndroid Build Coastguard Worker #endif 99*c2e0c6b5SAndroid Build Coastguard Worker 100*c2e0c6b5SAndroid Build Coastguard Worker #ifdef PCI_OS_AMIGAOS 101*c2e0c6b5SAndroid Build Coastguard Worker #include <machine/endian.h> 102*c2e0c6b5SAndroid Build Coastguard Worker #endif 103*c2e0c6b5SAndroid Build Coastguard Worker 104*c2e0c6b5SAndroid Build Coastguard Worker #if !defined(BYTE_ORDER) 105*c2e0c6b5SAndroid Build Coastguard Worker #error "BYTE_ORDER not defined for your platform" 106*c2e0c6b5SAndroid Build Coastguard Worker #endif 107*c2e0c6b5SAndroid Build Coastguard Worker 108*c2e0c6b5SAndroid Build Coastguard Worker #if BYTE_ORDER == BIG_ENDIAN 109*c2e0c6b5SAndroid Build Coastguard Worker #define cpu_to_le16 swab16 110*c2e0c6b5SAndroid Build Coastguard Worker #define cpu_to_le32 swab32 111*c2e0c6b5SAndroid Build Coastguard Worker #define le16_to_cpu swab16 112*c2e0c6b5SAndroid Build Coastguard Worker #define le32_to_cpu swab32 113*c2e0c6b5SAndroid Build Coastguard Worker swab16(word w)114*c2e0c6b5SAndroid Build Coastguard Workerstatic inline word swab16(word w) 115*c2e0c6b5SAndroid Build Coastguard Worker { 116*c2e0c6b5SAndroid Build Coastguard Worker return (w << 8) | ((w >> 8) & 0xff); 117*c2e0c6b5SAndroid Build Coastguard Worker } 118*c2e0c6b5SAndroid Build Coastguard Worker swab32(u32 w)119*c2e0c6b5SAndroid Build Coastguard Workerstatic inline u32 swab32(u32 w) 120*c2e0c6b5SAndroid Build Coastguard Worker { 121*c2e0c6b5SAndroid Build Coastguard Worker return ((w & 0xff000000) >> 24) | 122*c2e0c6b5SAndroid Build Coastguard Worker ((w & 0x00ff0000) >> 8) | 123*c2e0c6b5SAndroid Build Coastguard Worker ((w & 0x0000ff00) << 8) | 124*c2e0c6b5SAndroid Build Coastguard Worker ((w & 0x000000ff) << 24); 125*c2e0c6b5SAndroid Build Coastguard Worker } 126*c2e0c6b5SAndroid Build Coastguard Worker #else 127*c2e0c6b5SAndroid Build Coastguard Worker #define cpu_to_le16(x) (x) 128*c2e0c6b5SAndroid Build Coastguard Worker #define cpu_to_le32(x) (x) 129*c2e0c6b5SAndroid Build Coastguard Worker #define le16_to_cpu(x) (x) 130*c2e0c6b5SAndroid Build Coastguard Worker #define le32_to_cpu(x) (x) 131*c2e0c6b5SAndroid Build Coastguard Worker #endif 132*c2e0c6b5SAndroid Build Coastguard Worker 133*c2e0c6b5SAndroid Build Coastguard Worker #endif 134