1 // This file was extracted from the TCG Published
2 // Trusted Platform Module Library
3 // Part 4: Supporting Routines
4 // Family "2.0"
5 // Level 00 Revision 01.16
6 // October 30, 2014
7 
8 #ifndef _SWAP_H
9 #define _SWAP_H
10 #include "Implementation.h"
11 #if    NO_AUTO_ALIGN == YES || LITTLE_ENDIAN_TPM == YES
12 //
13 //     The aggregation macros for machines that do not allow unaligned access or for little-endian machines.
14 //     Aggregate bytes into an UINT
15 //
16 #define BYTE_ARRAY_TO_UINT8(b)          (UINT8)((b)[0])
17 #define BYTE_ARRAY_TO_UINT16(b)         (UINT16)( ((b)[0] << 8) \
18                                                 + (b)[1])
19 #define BYTE_ARRAY_TO_UINT32(b)         (UINT32)( ((b)[0] << 24) \
20                                                 + ((b)[1] << 16) \
21                                                 + ((b)[2] << 8 ) \
22                                                 + (b)[3])
23 #define BYTE_ARRAY_TO_UINT64(b)         (UINT64)( ((UINT64)(b)[0] <<       56)   \
24                                                 + ((UINT64)(b)[1] <<      48)   \
25                                                 + ((UINT64)(b)[2] <<      40)   \
26                                                 + ((UINT64)(b)[3] <<      32)   \
27                                                 + ((UINT64)(b)[4] <<      24)   \
28                                                 + ((UINT64)(b)[5] <<      16)   \
29                                                 + ((UINT64)(b)[6] <<       8)   \
30                                                 + (UINT64)(b)[7])
31 //
32 //     Disaggregate a UINT into a byte array
33 //
34 #define UINT8_TO_BYTE_ARRAY(i, b)           {(b)[0]   = (BYTE)(i);}
35 #define UINT16_TO_BYTE_ARRAY(i, b)          {(b)[0]   = (BYTE)((i) >>   8); \
36                                              (b)[1]   = (BYTE) (i);}
37 #define UINT32_TO_BYTE_ARRAY(i, b)          {(b)[0]   = (BYTE)((i) >> 24);  \
38                                              (b)[1]   = (BYTE)((i) >> 16);  \
39                                              (b)[2]   = (BYTE)((i) >> 8);   \
40                                              (b)[3]   = (BYTE) (i);}
41 #define UINT64_TO_BYTE_ARRAY(i, b)          {(b)[0]   = (BYTE)((i) >>  56); \
42                                              (b)[1]   = (BYTE)((i) >>  48); \
43                                              (b)[2]   = (BYTE)((i) >>  40); \
44                                              (b)[3]   = (BYTE)((i) >>  32); \
45                                              (b)[4]   = (BYTE)((i) >>  24); \
46                                              (b)[5]   = (BYTE)((i) >>  16); \
47                                              (b)[6]   = (BYTE)((i) >>   8); \
48                                              (b)[7]   = (BYTE) (i);}
49 #else
50 //
51 //     the big-endian macros for machines that allow unaligned memory access Aggregate a byte array into a
52 //     UINT
53 //
54 #define   BYTE_ARRAY_TO_UINT8(b)            *((UINT8      *)(b))
55 #define   BYTE_ARRAY_TO_UINT16(b)           *((UINT16     *)(b))
56 #define   BYTE_ARRAY_TO_UINT32(b)           *((UINT32     *)(b))
57 #define   BYTE_ARRAY_TO_UINT64(b)           *((UINT64     *)(b))
58 //
59 //     Disaggregate a UINT into a byte array
60 #define   UINT8_TO_BYTE_ARRAY(i, b)      (*((UINT8    *)(b))   =   (i))
61 #define   UINT16_TO_BYTE_ARRAY(i, b)     (*((UINT16   *)(b))   =   (i))
62 #define   UINT32_TO_BYTE_ARRAY(i, b)     (*((UINT32   *)(b))   =   (i))
63 #define   UINT64_TO_BYTE_ARRAY(i, b)     (*((UINT64   *)(b))   =   (i))
64 #endif    // NO_AUTO_ALIGN == YES
65 #endif    // _SWAP_H
66