swap.h revision 5679752bf24c21135884e987c4077e2f7184897
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// 345679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define UINT8_TO_BYTE_ARRAY(i, b) ((b)[0] = (BYTE)(i), i) 355679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define UINT16_TO_BYTE_ARRAY(i, b) ((b)[0] = (BYTE)((i) >> 8), \ 365679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[1] = (BYTE) (i), \ 375679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (i)) 385679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define UINT32_TO_BYTE_ARRAY(i, b) ((b)[0] = (BYTE)((i) >> 24), \ 395679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[1] = (BYTE)((i) >> 16), \ 405679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[2] = (BYTE)((i) >> 8), \ 415679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[3] = (BYTE) (i), \ 425679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (i)) 435679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define UINT64_TO_BYTE_ARRAY(i, b) ((b)[0] = (BYTE)((i) >> 56), \ 445679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[1] = (BYTE)((i) >> 48), \ 455679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[2] = (BYTE)((i) >> 40), \ 465679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[3] = (BYTE)((i) >> 32), \ 475679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[4] = (BYTE)((i) >> 24), \ 485679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[5] = (BYTE)((i) >> 16), \ 495679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[6] = (BYTE)((i) >> 8), \ 505679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (b)[7] = (BYTE) (i), \ 515679752bf24c21135884e987c4077e2f7184897Vadim Bendebury (i)) 525679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#else 535679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// 545679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// the big-endian macros for machines that allow unaligned memory access Aggregate a byte array into a 555679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// UINT 565679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// 575679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define BYTE_ARRAY_TO_UINT8(b) *((UINT8 *)(b)) 585679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define BYTE_ARRAY_TO_UINT16(b) *((UINT16 *)(b)) 595679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define BYTE_ARRAY_TO_UINT32(b) *((UINT32 *)(b)) 605679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define BYTE_ARRAY_TO_UINT64(b) *((UINT64 *)(b)) 615679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// 625679752bf24c21135884e987c4077e2f7184897Vadim Bendebury// Disaggregate a UINT into a byte array 635679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define UINT8_TO_BYTE_ARRAY(i, b) (*((UINT8 *)(b)) = (i)) 645679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define UINT16_TO_BYTE_ARRAY(i, b) (*((UINT16 *)(b)) = (i)) 655679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define UINT32_TO_BYTE_ARRAY(i, b) (*((UINT32 *)(b)) = (i)) 665679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#define UINT64_TO_BYTE_ARRAY(i, b) (*((UINT64 *)(b)) = (i)) 675679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#endif // NO_AUTO_ALIGN == YES 685679752bf24c21135884e987c4077e2f7184897Vadim Bendebury#endif // _SWAP_H 69