Hi UEFI community,
I’d like to inform you about an update in the
CdePkg branch of edk2-staging.
https://github.com/tianocore/edk2-staging/tree/CdePkg#cdepkg
The goal of the CdePkg is to provide an
ANSI C Interface for UEFI POST drivers,
that enables BIOS engineers to (more) easily port standard C programs or libraries
(e.g. the openSSL library, already done) to POST drivers.
Furthermore the ANSI C Interface is
disseminated widely, also it’s bugs and pitfalls are known very well
by a broad range of IT professionals and may help to be better supportable by the open source initiative
compared to the proprietary interface that is available today in Tianocore UEFI.
Now 3 new ANSI C functions
_wassert()
from ASSERT.H and setlocale(), localeconv()
from LOCALE.H
are introduced for PEI and
DXE.
Currently there are 13 examples implemented, demonstrating all in all 110 functions defined by ANSI C:
argc/argv handling according to https://msdn.microsoft.com/en-us/library/a1y7w461.aspx
demonstration, how
PeiServices and
FileHandle are passed into
main()
demonstration, how
SystemTable and
ImageHandle are passed into
main()
ANSI C LIBRARY functions:
for PEI and DXE phase. It provides TSC based, millisecond precise, exact and chipset independent clock() function.
NOTE: in emulation mode the TSC nominal frequency is supposed to be 1GHz
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/clock?view=vs-2019
time.h mktime():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/mktime-mktime32-mktime64?view=vs-2019
time.h time():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/time-time32-time64?view=vs-2019
time.h asctime():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/asctime-wasctime?view=vs-2019
time.h ctime():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/ctime-ctime32-ctime64-wctime-wctime32-wctime64?view=vs-2019
time.h gmtime():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/gmtime-gmtime32-gmtime64?view=vs-2019
time.h localtime():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/localtime-localtime32-localtime64?view=vs-2019
time.h strftime(): https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strftime-wcsftime-strftime-l-wcsftime-l?view=vs-2019
NOTE: All TIME.H functions support UTC only.
All functions are tested in one single driver PEI/DXE:
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/TIME_H/timehfunctions/main.c#L52
STRING.H memmove():https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memmove-wmemmove?view=vs-2019
STRING.H strcpy():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcpy-wcscpy-mbscpy?view=vs-2019
STRING.H strncpy():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strncpy-strncpy-l-wcsncpy-wcsncpy-l-mbsncpy-mbsncpy-l?view=vs-2019
STRING.H strcat():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcat-wcscat-mbscat?view=vs-2019
STRING.H strncat():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strncat-strncat-l-wcsncat-wcsncat-l-mbsncat-mbsncat-l?view=vs-2019
STRING.H memcmp():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memcmp-wmemcmp?view=vs-2019
STRING.H strcmp():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcmp-wcscmp-mbscmp?view=vs-2019
STRING.H strncmp():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strncmp-wcsncmp-mbsncmp-mbsncmp-l?view=vs-2019
STRING.H memchr():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memchr-wmemchr?view=vs-2019
STRING.H strchr():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strchr-wcschr-mbschr-mbschr-l?view=vs-2019
STRING.H strcspn():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcspn-wcscspn-mbscspn-mbscspn-l?view=vs-2019
STRING.H strpbrk():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strpbrk-wcspbrk-mbspbrk-mbspbrk-l?view=vs-2019
STRING.H strrchr():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strrchr-wcsrchr-mbsrchr-mbsrchr-l?view=vs-2019
STRING.H strspn():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strspn-wcsspn-mbsspn-mbsspn-l?view=vs-2019
STRING.H strstr():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l?view=vs-2019
STRING.H strtok():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l?view=vs-2019
STRING.H memset():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memset-wmemset?view=vs-2019
STRING.H strerror():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strerror-strerror-wcserror-wcserror?view=vs-2019
STRING.H strlen():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strlen-wcslen-mbslen-mbslen-l-mbstrlen-mbstrlen-l?view=vs-2019
NOTE: All STRING.H functions are completely available in PEI and DXE, except strcoll() and strxftm()
All functions are tested in one single driver PEI/DXE: https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/STRING_H/stringhfunctions/main.c#L52
WCHAR.H
swprintf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/sprintf-sprintf-l-swprintf-swprintf-l-swprintf-l?view=vs-2019
WCHAR.H
vswprintf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vsprintf-vsprintf-l-vswprintf-vswprintf-l-vswprintf-l?view=vs-2019
WCHAR.H
wcscpy():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcpy-wcscpy-mbscpy?view=vs-2019
WCHAR.H
wcsncpy():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strncpy-strncpy-l-wcsncpy-wcsncpy-l-mbsncpy-mbsncpy-l?view=vs-2019
WCHAR.H
wcscat():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcat-wcscat-mbscat?view=vs-2019
WCHAR.H
wcsncat():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strncat-strncat-l-wcsncat-wcsncat-l-mbsncat-mbsncat-l?view=vs-2019
WCHAR.H
wcscmp():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcmp-wcscmp-mbscmp?view=vs-2019
WCHAR.H
wcsncmp():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strncmp-wcsncmp-mbsncmp-mbsncmp-l?view=vs-2019
WCHAR.H
wcschr():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strchr-wcschr-mbschr-mbschr-l?view=vs-2019
WCHAR.H
wcscspn():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcspn-wcscspn-mbscspn-mbscspn-l?view=vs-2019
WCHAR.H
wcspbrk():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strpbrk-wcspbrk-mbspbrk-mbspbrk-l?view=vs-2019
WCHAR.H
wcsrchr():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strrchr-wcsrchr-mbsrchr-mbsrchr-l?view=vs-2019
WCHAR.H
wcsspn():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strspn-wcsspn-mbsspn-mbsspn-l?view=vs-2019
WCHAR.H
wcsstr():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strstr-wcsstr-mbsstr-mbsstr-l?view=vs-2019
WCHAR.H
wcstok():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l?view=vs-2019
WCHAR.H
wcslen():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strlen-wcslen-mbslen-mbslen-l-mbstrlen-mbstrlen-l?view=vs-2019
WCHAR.H
wmemcmp():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memcmp-wmemcmp?view=vs-2019
WCHAR.H
wmemcpy():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-wmemcpy?view=vs-2019
WCHAR.H
wmemmove():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memmove-wmemmove?view=vs-2019
WCHAR.H
wmemset():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memset-wmemset?view=vs-2019
NOTE: 21 WCHAR.H functions are available in PEI and DXE. 29 functions are not yet implemented, that are file and multi byte functions
All functions are tested in one single driver PEI/DXE: https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/WCHAR_H/wcharhfunctions/main.c
STDIO.H printf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/printf-printf-l-wprintf-wprintf-l?view=vs-2019
STDIO.H snprintf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l?view=vs-2019
STDIO.H sprintf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/sprintf-sprintf-l-swprintf-swprintf-l-swprintf-l?view=vs-2019
STDIO.H vsnprintf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l?view=vs-2019
STDIO.H vsscanf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vsscanf-vswscanf?view=vs-2019
STDIO.H sscanf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/sscanf-sscanf-l-swscanf-swscanf-l?view=vs-2019
STDIO.H vprintf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vprintf-vprintf-l-vwprintf-vwprintf-l?view=vs-2019
STDIO.H vsprintf():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vsprintf-vsprintf-l-vswprintf-vswprintf-l-vswprintf-l?view=vs-2019
NOTE: 9 STDIO.H functions are available in PEI and DXE. 36 functions are not implemented for POST drivers because of file I/O (it is standard IO dot h)
NOTE: snprintf(), vsnprintf() and vsscanf() are C99 and implemented due to their usefulness for security related software
NOTE: printf() and vprintf() write to ConOut that is actually not visible in PEI and DXE, but in the Emulator.
All functions are tested in one single driver PEI/DXE: https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/STDIO_H/stdiohfunctions/main.c
STDLIB.H atol():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/atol-atol-l-wtol-wtol-l?view=vs-2019
STDLIB.H strtol():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strtol-wcstol-strtol-l-wcstol-l?view=vs-2019
STDLIB.H strtoul():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strtoul-strtoul-l-wcstoul-wcstoul-l?view=vs-2019
STDLIB.H rand():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/rand?view=vs-2019
STDLIB.H srand():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/srand?view=vs-2019
STDLIB.H calloc():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/calloc?view=vs-2019
STDLIB.H free():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/free?view=vs-2019
STDLIB.H malloc():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/malloc?view=vs-2019
STDLIB.H realloc():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/realloc?view=vs-2019
STDLIB.H atexit():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/atexit?view=vs-2019
STDLIB.H exit():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/exit-exit-exit?view=vs-2019
STDLIB.H qsort():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/qsort?view=vs-2019
STDLIB.H abs():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/abs-labs-llabs-abs64?view=vs-2019
STDLIB.H labs():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/abs-labs-llabs-abs64?view=vs-2019
STDLIB.H div():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/div?view=vs-2019
STDLIB.H ldiv():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/div?view=vs-2019
NOTE: missing from STDLIB.H: abort(), strtod(), atof(), getenv(), system(), bsearch()
All functions are tested in one single driver PEI/DXE: https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/STDLIB_H/stdlibhfunctions/main.c
CTYPE.H
isalpha():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isalpha-iswalpha-isalpha-l-iswalpha-l?view=vs-2019
CTYPE.H
iscntrl():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/iscntrl-iswcntrl-iscntrl-l-iswcntrl-l?view=vs-2019
CTYPE.H
isdigit():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isdigit-iswdigit-isdigit-l-iswdigit-l?view=vs-2019
CTYPE.H
isgraph():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isgraph-iswgraph-isgraph-l-iswgraph-l?view=vs-2019
CTYPE.H
islower():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/islower-iswlower-islower-l-iswlower-l?view=vs-2019
CTYPE.H
isprint():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isprint-iswprint-isprint-l-iswprint-l?view=vs-2019
CTYPE.H
ispunct():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/ispunct-iswpunct-ispunct-l-iswpunct-l?view=vs-2019
CTYPE.H
isspace():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isspace-iswspace-isspace-l-iswspace-l?view=vs-2019
CTYPE.H
isupper():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isupper-isupper-l-iswupper-iswupper-l?view=vs-2019
CTYPE.H
isxdigit():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isxdigit-iswxdigit-isxdigit-l-iswxdigit-l?view=vs-2019
CTYPE.H
tolower():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/tolower-tolower-towlower-tolower-l-towlower-l?view=vs-2019
CTYPE.H
toupper():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/toupper-toupper-towupper-toupper-l-towupper-l?view=vs-2019
NOTE: C locale support only
All functions are tested in one single driver PEI/DXE: https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/CTYPE_H/ctypehfunctions/main.c
WCTYPE.H iswalpha():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isalpha-iswalpha-isalpha-l-iswalpha-l?view=vs-2019
WCTYPE.H iswblank():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isblank-iswblank-isblank-l-iswblank-l?view=vs-2019
WCTYPE.H iswcntrl():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/iscntrl-iswcntrl-iscntrl-l-iswcntrl-l?view=vs-2019
WCTYPE.H iswdigit():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isdigit-iswdigit-isdigit-l-iswdigit-l?view=vs-2019
WCTYPE.H iswgraph():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isgraph-iswgraph-isgraph-l-iswgraph-l?view=vs-2019
WCTYPE.H iswlower():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/islower-iswlower-islower-l-iswlower-l?view=vs-2019
WCTYPE.H iswprint():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isprint-iswprint-isprint-l-iswprint-l?view=vs-2019
WCTYPE.H iswpunct():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/ispunct-iswpunct-ispunct-l-iswpunct-l?view=vs-2019
WCTYPE.H iswspace():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isspace-iswspace-isspace-l-iswspace-l?view=vs-2019
WCTYPE.H iswupper():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isupper-isupper-l-iswupper-iswupper-l?view=vs-2019
WCTYPE.H iswxdigit():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isxdigit-iswxdigit-isxdigit-l-iswxdigit-l?view=vs-2019
WCTYPE.H iswctype():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isctype-iswctype-isctype-l-iswctype-l?view=vs-2019
WCTYPE.H wctype():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/wctype?view=vs-2019
WCTYPE.H towlower():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/tolower-tolower-towlower-tolower-l-towlower-l?view=vs-2019
WCTYPE.H towupper():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/toupper-toupper-towupper-toupper-l-towupper-l?view=vs-2019
WCTYPE.H towctrans():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/towctrans?view=vs-2019
WCTYPE.H wctrans():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/wctrans?view=vs-2019
NOTE: C locale support only
All functions are tested in one single driver PEI/DXE: https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/WCTYPE_H/wctypehfunctions/main.c
NOTE: assert() does NOT run into dead loop.
All functions are tested in one single driver PEI/DXE:
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/ASSERT_H/asserthfunctions/main.c
NEW LOCALE.H setlocale():
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/setlocale-wsetlocale?view=vs-2019
NOTE: locale functions are provided for compatibility. Only “C” locale is supported only.
All functions are tested in one single driver PEI/DXE: https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/LOCALE_H/localehfunctions/main.c
Best Regards,
Kilian
From: Kilian Kegel
Sent: Wednesday, October 23, 2019 10:03 PM
To: devel@edk2.groups.io
Cc: Kinney, Michael D;
Richardson, Brian
Subject: [edk2-devel] [staging/branch]: CdePkg - C Development Environment Package
Hi UEFI community,
I’d like to introduce the CdePkg to edk2-staging.
Some time ago I decided to write my own ANSI C Library for UEFI Shell and POST.
The UEFI Shell library (“Torito C Library”) has been production-ready for more than one year.
The POST version of the library (“CdeLib”) is not yet fully tested.
I will be demonstrating my verification procedure in the upcoming weeks on EDK2 STAGING https://github.com/tianocore/edk2-staging/tree/CdePkg
Currently there are 3 examples implemented:
argc/argv handling according to https://msdn.microsoft.com/en-us/library/a1y7w461.aspx
demonstration, how
PeiServices and
FileHandle are passed into
main()
demonstration, how
SystemTable and
ImageHandle are passed into
main()
Upcoming next demonstration will be the
clock() function end of this week
The idea is to bring the ANSI C Library interface into POST drivers.
This will:
(e.g.
char buffer[256] = { 1 };)
What is CdePkg and Torito C Library?
but guarantees that the C compiler is always fully usable (all intrinsics available) and the C90/C95 standard library is always available
What are the design goals?
entire
printf()-family,
entire
scanf()-family.
UEFI-POST-driver just uses small wrapper functions to run the C-Library-Driver code.
This is required for early PEI before memory sizing, when PEI-images run directly out of flash
CdePkg shall be adjusted to other compilers/tool chains too, once it is feature-complete and accepted by the UEFI community.
As long as it is for Microsoft VS2019 only.
CdePkg README.md is here:
https://github.com/tianocore/edk2-staging/tree/CdePkg#cdepkg
CdePkg HOWTO is here:
https://github.com/tianocore/edk2-staging/blob/CdePkg/README.md#howto
CdeValidationPkg README.md is here:
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/README.md
CdeValidationPkg
HOWTO is here:
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/README.md
HOWTO:
build -p EmulatorPkg\EmulatorPkg.dsc -t VS2015x86 -a IA32
run DBGEMU.BAT
to start emulation (EmulatorPkg)
run build -a IA32 -a X64 -n 5 -t VS2015x86 -b DEBUG -p Vlv2TbltDevicePkg\PlatformPkgX64.dsc
update MinnowBoard with Build/Vlv2TbltDevicePkgX64\DEBUG_VS2015x86\FV\VLV.fd
Best regards,
Kilian Kegel