init.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /*++
  2. Copyright (c) 1998 Intel Corporation
  3. Module Name:
  4. Abstract:
  5. Revision History
  6. --*/
  7. #include "lib.h"
  8. #include <dragonstub/limits.h>
  9. VOID EFIDebugVariable(VOID);
  10. VOID InitializeLib(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
  11. /*++
  12. Routine Description:
  13. Initializes EFI library for use
  14. Arguments:
  15. Firmware's EFI system table
  16. Returns:
  17. None
  18. --*/
  19. {
  20. EFI_LOADED_IMAGE *LoadedImage;
  21. EFI_STATUS Status;
  22. CHAR8 *LangCode;
  23. if (LibInitialized)
  24. return;
  25. LibInitialized = TRUE;
  26. LibFwInstance = FALSE;
  27. LibImageHandle = ImageHandle;
  28. //
  29. // Set up global pointer to the system table, boot services table,
  30. // and runtime services table
  31. //
  32. ST = SystemTable;
  33. BS = SystemTable->BootServices;
  34. RT = SystemTable->RuntimeServices;
  35. // ASSERT (CheckCrc(0, &ST->Hdr));
  36. // ASSERT (CheckCrc(0, &BS->Hdr));
  37. // ASSERT (CheckCrc(0, &RT->Hdr));
  38. //
  39. // Initialize pool allocation type
  40. //
  41. if (ImageHandle) {
  42. Status = uefi_call_wrapper(BS->HandleProtocol, 3, ImageHandle,
  43. &LoadedImageProtocol,
  44. (VOID *)&LoadedImage);
  45. if (!EFI_ERROR(Status)) {
  46. PoolAllocationType = LoadedImage->ImageDataType;
  47. }
  48. EFIDebugVariable();
  49. }
  50. //
  51. // Initialize Guid table
  52. //
  53. InitializeGuid();
  54. InitializeLibPlatform(ImageHandle, SystemTable);
  55. if (ImageHandle && UnicodeInterface == &LibStubUnicodeInterface) {
  56. LangCode = LibGetVariable(VarLanguage, &EfiGlobalVariable);
  57. InitializeUnicodeSupport(LangCode);
  58. if (LangCode) {
  59. FreePool(LangCode);
  60. }
  61. }
  62. }
  63. VOID InitializeUnicodeSupport(CHAR8 *LangCode)
  64. {
  65. EFI_UNICODE_COLLATION_INTERFACE *Ui;
  66. EFI_STATUS Status;
  67. CHAR8 *Languages;
  68. UINTN Index, Position, Length;
  69. UINTN NoHandles;
  70. EFI_HANDLE *Handles;
  71. //
  72. // If we don't know it, lookup the current language code
  73. //
  74. LibLocateHandle(ByProtocol, &UnicodeCollationProtocol, NULL, &NoHandles,
  75. &Handles);
  76. if (!LangCode || !NoHandles) {
  77. goto Done;
  78. }
  79. //
  80. // Check all driver's for a matching language code
  81. //
  82. for (Index = 0; Index < NoHandles; Index++) {
  83. Status = uefi_call_wrapper(BS->HandleProtocol, 3,
  84. Handles[Index],
  85. &UnicodeCollationProtocol,
  86. (VOID *)&Ui);
  87. if (EFI_ERROR(Status)) {
  88. continue;
  89. }
  90. //
  91. // Check for a matching language code
  92. //
  93. Languages = Ui->SupportedLanguages;
  94. Length = strlena(Languages);
  95. for (Position = 0; Position < Length;
  96. Position += ISO_639_2_ENTRY_SIZE) {
  97. //
  98. // If this code matches, use this driver
  99. //
  100. if (CompareMem(Languages + Position, LangCode,
  101. ISO_639_2_ENTRY_SIZE) == 0) {
  102. UnicodeInterface = Ui;
  103. goto Done;
  104. }
  105. }
  106. }
  107. Done:
  108. //
  109. // Cleanup
  110. //
  111. if (Handles) {
  112. FreePool(Handles);
  113. }
  114. }
  115. VOID EFIDebugVariable(VOID)
  116. {
  117. EFI_STATUS Status;
  118. UINT32 Attributes;
  119. UINTN DataSize;
  120. UINTN NewEFIDebug;
  121. DataSize = sizeof(EFIDebug);
  122. Status = uefi_call_wrapper(RT->GetVariable, 5, L"EFIDebug",
  123. &EfiGlobalVariable, &Attributes, &DataSize,
  124. &NewEFIDebug);
  125. if (!EFI_ERROR(Status)) {
  126. EFIDebug = NewEFIDebug;
  127. }
  128. }
  129. /*
  130. * Calls to memset/memcpy may be emitted implicitly by GCC or MSVC
  131. * even when -ffreestanding or /NODEFAULTLIB are in effect.
  132. */
  133. #ifndef __SIZE_TYPE__
  134. #define __SIZE_TYPE__ UINTN
  135. #endif
  136. void *memset(void *s, int c, __SIZE_TYPE__ n)
  137. {
  138. unsigned char *p = s;
  139. while (n--)
  140. *p++ = c;
  141. return s;
  142. }
  143. void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n)
  144. {
  145. const unsigned char *q = src;
  146. unsigned char *p = dest;
  147. while (n--)
  148. *p++ = *q++;
  149. return dest;
  150. }
  151. /**
  152. * @brief 将数据从src搬运到dst,并能正确处理地址重叠的问题
  153. *
  154. * @param dst 目标地址指针
  155. * @param src 源地址指针
  156. * @param size 大小
  157. * @return void* 指向目标地址的指针
  158. */
  159. void *memmove(void *dst, const void *src, uint64_t size)
  160. {
  161. const char *_src = src;
  162. char *_dst = dst;
  163. if (!size)
  164. return dst;
  165. // 当源地址大于目标地址时,使用memcpy来完成
  166. if (dst <= src)
  167. return memcpy(dst, src, size);
  168. // 当源地址小于目标地址时,为防止重叠覆盖,因此从后往前拷贝
  169. _src += size;
  170. _dst += size;
  171. // 逐字节拷贝
  172. while (size--)
  173. *--_dst = *--_src;
  174. return dst;
  175. }
  176. #define SS (sizeof(size_t))
  177. #define __ALIGN (sizeof(size_t)-1)
  178. #define ONES ((size_t)-1/UCHAR_MAX)
  179. #define HIGHS (ONES * (UCHAR_MAX/2+1))
  180. #define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)
  181. void *memchr(const void *src, int c, size_t n)
  182. {
  183. const unsigned char *s = src;
  184. c = (unsigned char)c;
  185. #ifdef __GNUC__
  186. for (; ((uintptr_t)s & __ALIGN) && n && *s != c; s++, n--);
  187. if (n && *s != c) {
  188. typedef size_t __attribute__((__may_alias__)) word;
  189. const word *w;
  190. size_t k = ONES * c;
  191. for (w = (const void *)s; n>=SS && !HASZERO(*w^k); w++, n-=SS);
  192. s = (const void *)w;
  193. }
  194. #endif
  195. for (; n && *s != c; s++, n--);
  196. return n ? (void *)s : 0;
  197. }
  198. int memcmp(const void *vl, const void *vr, size_t n)
  199. {
  200. const unsigned char *l = vl, *r = vr;
  201. for (; n && *l == *r; n--, l++, r++)
  202. ;
  203. return n ? *l - *r : 0;
  204. }
  205. void *memrchr(const void *m, int c, size_t n)
  206. {
  207. const unsigned char *s = m;
  208. c = (unsigned char)c;
  209. while (n--) if (s[n]==c) return (void *)(s+n);
  210. return 0;
  211. }