15679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// This file was extracted from the TCG Published
25679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Trusted Platform Module Library
35679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Part 4: Supporting Routines
45679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Family "2.0"
55679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Level 00 Revision 01.16
65679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// October 30, 2014
75679752bf24c21135884e987c4077e2f7184897Vadim Bendebury
85679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#ifndef _SWAP_H
95679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define _SWAP_H
105679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#include "Implementation.h"
115679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#if    NO_AUTO_ALIGN == YES || LITTLE_ENDIAN_TPM == YES
125679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
135679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     The aggregation macros for machines that do not allow unaligned access or for little-endian machines.
145679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     Aggregate bytes into an UINT
155679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
165679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define BYTE_ARRAY_TO_UINT8(b)          (UINT8)((b)[0])
175679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define BYTE_ARRAY_TO_UINT16(b)         (UINT16)( ((b)[0] << 8) \
185679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + (b)[1])
195679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define BYTE_ARRAY_TO_UINT32(b)         (UINT32)( ((b)[0] << 24) \
205679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + ((b)[1] << 16) \
215679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + ((b)[2] << 8 ) \
225679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + (b)[3])
235679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define BYTE_ARRAY_TO_UINT64(b)         (UINT64)( ((UINT64)(b)[0] <<       56)   \
245679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + ((UINT64)(b)[1] <<      48)   \
255679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + ((UINT64)(b)[2] <<      40)   \
265679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + ((UINT64)(b)[3] <<      32)   \
275679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + ((UINT64)(b)[4] <<      24)   \
285679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + ((UINT64)(b)[5] <<      16)   \
295679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + ((UINT64)(b)[6] <<       8)   \
305679752bf24c21135884e987c4077e2f7184897Vadim Bendebury                                                + (UINT64)(b)[7])
315679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
325679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     Disaggregate a UINT into a byte array
335679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
3499e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury#define UINT8_TO_BYTE_ARRAY(i, b)           {(b)[0]   = (BYTE)(i);}
3599e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury#define UINT16_TO_BYTE_ARRAY(i, b)          {(b)[0]   = (BYTE)((i) >>   8); \
3699e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[1]   = (BYTE) (i);}
3799e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury#define UINT32_TO_BYTE_ARRAY(i, b)          {(b)[0]   = (BYTE)((i) >> 24);  \
3899e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[1]   = (BYTE)((i) >> 16);  \
3999e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[2]   = (BYTE)((i) >> 8);   \
4099e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[3]   = (BYTE) (i);}
4199e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury#define UINT64_TO_BYTE_ARRAY(i, b)          {(b)[0]   = (BYTE)((i) >>  56); \
4299e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[1]   = (BYTE)((i) >>  48); \
4399e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[2]   = (BYTE)((i) >>  40); \
4499e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[3]   = (BYTE)((i) >>  32); \
4599e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[4]   = (BYTE)((i) >>  24); \
4699e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[5]   = (BYTE)((i) >>  16); \
4799e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[6]   = (BYTE)((i) >>   8); \
4899e88835efdddfb4e01ebfe07f668379d64dda64Vadim Bendebury                                             (b)[7]   = (BYTE) (i);}
495679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#else
505679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
515679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     the big-endian macros for machines that allow unaligned memory access Aggregate a byte array into a
525679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     UINT
535679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
545679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define   BYTE_ARRAY_TO_UINT8(b)            *((UINT8      *)(b))
555679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define   BYTE_ARRAY_TO_UINT16(b)           *((UINT16     *)(b))
565679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define   BYTE_ARRAY_TO_UINT32(b)           *((UINT32     *)(b))
575679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define   BYTE_ARRAY_TO_UINT64(b)           *((UINT64     *)(b))
585679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//
595679752bf24c21135884e987c4077e2f7184897Vadim Bendebury//     Disaggregate a UINT into a byte array
605679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define   UINT8_TO_BYTE_ARRAY(i, b)      (*((UINT8    *)(b))   =   (i))
615679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define   UINT16_TO_BYTE_ARRAY(i, b)     (*((UINT16   *)(b))   =   (i))
625679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define   UINT32_TO_BYTE_ARRAY(i, b)     (*((UINT32   *)(b))   =   (i))
635679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define   UINT64_TO_BYTE_ARRAY(i, b)     (*((UINT64   *)(b))   =   (i))
645679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#endif    // NO_AUTO_ALIGN == YES
655679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#endif    // _SWAP_H
66