]> git.proxmox.com Git - mirror_edk2.git/blame - CryptoPkg/Library/BaseCryptLib/SysCall/CrtWrapper.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / CryptoPkg / Library / BaseCryptLib / SysCall / CrtWrapper.c
CommitLineData
97f98500
HT
1/** @file\r
2 C Run-Time Libraries (CRT) Wrapper Implementation for OpenSSL-based\r
3 Cryptographic Library.\r
4\r
fc9fa685 5Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>\r
2009f6b4 6SPDX-License-Identifier: BSD-2-Clause-Patent\r
97f98500
HT
7\r
8**/\r
9\r
fc9fa685 10#include <CrtLibSupport.h>\r
97f98500 11\r
7c342378 12int errno = 0;\r
8e01b449 13\r
c61fb9c8 14FILE *stderr = NULL;\r
b7d320f8 15FILE *stdin = NULL;\r
c61fb9c8 16FILE *stdout = NULL;\r
17\r
97f98500 18typedef\r
03805fc3 19int\r
97f98500
HT
20(*SORT_COMPARE)(\r
21 IN VOID *Buffer1,\r
22 IN VOID *Buffer2\r
23 );\r
24\r
25//\r
26// Duplicated from EDKII BaseSortLib for qsort() wrapper\r
27//\r
28STATIC\r
29VOID\r
30QuickSortWorker (\r
31 IN OUT VOID *BufferToSort,\r
32 IN CONST UINTN Count,\r
33 IN CONST UINTN ElementSize,\r
34 IN SORT_COMPARE CompareFunction,\r
35 IN VOID *Buffer\r
36 )\r
37{\r
7c342378
MK
38 VOID *Pivot;\r
39 UINTN LoopCount;\r
40 UINTN NextSwapLocation;\r
97f98500 41\r
7c342378
MK
42 ASSERT (BufferToSort != NULL);\r
43 ASSERT (CompareFunction != NULL);\r
44 ASSERT (Buffer != NULL);\r
97f98500 45\r
7c342378 46 if ((Count < 2) || (ElementSize < 1)) {\r
97f98500
HT
47 return;\r
48 }\r
49\r
50 NextSwapLocation = 0;\r
51\r
52 //\r
53 // Pick a pivot (we choose last element)\r
54 //\r
55 Pivot = ((UINT8 *)BufferToSort + ((Count - 1) * ElementSize));\r
56\r
57 //\r
58 // Now get the pivot such that all on "left" are below it\r
59 // and everything "right" are above it\r
60 //\r
7c342378 61 for (LoopCount = 0; LoopCount < Count - 1; LoopCount++) {\r
97f98500
HT
62 //\r
63 // If the element is less than the pivot\r
64 //\r
65 if (CompareFunction ((VOID *)((UINT8 *)BufferToSort + ((LoopCount) * ElementSize)), Pivot) <= 0) {\r
66 //\r
67 // Swap\r
68 //\r
69 CopyMem (Buffer, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
70 CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), (UINT8 *)BufferToSort + ((LoopCount) * ElementSize), ElementSize);\r
71 CopyMem ((UINT8 *)BufferToSort + ((LoopCount) * ElementSize), Buffer, ElementSize);\r
72\r
73 //\r
74 // Increment NextSwapLocation\r
75 //\r
76 NextSwapLocation++;\r
77 }\r
78 }\r
7c342378 79\r
97f98500 80 //\r
2a784a2c 81 // Swap pivot to its final position (NextSwapLocation)\r
97f98500
HT
82 //\r
83 CopyMem (Buffer, Pivot, ElementSize);\r
84 CopyMem (Pivot, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);\r
85 CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), Buffer, ElementSize);\r
86\r
87 //\r
2a784a2c 88 // Now recurse on 2 partial lists. Neither of these will have the 'pivot' element.\r
97f98500
HT
89 // IE list is sorted left half, pivot element, sorted right half...\r
90 //\r
91 QuickSortWorker (\r
92 BufferToSort,\r
93 NextSwapLocation,\r
94 ElementSize,\r
95 CompareFunction,\r
96 Buffer\r
97 );\r
98\r
99 QuickSortWorker (\r
100 (UINT8 *)BufferToSort + (NextSwapLocation + 1) * ElementSize,\r
101 Count - NextSwapLocation - 1,\r
102 ElementSize,\r
103 CompareFunction,\r
104 Buffer\r
105 );\r
106\r
107 return;\r
108}\r
109\r
7c342378 110// ---------------------------------------------------------\r
97f98500 111// Standard C Run-time Library Interface Wrapper\r
7c342378 112// ---------------------------------------------------------\r
97f98500
HT
113\r
114//\r
115// -- String Manipulation Routines --\r
116//\r
117\r
7c342378
MK
118char *\r
119strchr (\r
120 const char *str,\r
121 int ch\r
122 )\r
eb520d94
LE
123{\r
124 return ScanMem8 (str, AsciiStrSize (str), (UINT8)ch);\r
125}\r
126\r
97f98500 127/* Scan a string for the last occurrence of a character */\r
7c342378
MK
128char *\r
129strrchr (\r
130 const char *str,\r
131 int c\r
132 )\r
97f98500 133{\r
7c342378 134 char *save;\r
97f98500
HT
135\r
136 for (save = NULL; ; ++str) {\r
137 if (*str == c) {\r
138 save = (char *)str;\r
139 }\r
7c342378 140\r
97f98500
HT
141 if (*str == 0) {\r
142 return (save);\r
143 }\r
144 }\r
145}\r
146\r
fc9fa685 147/* Compare first n bytes of string s1 with string s2, ignoring case */\r
7c342378
MK
148int\r
149strncasecmp (\r
150 const char *s1,\r
151 const char *s2,\r
152 size_t n\r
153 )\r
fc9fa685 154{\r
7c342378 155 int Val;\r
fc9fa685 156\r
7c342378
MK
157 ASSERT (s1 != NULL);\r
158 ASSERT (s2 != NULL);\r
fc9fa685
QL
159\r
160 if (n != 0) {\r
161 do {\r
7c342378 162 Val = tolower (*s1) - tolower (*s2);\r
fc9fa685
QL
163 if (Val != 0) {\r
164 return Val;\r
165 }\r
7c342378 166\r
fc9fa685
QL
167 ++s1;\r
168 ++s2;\r
169 if (*s1 == '\0') {\r
170 break;\r
171 }\r
172 } while (--n != 0);\r
173 }\r
7c342378 174\r
fc9fa685
QL
175 return 0;\r
176}\r
177\r
97f98500 178/* Read formatted data from a string */\r
7c342378
MK
179int\r
180sscanf (\r
181 const char *buffer,\r
182 const char *format,\r
183 ...\r
184 )\r
97f98500
HT
185{\r
186 //\r
187 // Null sscanf() function implementation to satisfy the linker, since\r
188 // no direct functionality logic dependency in present UEFI cases.\r
189 //\r
190 return 0;\r
191}\r
192\r
fc9fa685 193/* Maps errnum to an error-message string */\r
7c342378
MK
194char *\r
195strerror (\r
196 int errnum\r
197 )\r
fc9fa685
QL
198{\r
199 return NULL;\r
200}\r
201\r
202/* Computes the length of the maximum initial segment of the string pointed to by s1\r
203 which consists entirely of characters from the string pointed to by s2. */\r
7c342378
MK
204size_t\r
205strspn (\r
206 const char *s1,\r
207 const char *s2\r
208 )\r
fc9fa685
QL
209{\r
210 UINT8 Map[32];\r
211 UINT32 Index;\r
212 size_t Count;\r
213\r
214 for (Index = 0; Index < 32; Index++) {\r
215 Map[Index] = 0;\r
216 }\r
217\r
218 while (*s2) {\r
219 Map[*s2 >> 3] |= (1 << (*s2 & 7));\r
220 s2++;\r
221 }\r
222\r
223 if (*s1) {\r
224 Count = 0;\r
225 while (Map[*s1 >> 3] & (1 << (*s1 & 7))) {\r
226 Count++;\r
227 s1++;\r
228 }\r
229\r
230 return Count;\r
231 }\r
232\r
233 return 0;\r
234}\r
235\r
236/* Computes the length of the maximum initial segment of the string pointed to by s1\r
237 which consists entirely of characters not from the string pointed to by s2. */\r
7c342378
MK
238size_t\r
239strcspn (\r
240 const char *s1,\r
241 const char *s2\r
242 )\r
fc9fa685 243{\r
7c342378
MK
244 UINT8 Map[32];\r
245 UINT32 Index;\r
246 size_t Count;\r
fc9fa685
QL
247\r
248 for (Index = 0; Index < 32; Index++) {\r
249 Map[Index] = 0;\r
250 }\r
251\r
252 while (*s2) {\r
253 Map[*s2 >> 3] |= (1 << (*s2 & 7));\r
254 s2++;\r
255 }\r
256\r
257 Map[0] |= 1;\r
258\r
7c342378 259 Count = 0;\r
fc9fa685 260 while (!(Map[*s1 >> 3] & (1 << (*s1 & 7)))) {\r
7c342378 261 Count++;\r
fc9fa685
QL
262 s1++;\r
263 }\r
264\r
265 return Count;\r
266}\r
267\r
fab6285a
GH
268char *\r
269strcpy (\r
532bd4ec
GH
270 char *strDest,\r
271 const char *strSource\r
fab6285a
GH
272 )\r
273{\r
274 AsciiStrCpyS (strDest, MAX_STRING_SIZE, strSource);\r
275 return strDest;\r
276}\r
277\r
97f98500
HT
278//\r
279// -- Character Classification Routines --\r
280//\r
281\r
282/* Determines if a particular character is a decimal-digit character */\r
7c342378
MK
283int\r
284isdigit (\r
285 int c\r
286 )\r
97f98500
HT
287{\r
288 //\r
289 // <digit> ::= [0-9]\r
290 //\r
291 return (('0' <= (c)) && ((c) <= '9'));\r
292}\r
293\r
294/* Determine if an integer represents character that is a hex digit */\r
7c342378
MK
295int\r
296isxdigit (\r
297 int c\r
298 )\r
97f98500
HT
299{\r
300 //\r
301 // <hexdigit> ::= [0-9] | [a-f] | [A-F]\r
302 //\r
303 return ((('0' <= (c)) && ((c) <= '9')) ||\r
304 (('a' <= (c)) && ((c) <= 'f')) ||\r
305 (('A' <= (c)) && ((c) <= 'F')));\r
306}\r
307\r
308/* Determines if a particular character represents a space character */\r
7c342378
MK
309int\r
310isspace (\r
311 int c\r
312 )\r
97f98500
HT
313{\r
314 //\r
315 // <space> ::= [ ]\r
316 //\r
317 return ((c) == ' ');\r
318}\r
319\r
320/* Determine if a particular character is an alphanumeric character */\r
7c342378
MK
321int\r
322isalnum (\r
323 int c\r
324 )\r
97f98500
HT
325{\r
326 //\r
327 // <alnum> ::= [0-9] | [a-z] | [A-Z]\r
328 //\r
329 return ((('0' <= (c)) && ((c) <= '9')) ||\r
330 (('a' <= (c)) && ((c) <= 'z')) ||\r
331 (('A' <= (c)) && ((c) <= 'Z')));\r
332}\r
333\r
334/* Determines if a particular character is in upper case */\r
7c342378
MK
335int\r
336isupper (\r
337 int c\r
338 )\r
97f98500
HT
339{\r
340 //\r
341 // <uppercase letter> := [A-Z]\r
342 //\r
343 return (('A' <= (c)) && ((c) <= 'Z'));\r
344}\r
345\r
346//\r
347// -- Data Conversion Routines --\r
348//\r
349\r
350/* Convert strings to a long-integer value */\r
7c342378
MK
351long\r
352strtol (\r
353 const char *nptr,\r
354 char **endptr,\r
355 int base\r
356 )\r
97f98500
HT
357{\r
358 //\r
359 // Null strtol() function implementation to satisfy the linker, since there is\r
360 // no direct functionality logic dependency in present UEFI cases.\r
361 //\r
362 return 0;\r
363}\r
364\r
365/* Convert strings to an unsigned long-integer value */\r
7c342378
MK
366unsigned long\r
367strtoul (\r
368 const char *nptr,\r
369 char **endptr,\r
370 int base\r
371 )\r
97f98500
HT
372{\r
373 //\r
374 // Null strtoul() function implementation to satisfy the linker, since there is\r
375 // no direct functionality logic dependency in present UEFI cases.\r
376 //\r
377 return 0;\r
378}\r
379\r
380/* Convert character to lowercase */\r
7c342378
MK
381int\r
382tolower (\r
383 int c\r
384 )\r
97f98500
HT
385{\r
386 if (('A' <= (c)) && ((c) <= 'Z')) {\r
387 return (c - ('A' - 'a'));\r
388 }\r
7c342378 389\r
97f98500
HT
390 return (c);\r
391}\r
392\r
393//\r
394// -- Searching and Sorting Routines --\r
395//\r
396\r
397/* Performs a quick sort */\r
7c342378
MK
398void\r
399qsort (\r
400 void *base,\r
401 size_t num,\r
402 size_t width,\r
403 int ( *compare )(const void *, const void *)\r
404 )\r
97f98500
HT
405{\r
406 VOID *Buffer;\r
407\r
408 ASSERT (base != NULL);\r
409 ASSERT (compare != NULL);\r
410\r
b7d320f8 411 //\r
412 // Use CRT-style malloc to cover BS and RT memory allocation.\r
413 //\r
414 Buffer = malloc (width);\r
97f98500
HT
415 ASSERT (Buffer != NULL);\r
416\r
417 //\r
418 // Re-use PerformQuickSort() function Implementation in EDKII BaseSortLib.\r
419 //\r
420 QuickSortWorker (base, (UINTN)num, (UINTN)width, (SORT_COMPARE)compare, Buffer);\r
421\r
b7d320f8 422 free (Buffer);\r
97f98500
HT
423 return;\r
424}\r
425\r
426//\r
427// -- Process and Environment Control Routines --\r
428//\r
429\r
430/* Get a value from the current environment */\r
7c342378
MK
431char *\r
432getenv (\r
433 const char *varname\r
434 )\r
97f98500
HT
435{\r
436 //\r
437 // Null getenv() function implementation to satisfy the linker, since there is\r
438 // no direct functionality logic dependency in present UEFI cases.\r
439 //\r
440 return NULL;\r
441}\r
442\r
ee3198e6 443/* Get a value from the current environment */\r
7c342378
MK
444char *\r
445secure_getenv (\r
446 const char *varname\r
447 )\r
ee3198e6
LE
448{\r
449 //\r
450 // Null secure_getenv() function implementation to satisfy the linker, since\r
451 // there is no direct functionality logic dependency in present UEFI cases.\r
452 //\r
453 // From the secure_getenv() manual: 'just like getenv() except that it\r
454 // returns NULL in cases where "secure execution" is required'.\r
455 //\r
456 return NULL;\r
457}\r
458\r
97f98500
HT
459//\r
460// -- Stream I/O Routines --\r
461//\r
462\r
97f98500 463/* Write data to a stream */\r
7c342378
MK
464size_t\r
465fwrite (\r
466 const void *buffer,\r
467 size_t size,\r
468 size_t count,\r
469 FILE *stream\r
470 )\r
97f98500
HT
471{\r
472 return 0;\r
473}\r
f754e613 474\r
475//\r
476// -- Dummy OpenSSL Support Routines --\r
477//\r
478\r
7c342378
MK
479int\r
480BIO_printf (\r
481 void *bio,\r
482 const char *format,\r
483 ...\r
484 )\r
f754e613 485{\r
486 return 0;\r
487}\r
488\r
7c342378
MK
489int\r
490BIO_snprintf (\r
491 char *buf,\r
492 size_t n,\r
493 const char *format,\r
494 ...\r
495 )\r
f754e613 496{\r
0e7aa6bf
YL
497 // Because the function does not actually print anything to buf, it returns -1 as error.\r
498 // Otherwise, the consumer may think that the buf is valid and parse the buffer.\r
499 return -1;\r
f754e613 500}\r
4a567c96 501\r
f114914b 502#ifdef __GNUC__\r
503\r
504typedef\r
505VOID\r
506(EFIAPI *NoReturnFuncPtr)(\r
507 VOID\r
7c342378 508 ) __attribute__ ((__noreturn__));\r
f114914b 509\r
f114914b 510STATIC\r
511VOID\r
512EFIAPI\r
513NopFunction (\r
514 VOID\r
515 )\r
516{\r
517}\r
518\r
7c342378
MK
519void\r
520abort (\r
521 void\r
522 )\r
8e01b449 523{\r
7c342378 524 NoReturnFuncPtr NoReturnFunc;\r
f114914b 525\r
7c342378 526 NoReturnFunc = (NoReturnFuncPtr)NopFunction;\r
8e01b449 527\r
f114914b 528 NoReturnFunc ();\r
8e01b449 529}\r
530\r
f114914b 531#else\r
532\r
7c342378
MK
533void\r
534abort (\r
535 void\r
536 )\r
f114914b 537{\r
fc9fa685 538 // Do nothing\r
f114914b 539}\r
540\r
541#endif\r
542\r
7c342378
MK
543int\r
544fclose (\r
545 FILE *f\r
546 )\r
8e01b449 547{\r
548 return 0;\r
549}\r
550\r
7c342378
MK
551FILE *\r
552fopen (\r
553 const char *c,\r
554 const char *m\r
555 )\r
8e01b449 556{\r
557 return NULL;\r
558}\r
559\r
7c342378
MK
560size_t\r
561fread (\r
562 void *b,\r
563 size_t c,\r
564 size_t i,\r
565 FILE *f\r
566 )\r
8e01b449 567{\r
568 return 0;\r
569}\r
570\r
7c342378
MK
571uid_t\r
572getuid (\r
573 void\r
574 )\r
8e01b449 575{\r
576 return 0;\r
577}\r
578\r
7c342378
MK
579uid_t\r
580geteuid (\r
581 void\r
582 )\r
8e01b449 583{\r
584 return 0;\r
585}\r
586\r
7c342378
MK
587gid_t\r
588getgid (\r
589 void\r
590 )\r
8e01b449 591{\r
592 return 0;\r
593}\r
594\r
7c342378
MK
595gid_t\r
596getegid (\r
597 void\r
598 )\r
8e01b449 599{\r
600 return 0;\r
601}\r
602\r
7c342378
MK
603int\r
604printf (\r
605 char const *fmt,\r
606 ...\r
607 )\r
32387e00
JW
608{\r
609 return 0;\r
610}\r