]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Base.h
Change the PM Timer RegisterBitWidth according to the Flags
[mirror_edk2.git] / MdePkg / Include / Base.h
index 3f71098861f2b3a6dafe51ce930e89a8fd50a898..2a55dd2697bae32d698f671d5e5ad4e394ac5dcb 100644 (file)
@@ -6,7 +6,8 @@
   environment. There are a set of base libraries in the Mde Package that can\r
   be used to implement base modules.\r
 \r
-Copyright (c) 2006 - 2008, Intel Corporation<BR>\r
+Copyright (c) 2006 - 2009, Intel Corporation<BR>\r
+Portions copyright (c) 2008-2009 Apple Inc. All rights reserved.<BR>\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -26,6 +27,64 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 //\r
 #include <ProcessorBind.h>\r
 \r
+//\r
+// The Microsoft* C compiler can removed references to unreferenced data items\r
+//  if the /OPT:REF linker option is used. We defined a macro as this is a \r
+//  a non standard extension\r
+//\r
+#if defined(_MSC_EXTENSIONS) && !defined (MDE_CPU_EBC)\r
+  ///\r
+  /// Remove global variable from the linked image if there are no references to \r
+  /// it after all compiler and linker optimizations have been performed.\r
+  ///\r
+  ///\r
+  #define GLOBAL_REMOVE_IF_UNREFERENCED __declspec(selectany)\r
+#else\r
+  ///\r
+  /// Remove global variable from the linked image if there are no references to \r
+  /// it after all compiler and linker optimizations have been performed.\r
+  ///\r
+  ///\r
+  #define GLOBAL_REMOVE_IF_UNREFERENCED\r
+#endif\r
+\r
+//\r
+// For symbol name in GNU assembly code, an extra "_" is necessary\r
+//\r
+#if defined(__GNUC__)\r
+  ///\r
+  /// Private worker functions for ASM_PFX()\r
+  ///\r
+  #define _CONCATENATE(a, b)  __CONCATENATE(a, b)\r
+  #define __CONCATENATE(a, b) a ## b\r
+\r
+  ///\r
+  /// The __USER_LABEL_PREFIX__ macro predefined by GNUC represents the prefix\r
+  /// on symbols in assembly language.\r
+  ///\r
+  #define ASM_PFX(name) _CONCATENATE (__USER_LABEL_PREFIX__, name)\r
+#endif\r
+\r
+#if __APPLE__\r
+  //\r
+  // Apple extension that is used by the linker to optimize code size \r
+  // with assembly functions. Put at the end of your .S files\r
+  //\r
+  #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED  .subsections_via_symbols\r
+#else\r
+  #define ASM_FUNCTION_REMOVE_IF_UNREFERENCED\r
+#endif\r
+\r
+#ifdef __CC_ARM\r
+  //\r
+  // Older RVCT ARM compilers don't fully support #pragma pack and require __packed \r
+  // as a prefix for the structure.\r
+  //\r
+  #define PACKED  __packed\r
+#else\r
+  #define PACKED\r
+#endif\r
+\r
 ///\r
 /// 128 bit buffer containing a unique identifier value.  \r
 /// Unless otherwise specified, aligned on a 64 bit boundary.\r
