diff --git a/src/Makefile.am b/src/Makefile.am index 81194549..5996bfb0 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -338,6 +338,8 @@ noinst_HEADERS += \ tpm2/CommandDispatcher_fp.h \ tpm2/Commit_fp.h \ tpm2/CompilerDependencies.h \ + tpm2/CompilerDependencies_gcc.h \ + tpm2/CompilerDependencies_msvc.h \ tpm2/ContextLoad_fp.h \ tpm2/ContextSave_fp.h \ tpm2/Context_spt_fp.h \ diff --git a/src/tpm2/CompilerDependencies.h b/src/tpm2/CompilerDependencies.h index 7d8c5074..e5fab0e1 100644 --- a/src/tpm2/CompilerDependencies.h +++ b/src/tpm2/CompilerDependencies.h @@ -65,109 +65,18 @@ #ifndef _COMPILER_DEPENDENCIES_H_ #define _COMPILER_DEPENDENCIES_H_ -/* kgold - Not in the original code. A user reported that it was required for a non-Visual Studio - environment. -*/ - -#ifdef TPM_WINDOWS -#include -#include -#endif - -/* 5.10 CompilerDependencies.h */ -#ifdef GCC -# undef _MSC_VER -# undef WIN32 -#endif - -#ifdef _MSC_VER - -// These definitions are for the Microsoft compiler Endian conversion for aligned structures -# define REVERSE_ENDIAN_16(_Number) _byteswap_ushort(_Number) -# define REVERSE_ENDIAN_32(_Number) _byteswap_ulong(_Number) -# define REVERSE_ENDIAN_64(_Number) _byteswap_uint64(_Number) - -// Avoid compiler warning for in line of stdio (or not) - -// #define _NO_CRT_STDIO_INLINE - -// This macro is used to handle LIB_EXPORT of function and variable names in lieu of a .def -// file. Visual Studio requires that functions be explicitly exported and imported. - -# define LIB_EXPORT __declspec(dllexport) // VS compatible version -# define LIB_IMPORT __declspec(dllimport) - -// This is defined to indicate a function that does not return. Microsoft compilers do not -// support the _Noretrun() function parameter. - -# define NORETURN __declspec(noreturn) -# if _MSC_VER >= 1400 // SAL processing when needed -# include -# endif -# ifdef _WIN64 -# define _INTPTR 2 -# else -# define _INTPTR 1 -# endif -# define NOT_REFERENCED(x) (x) - -// Lower the compiler error warning for system include files. They tend not to be that clean and -// there is no reason to sort through all the spurious errors that they generate when the normal -// error level is set to /Wall - -# define _REDUCE_WARNING_LEVEL_(n) \ - __pragma(warning(push, n)) - -// Restore the compiler warning level - -# define _NORMAL_WARNING_LEVEL_ \ - __pragma(warning(pop)) -# include -#endif // _MSC_VER - -#ifndef _MSC_VER -#ifndef WINAPI -# define WINAPI -#endif -# define __pragma(x) - /* libtpms added begin */ -# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) -# define REVERSE_ENDIAN_16(_Number) __builtin_bswap16(_Number) -# define REVERSE_ENDIAN_32(_Number) __builtin_bswap32(_Number) -# define REVERSE_ENDIAN_64(_Number) __builtin_bswap64(_Number) -# else -# if defined __linux__ || defined __CYGWIN__ -# include -# define REVERSE_ENDIAN_16(_Number) bswap_16(_Number) -# define REVERSE_ENDIAN_32(_Number) bswap_32(_Number) -# define REVERSE_ENDIAN_64(_Number) bswap_64(_Number) -# elif defined __OpenBSD__ -# include -# define REVERSE_ENDIAN_16(_Number) swap16(_Number) -# define REVERSE_ENDIAN_32(_Number) swap32(_Number) -# define REVERSE_ENDIAN_64(_Number) swap64(_Number) -# elif defined __APPLE__ -# include -# define REVERSE_ENDIAN_16(_Number) _OSSwapInt16(_Number) -# define REVERSE_ENDIAN_32(_Number) _OSSwapInt32(_Number) -# define REVERSE_ENDIAN_64(_Number) _OSSwapInt64(_Number) -# elif defined __FreeBSD__ -# include -# define REVERSE_ENDIAN_16(_Number) bswap16(_Number) -# define REVERSE_ENDIAN_32(_Number) bswap32(_Number) -# define REVERSE_ENDIAN_64(_Number) bswap64(_Number) -# else -# error Unsupported OS -# endif -# endif - /* libtpms added end */ -#endif #if defined(__GNUC__) -# define NORETURN __attribute__((noreturn)) -# include +# include "CompilerDependencies_gcc.h" +#elif defined(_MSC_VER) +# include "CompilerDependencies_msvc.h" +#else +# error unexpected #endif +#include + // Things that are not defined should be defined as NULL + #ifndef NORETURN # define NORETURN #endif diff --git a/src/tpm2/CompilerDependencies_gcc.h b/src/tpm2/CompilerDependencies_gcc.h new file mode 100644 index 00000000..e08ae131 --- /dev/null +++ b/src/tpm2/CompilerDependencies_gcc.h @@ -0,0 +1,123 @@ +/********************************************************************************/ +/* */ +/* */ +/* Written by Ken Goldman */ +/* IBM Thomas J. Watson Research Center */ +/* */ +/* Licenses and Notices */ +/* */ +/* 1. Copyright Licenses: */ +/* */ +/* - Trusted Computing Group (TCG) grants to the user of the source code in */ +/* this specification (the "Source Code") a worldwide, irrevocable, */ +/* nonexclusive, royalty free, copyright license to reproduce, create */ +/* derivative works, distribute, display and perform the Source Code and */ +/* derivative works thereof, and to grant others the rights granted herein. */ +/* */ +/* - The TCG grants to the user of the other parts of the specification */ +/* (other than the Source Code) the rights to reproduce, distribute, */ +/* display, and perform the specification solely for the purpose of */ +/* developing products based on such documents. */ +/* */ +/* 2. Source Code Distribution Conditions: */ +/* */ +/* - Redistributions of Source Code must retain the above copyright licenses, */ +/* this list of conditions and the following disclaimers. */ +/* */ +/* - Redistributions in binary form must reproduce the above copyright */ +/* licenses, this list of conditions and the following disclaimers in the */ +/* documentation and/or other materials provided with the distribution. */ +/* */ +/* 3. Disclaimers: */ +/* */ +/* - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF */ +/* LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH */ +/* RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES) */ +/* THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE. */ +/* Contact TCG Administration (admin@trustedcomputinggroup.org) for */ +/* information on specification licensing rights available through TCG */ +/* membership agreements. */ +/* */ +/* - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED */ +/* WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR */ +/* FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR */ +/* NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY */ +/* OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE. */ +/* */ +/* - Without limitation, TCG and its members and licensors disclaim all */ +/* liability, including liability for infringement of any proprietary */ +/* rights, relating to use of information in this specification and to the */ +/* implementation of this specification, and TCG disclaims all liability for */ +/* cost of procurement of substitute goods or services, lost profits, loss */ +/* of use, loss of data or any incidental, consequential, direct, indirect, */ +/* or special damages, whether under contract, tort, warranty or otherwise, */ +/* arising in any way out of use or reliance upon this specification or any */ +/* information herein. */ +/* */ +/* (c) Copyright IBM Corp. and others, 2023 */ +/* */ +/********************************************************************************/ + +// This file contains compiler specific switches. +// These definitions are for the GCC compiler +// + +#ifndef _COMPILER_DEPENDENCIES_GCC_H_ +#define _COMPILER_DEPENDENCIES_GCC_H_ + +#if !defined(__GNUC__) +# error CompilerDependencies_gcc.h included for wrong compiler +#endif + +// don't warn on unused local typedefs, they are used as a +// cross-compiler static_assert +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-local-typedefs" +#pragma GCC diagnostic pop + +#undef _MSC_VER +#undef WIN32 + +#ifndef WINAPI +# define WINAPI +#endif +#ifndef __pragma +# define __pragma(x) +#endif + /* libtpms added begin */ +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2) +# define REVERSE_ENDIAN_16(_Number) __builtin_bswap16(_Number) +# define REVERSE_ENDIAN_32(_Number) __builtin_bswap32(_Number) +# define REVERSE_ENDIAN_64(_Number) __builtin_bswap64(_Number) +#else +# if defined __linux__ || defined __CYGWIN__ +# include +# define REVERSE_ENDIAN_16(_Number) bswap_16(_Number) +# define REVERSE_ENDIAN_32(_Number) bswap_32(_Number) +# define REVERSE_ENDIAN_64(_Number) bswap_64(_Number) +# elif defined __OpenBSD__ +# include +# define REVERSE_ENDIAN_16(_Number) swap16(_Number) +# define REVERSE_ENDIAN_32(_Number) swap32(_Number) +# define REVERSE_ENDIAN_64(_Number) swap64(_Number) +# elif defined __APPLE__ +# include +# define REVERSE_ENDIAN_16(_Number) _OSSwapInt16(_Number) +# define REVERSE_ENDIAN_32(_Number) _OSSwapInt32(_Number) +# define REVERSE_ENDIAN_64(_Number) _OSSwapInt64(_Number) +# elif defined __FreeBSD__ +# include +# define REVERSE_ENDIAN_16(_Number) bswap16(_Number) +# define REVERSE_ENDIAN_32(_Number) bswap32(_Number) +# define REVERSE_ENDIAN_64(_Number) bswap64(_Number) +# else +# error Unsupported OS +# endif +#endif + /* libtpms added end */ + +#define NORETURN __attribute__((noreturn)) + +#define TPM_INLINE inline __attribute__((always_inline)) +#define TPM_STATIC_ASSERT(e) _Static_assert(e, "static assert") +#endif // _COMPILER_DEPENDENCIES_H_ diff --git a/src/tpm2/CompilerDependencies_msvc.h b/src/tpm2/CompilerDependencies_msvc.h new file mode 100644 index 00000000..04f637c2 --- /dev/null +++ b/src/tpm2/CompilerDependencies_msvc.h @@ -0,0 +1,125 @@ +/********************************************************************************/ +/* */ +/* */ +/* Written by Ken Goldman */ +/* IBM Thomas J. Watson Research Center */ +/* */ +/* Licenses and Notices */ +/* */ +/* 1. Copyright Licenses: */ +/* */ +/* - Trusted Computing Group (TCG) grants to the user of the source code in */ +/* this specification (the "Source Code") a worldwide, irrevocable, */ +/* nonexclusive, royalty free, copyright license to reproduce, create */ +/* derivative works, distribute, display and perform the Source Code and */ +/* derivative works thereof, and to grant others the rights granted herein. */ +/* */ +/* - The TCG grants to the user of the other parts of the specification */ +/* (other than the Source Code) the rights to reproduce, distribute, */ +/* display, and perform the specification solely for the purpose of */ +/* developing products based on such documents. */ +/* */ +/* 2. Source Code Distribution Conditions: */ +/* */ +/* - Redistributions of Source Code must retain the above copyright licenses, */ +/* this list of conditions and the following disclaimers. */ +/* */ +/* - Redistributions in binary form must reproduce the above copyright */ +/* licenses, this list of conditions and the following disclaimers in the */ +/* documentation and/or other materials provided with the distribution. */ +/* */ +/* 3. Disclaimers: */ +/* */ +/* - THE COPYRIGHT LICENSES SET FORTH ABOVE DO NOT REPRESENT ANY FORM OF */ +/* LICENSE OR WAIVER, EXPRESS OR IMPLIED, BY ESTOPPEL OR OTHERWISE, WITH */ +/* RESPECT TO PATENT RIGHTS HELD BY TCG MEMBERS (OR OTHER THIRD PARTIES) */ +/* THAT MAY BE NECESSARY TO IMPLEMENT THIS SPECIFICATION OR OTHERWISE. */ +/* Contact TCG Administration (admin@trustedcomputinggroup.org) for */ +/* information on specification licensing rights available through TCG */ +/* membership agreements. */ +/* */ +/* - THIS SPECIFICATION IS PROVIDED "AS IS" WITH NO EXPRESS OR IMPLIED */ +/* WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY OR */ +/* FITNESS FOR A PARTICULAR PURPOSE, ACCURACY, COMPLETENESS, OR */ +/* NONINFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS, OR ANY WARRANTY */ +/* OTHERWISE ARISING OUT OF ANY PROPOSAL, SPECIFICATION OR SAMPLE. */ +/* */ +/* - Without limitation, TCG and its members and licensors disclaim all */ +/* liability, including liability for infringement of any proprietary */ +/* rights, relating to use of information in this specification and to the */ +/* implementation of this specification, and TCG disclaims all liability for */ +/* cost of procurement of substitute goods or services, lost profits, loss */ +/* of use, loss of data or any incidental, consequential, direct, indirect, */ +/* or special damages, whether under contract, tort, warranty or otherwise, */ +/* arising in any way out of use or reliance upon this specification or any */ +/* information herein. */ +/* */ +/* (c) Copyright IBM Corp. and others, 2023 */ +/* */ +/********************************************************************************/ + +// This file contains compiler specific switches. +// These definitions are for the Microsoft compiler +// + +#ifndef _COMPILER_DEPENDENCIES_MSVC_H_ +#define _COMPILER_DEPENDENCIES_MSVC_H_ + +#if !defined(_MSC_VER) +# error CompilerDependencies_msvc.h included for wrong compiler +#endif + +// Endian conversion for aligned structures +#define REVERSE_ENDIAN_16(_Number) _byteswap_ushort(_Number) +#define REVERSE_ENDIAN_32(_Number) _byteswap_ulong(_Number) +#define REVERSE_ENDIAN_64(_Number) _byteswap_uint64(_Number) + +// Avoid compiler warning for in line of stdio (or not) +//#define _NO_CRT_STDIO_INLINE + +// This macro is used to handle LIB_EXPORT of function and variable names in lieu +// of a .def file. Visual Studio requires that functions be explicitly exported and +// imported. +#ifdef TPM_AS_DLL +# define LIB_EXPORT __declspec(dllexport) // VS compatible version +# define LIB_IMPORT __declspec(dllimport) +#else +// building static libraries +# define LIB_EXPORT +# define LIB_IMPORT +#endif + +#define TPM_INLINE inline + +// This is defined to indicate a function that does not return. Microsoft compilers +// do not support the _Noretrun function parameter. +#define NORETURN __declspec(noreturn) +#if _MSC_VER >= 1400 // SAL processing when needed +# include +#endif + +// # ifdef _WIN64 +// # define _INTPTR 2 +// # else +// # define _INTPTR 1 +// # endif + +#define NOT_REFERENCED(x) (x) + +// Lower the compiler error warning for system include +// files. They tend not to be that clean and there is no +// reason to sort through all the spurious errors that they +// generate when the normal error level is set to /Wall +#define _REDUCE_WARNING_LEVEL_(n) __pragma(warning(push, n)) +// Restore the compiler warning level +#define _NORMAL_WARNING_LEVEL_ __pragma(warning(pop)) +#include + +#ifdef TPM_STATIC_ASSERT +# error TPM_STATIC_ASSERT already defined +#endif + +// MSVC: failure results in error C2118: negative subscript error +#define TPM_STATIC_ASSERT(e) typedef char __C_ASSERT__[(e) ? 1 : -1] + +#endif // _COMPILER_DEPENDENCIES_MSVC_H_