blob: b27b46c4c066e0de3e9fec100f07a0d8dcf8004b [file] [log] [blame]
Vadim Bendebury56797522015-05-20 10:32:25 -07001// 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//
Vadim Bendebury99e88832015-06-04 20:32:54 -070034#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);}
Vadim Bendebury56797522015-05-20 10:32:25 -070049#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