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