diff options
Diffstat (limited to 'src/ssx/ssx/ssx_macros.h')
-rwxr-xr-x | src/ssx/ssx/ssx_macros.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/ssx/ssx/ssx_macros.h b/src/ssx/ssx/ssx_macros.h new file mode 100755 index 0000000..76d3ba7 --- /dev/null +++ b/src/ssx/ssx/ssx_macros.h @@ -0,0 +1,119 @@ +#ifndef __SSX_MACROS_H__ +#define __SSX_MACROS_H__ + +// $Id: ssx_macros.h,v 1.2 2014/02/03 01:30:44 daviddu Exp $ +// $Source: /afs/awd/projects/eclipz/KnowledgeBase/.cvsroot/eclipz/chips/p8/working/procedures/ssx/ssx/ssx_macros.h,v $ +//----------------------------------------------------------------------------- +// *! (C) Copyright International Business Machines Corp. 2013 +// *! All Rights Reserved -- Property of IBM +// *! *** IBM Confidential *** +//----------------------------------------------------------------------------- + +/// \file ssx_macros.h +/// \brief Boilerplate macros for SSX + +/// This macro encapsulates error handling boilerplate for code that uses the +/// SSX API-type error handling, for errors that do not occur in critical +/// sections. + +#define SSX_ERROR(code) \ + do { \ + if (SSX_ERROR_PANIC) { \ + SSX_PANIC(code); \ + } else { \ + return -(code); \ + } \ + } while (0) + + +/// This macro encapsulates error handling boilerplate in the SSX API +/// functions, for errors that do not occur in critical sections. + +#define SSX_ERROR_IF(condition, code) \ + do { \ + if (condition) { \ + SSX_ERROR(code); \ + } \ + } while (0) + + +/// This macro encapsulates error handling boilerplate in the SSX API +/// functions, for errors that do not occur in critical sections and always +/// force a kernel panic, indicating a kernel or API bug. + +#define SSX_PANIC_IF(condition, code) \ + do { \ + if (condition) { \ + SSX_PANIC(code); \ + } \ + } while (0) + + +/// This macro encapsulates error handling boilerplate in the SSX API +/// functions, for errors that do not occur in critical sections. +/// The error handling will only be enabled when SSX_ERROR_CHECK_API +/// is enabled. + +#define SSX_ERROR_IF_CHECK_API(condition, code) \ + do { \ + if (SSX_ERROR_CHECK_API) { \ + SSX_ERROR_IF(condition, code); \ + } \ + } while (0) + +/// This macro encapsulates error handling boilerplate in the SSX API +/// functions, for errors that occur in critical sections. + +#define SSX_ERROR_IF_CRITICAL(condition, code, context) \ + do { \ + if (condition) { \ + if (SSX_ERROR_PANIC) { \ + SSX_PANIC(code); \ + ssx_critical_section_exit(context); \ + } else { \ + ssx_critical_section_exit(context); \ + return -(code); \ + } \ + } \ + } while (0) + + +/// This is a general macro for errors that require cleanup before returning +/// the error code. + +#define SSX_ERROR_IF_CLEANUP(condition, code, cleanup) \ + do { \ + if (condition) { \ + if (SSX_ERROR_PANIC) { \ + SSX_PANIC(code); \ + cleanup; \ + } else { \ + cleanup; \ + return -(code); \ + } \ + } \ + } while (0) + + +/// Most SSX APIs can not be called from critical interrupt contexts. + +#define SSX_ERROR_IF_CRITICAL_INTERRUPT_CONTEXT() \ + SSX_ERROR_IF(__ssx_kernel_context_critical_interrupt(), \ + SSX_ILLEGAL_CONTEXT_CRITICAL_INTERRUPT) + + +/// Some SSX APIs can only be called from thread contexts - these are APIs +/// that threads call on 'themselves'. + +#define SSX_ERROR_UNLESS_THREAD_CONTEXT() \ + SSX_ERROR_IF(!__ssx_kernel_context_thread(), \ + SSX_ILLEGAL_CONTEXT_THREAD_CONTEXT) + + +/// Some SSX APIs must be called from an interrupt context only. + +#define SSX_ERROR_UNLESS_ANY_INTERRUPT_CONTEXT() \ + SSX_ERROR_IF(!__ssx_kernel_context_any_interrupt(), \ + SSX_ILLEGAL_CONTEXT_INTERRUPT_CONTEXT) + +#endif /* __SSX_MACROS_H__ */ |