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 9 new ANSI C functions tmpnam(), printf(), snprintf(), sprintf(), 
vsnprintf(), vsscanf(), sscanf(), vprintf(), vsprintf()
are introduced for PEI and DXE.


Currently there are 8 examples implemented:

  1.  argvc: 
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/HOSTED_ENV/argcv/main.c#L57

argc/argv handling according to 
https://msdn.microsoft.com/en-us/library/a1y7w461.aspx

  1.  systeminterfacePEI: 
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/SYSTEM_IF/systeminterfacePEI/main.c#L57

demonstration, how PeiServices and FileHandle are passed into main()

  1.  systeminterfaceDXE: 
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/SYSTEM_IF/systeminterfaceDXE/main.c#L57

demonstration, how SystemTable and ImageHandle are passed into main()



ANSI C LIBRARY functions:

  1.  time.h clock(): 
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/TIME_H/clock/main.c#L1

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

  1.  time.h  difftime(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/difftime-difftime32-difftime64?view=vs-2019

time.h  mktime(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/mktime-mktime32-mktime64?view=vs-2019<%20https:/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<%20https:/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

  1.  STRING.H 
memcpy():https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/memcpy-wmemcpy?view=vs-2019

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

  1.  WCHAR.H wprintf(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/printf-printf-l-wprintf-wprintf-l?view=vs-2019
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<https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/WCHAR_H/wcharhfunctions/main.c#L52>

  1.  NEW STDIO.H tmpnam(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/tempnam-wtempnam-tmpnam-wtmpnam?view=vs-2019

NEW STDIO.H printf(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/printf-printf-l-wprintf-wprintf-l?view=vs-2019

NEW STDIO.H snprintf(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l?view=vs-2019

NEW 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

NEW STDIO.H vsnprintf(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l?view=vs-2019

NEW STDIO.H vsscanf(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vsscanf-vswscanf?view=vs-2019

NEW STDIO.H sscanf(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/sscanf-sscanf-l-swscanf-swscanf-l?view=vs-2019

NEW STDIO.H vprintf(): 
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/vprintf-vprintf-l-vwprintf-vwprintf-l?view=vs-2019

NEW 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


Best Regards,
Kilian

From: Kilian Kegel<mailto:[email protected]>
Sent: Wednesday, October 23, 2019 10:03 PM
To: [email protected]<mailto:[email protected]>
Cc: Kinney, Michael D<mailto:[email protected]>; Richardson, 
Brian<mailto:[email protected]>
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:

  1.  argvc: 
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/HOSTED_ENV/argcv/main.c#L57

argc/argv handling according to 
https://msdn.microsoft.com/en-us/library/a1y7w461.aspx

  1.  systeminterfacePEI: 
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/SYSTEM_IF/systeminterfacePEI/main.c#L57

demonstration, how PeiServices and FileHandle are passed into main()

  1.  systeminterfaceDXE: 
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/SYSTEM_IF/systeminterfaceDXE/main.c#L57

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:

  1.  ease porting tasks
  2.  allow cross development
  3.  allow developers to focus on their aims, because they aren’t forced to 
keep in mind a lot of additional info (e.g. RShiftU64)
  4.  provide all intrisics to allow the compiler to be a “C compiler”

(e.g. char buffer[256] = { 1 };)



What is CdePkg and Torito C Library?

  *   CdePkg and Torito C Library are a one man show / after work party, that 
is owned and written solely by myself
  *   CdePkg is a reference implementation only for Microsoft C compiler
  *   CdePkg is a feasibility study
  *   CdePkg is the successor of Torito C, based on the same source code
  *   CdePkg C Development Environment is similar to  MdePkg Module Development 
Environment

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?

  *   to rewrite the whole thing from scratch, without using any public source 
code from GNU, BSD, Watcom
  *   completeness: full blown C90 + C95 support, as lowest common denominator
  *   tailored for UEFI: small code size, for UEFI-POST-driver uses a 
C-Library-Driver, that contains core/worker functions for realloc() ==  
malloc() and free(),

entire printf()-family, entire scanf()-family.

UEFI-POST-driver just uses small wrapper functions to run the C-Library-Driver 
code.

  *   stable, exact, chipset independent TSC based clock() with CLOCKS_PER_SEC 
== 1000
  *   complete set of the Microsoft C-compiler intrinsic functions
  *   ROM-able! Runs with stack but w/o any static storage duration in .data 
segment, e.g. for rand(), strtok(), tmpfile()

This is required for early PEI before memory sizing, when PEI-images run 
directly out of flash

  *   Microsoft (bug) compatible (as far as possible)

     *   use original Microsoft header files for UEFI Shell Apps created in 
VS2019
     *   allow expensive debugging tasks of ANSI C .EFI applications in Visual 
Studio in its Windows NT counter part
     *   to save my lifetime writing a documentation 
https://github.com/tianocore/edk2-staging/tree/CdePkg/implemented.md#validation-status

  *   all the above in one single C-Library CdeLib.lib


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/MinnowWare/CdePkg#cdepkg>  
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<https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/README.md#cdevalidationpkg>
CdeValidationPkg HOWTO is here: 
https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/README.md<https://github.com/tianocore/edk2-staging/blob/CdePkg/CdeValidationPkg/README.md#howto>


HOWTO:

  1.  clone the edk2-staging repository
  2.  checkout CdePkg
  3.  run LAUNCH.BAT
  4.  run build -p EmulatorPkg\EmulatorPkg.dsc -t VS2015x86 -a IA32
  5.  run DBGEMU.BAT to start emulation (EmulatorPkg)
  6.  run build -a IA32 -a X64 -n 5 -t VS2015x86 -b DEBUG -p 
Vlv2TbltDevicePkg\PlatformPkgX64.dsc
  7.  update MinnowBoard with 
Build/Vlv2TbltDevicePkgX64\DEBUG_VS2015x86\FV\VLV.fd



Best regards,

Kilian Kegel








-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#51282): https://edk2.groups.io/g/devel/message/51282
Mute This Topic: https://groups.io/mt/61958819/21656
Group Owner: [email protected]
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to