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