@@ -342,10 +401,38 @@ struct _LIST_ENTRY {
 **/\r
 #define _INT_SIZE_OF(n) ((sizeof (n) + sizeof (UINTN) - 1) &~(sizeof (UINTN) - 1))\r
 \r
-#if defined(__GNUC__)\r
+#if defined(__CC_ARM)\r
+//\r
+// RVCT ARM variable argument list support.\r
+//\r
+\r
+///\r
+/// Variable used to traverse the list of arguments. This type can vary by \r
+/// implementation and could be an array or structure. \r
+///\r
+#ifdef __APCS_ADSABI\r
+  typedef int         *va_list[1];\r
+  #define VA_LIST     va_list\r
+#else\r
+  typedef struct __va_list { void *__ap; } va_list;\r
+  #define VA_LIST                          va_list\r
+#endif\r
+\r
+#define VA_START(Marker, Parameter)   __va_start(Marker, Parameter)\r
+\r
+#define VA_ARG(Marker, TYPE)          __va_arg(Marker, TYPE)\r
+\r
+#define VA_END(Marker)                ((void)0)\r
+\r
+#elif defined(__GNUC__)\r
 //\r
 // Use GCC built-in macros for variable argument lists.\r
 //\r
+\r
+///\r
+/// Variable used to traverse the list of arguments. This type can vary by \r
+/// implementation and could be an array or structure. \r
+///\r
 typedef __builtin_va_list VA_LIST;\r
 \r
 #define VA_START(Marker, Parameter)  __builtin_va_start (Marker, Parameter)\r
@@ -356,7 +443,8 @@ typedef __builtin_va_list VA_LIST;
 \r
 #else\r
 ///\r
-/// Pointer to the start of a variable argument list. Same as CHAR8 *.\r
+/// Variable used to traverse the list of arguments. This type can vary by \r
+/// implementation and could be an array or structure. \r
 ///\r
 typedef CHAR8 *VA_LIST;\r
 \r
@@ -368,7 +456,7 @@ typedef CHAR8 *VA_LIST;
   list that immediately follows Parameter.  The method for computing the pointer to the \r
   next argument in the argument list is CPU specific following the EFIAPI ABI.\r
 \r
-  @param   Marker       Pointer to the beginning of the variable argument list.\r
+  @param   Marker       VA_LIST used to traverse the list of arguments.\r
   @param   Parameter    The name of the parameter that immediately precedes \r
                         the variable argument list.\r
   \r
@@ -386,7 +474,7 @@ typedef CHAR8 *VA_LIST;
   to the next argument in the variable argument list.  The method for computing the \r
   pointer to the next argument in the argument list is CPU specific following the EFIAPI ABI.\r
 \r
-  @param   Marker   Pointer to the beginning of a variable argument list.\r
+  @param   Marker   VA_LIST used to traverse the list of arguments.\r
   @param   TYPE     The type of argument to retrieve from the beginning \r
                     of the variable argument list.\r
   \r
@@ -402,7 +490,7 @@ typedef CHAR8 *VA_LIST;
   After this macro is used, the only way to access the variable argument list again is \r
   by using VA_START() again.\r
 \r
-  @param   Marker   The variable to set to the beginning of the variable argument list.\r
+  @param   Marker   VA_LIST used to traverse the list of arguments.\r
   \r
 **/\r
 #define VA_END(Marker)      (Marker = (VA_LIST) 0)\r
@@ -555,7 +643,7 @@ typedef UINTN  *BASE_LIST;
 //\r
 // Status codes common to all execution phases\r
 //\r
-typedef INTN RETURN_STATUS;\r
+typedef UINTN RETURN_STATUS;\r
 \r
 /**\r
   Produces a RETURN_STATUS code with the highest bit set. \r
@@ -590,7 +678,7 @@ typedef INTN RETURN_STATUS;
   @retval FALSE         The high bit of StatusCode is clear.\r
 \r
 **/\r
-#define RETURN_ERROR(StatusCode)     (((RETURN_STATUS)(StatusCode)) < 0)\r
+#define RETURN_ERROR(StatusCode)     (((INTN)(RETURN_STATUS)(StatusCode)) < 0)\r
 \r
 ///\r
 /// The operation completed successfully.\r
@@ -756,7 +844,7 @@ typedef INTN RETURN_STATUS;
 \r
 \r
 ///\r
-/// The Unicode string contained one or more characters that\r
+/// The string contained one or more characters that\r
 /// the device could not render and were skipped.\r
 ///\r
 #define RETURN_WARN_UNKNOWN_GLYPH    ENCODE_WARNING (1)\r