Skip to content

Latest commit

 

History

History
648 lines (574 loc) · 39.8 KB

README.md

File metadata and controls

648 lines (574 loc) · 39.8 KB

CdePkg

C Development Environment Package for EDK2 and derived BIOS products.

C Development Environment Package for EDK2

Preface

The programming language C is standardized by the American National Standards Institute (ANSI) and the International Organization for Standardization (ISO) first in 1989 and 1990. The latest publicly available version of the standard from 1999 is to be found here: C99. The original ANSI C, also known as C89 or C90 is not officially available anymore for free.

Both, the language (operators, expressions, declarations, specifiers, e.g. if, while, +, &&, unsigned, char, struct ...) and the library (functions, parameters, structures, macros, e.g. NDEBUG, CLOCKS_PER_SEC, raise(), scanf(), struct lconv, struct tm, errno ...) are specified in this document (chapters 6 and 7) and are obligatory for an implementation that claims to meet the standard.

In a particular C compiler / C library implementation both are completely coordinated to each other.

The Microsoft C/C++ compiler and its library LIBCMT.lib is an implementation of this standard; it is primarily designed to create C/C++ programs and drivers for the Windows Operating System; it is surely the most frequently used C compiler of them all and continuously enhanced, updated and maintained by Microsoft.

This compiler is not a stand alone executable that simply translates C/C++ sourcecode to object modules. It is closely entwined with different build environments (WDK/DDK, SDK) consisting of libraries, headerfiles, the operating system interface and platforms (x86-64/32, ARM64/32) to meet required code safety, code optimization (size vs. speed in different shades) and maintainability (e.g. for debug and trace purpose).

The code generation and optimization aspects are not completely documented by Microsoft but the Microsoft compiler tends to produce machine code, that relies on the presence of C library specified functions for storage space initialization, comparison and duplication (memset(),strcpy(), strcmp()). Additionally some still undocumented function calls are produced by the x86-32 code generator, when dealing with 64 bit integer types (long long), that came into the C language standard in 1999.

Introduction

CdePkg, C Development Environment Package, introduces the use of Hosted Environment, as specified by ANSI C, for both UEFI POST and SHELL drivers. This is a reference implementation only, using the Microsoft C compiler, linker, library manager and IDE that comes with Visual Studio 2019 for x86 platforms.

A Hosted Environment for command line applications is standard, its introduction for drivers is a novum. This also applies for the UEFI environment. But the wealth of computing power of current UEFI machines offers the chance to translate ANSI C compatible sourcecode to run as UEFI POST driver.

With the growing complexity of firmware due to the requirements for both security and trust and the need for speed in development, use of platform-independent sourcecode allows:

  • reuse of validated C sourcecode (from different origins, e.g. the open source community)1
  • crossdevelopment of complex firmware code on non-UEFI platforms with superb build and debug capabilities
  • use of static code analysis tools2
  • appraisal of the source code quality by human professionals3

Since the UEFI "OS" interface (DXE/SHELL/SMM and PEI) can be accessed directly by the compiler-translated sourcecode and UEFI provides an independent set of functions, macros and type definitions, ANSI C and UEFI "OS" specific sourcecode can coexist seamlessly. This allows a functional ANSI C prototype to adjust successively to real world driver requirements in the UEFI environment. A UEFI SHELL application might be an intermediate step for this process if the target is a DXE or SMM driver.

Intention

CdePkg is a feasibility study on how to provide a complete Hosted Environment (according to ANSI C Specification chapter 5.1.2) including all instrisic functions, which the compiler requires to be a full featured C-compiler, in particular the full set of C-language operators (specifically /, %, <<, >> for 64 bit integers) for the 32 bit code generator, needed in PEI.

Furthermore the questions has to be answered, if UEFI based products can be improved regarding

  • software quality (in terms of number of required updates during a life cycle)
  • development time
  • feature set (complexity and quantity)
  • storage space needed in a flash part (the smaller the better)

...if a standardized programming interface as ANSI C is available, in conjunction with a storage space optimization strategy, as described below, that splits wrapper libraries from worker drivers.

In the UEFI programming environment not even the smallest piece of code can be cross developed on a different platform, since function names differ in upper/lower case letters, format specifier for Print()-functions differ from C's printf(), a scanf() counterpart is absent, wideness of stringtypes differs from corresponding ANSI C functions.

Since in many cases the ANSI C specification allows freedom for a particular library implementation (return values, flags, structure layout) but the chosen build and debug environment is VS2019 the original Microsoft C Library functions had to be recreated, fully compatible, bug for bug (except otherwise noted). This would provide the most relieable solution for cross development, enable the use of the original Microsoft header files and prevent from documenting yet another C Library implementation.

A Hosted Environment provides the following obligatory features:

The command line parameter / load options for each CdePkgDriver shall be able to be adjusted on a final system without recompiling the BIOS and updating the BIOS chip. This e.g. allows the support engineer to change BIOS behaviour on a (partially) defect system for repair/debug mode, enabling trace messages, excluding special (non-compliant) devices from beeing enumerated.

Implementation

CdePkg's functionality is composed of three components:

  1. the C Library CdeLib
  2. the service driver CdeServices
  3. the POST command line reference implementation CdeLoadOptions

all in 32 and 64 bit variants for DXE, SMM and PEI each.

CdeLib and CdeServices are highly optimized for space minimized appearance of ANSI C library functions in the UEFI drivers. This is achieved by implementing all-embracing worker functions

  • printf()-family core
  • scanf()-family core
  • realloc() core (malloc(), free(), realloc() and calloc())
  • strcmp()-family core (all str/wcs/mem n i functions)
  • strcpy()-family core (all str/wcs/mem n functions)
  • strpbrk()/strspn() -family core (all str/wcs pbrk- and spn- functions)
  • strtok()-family core (all str/wcs tok-functions)
  • CRT0 startup code for DXE, SMM, PEI
  • buffered I/O core (fread(), fwrite() and ungetc())
  • locale character tables
  • interface functions to access DXE- and PEI-API

in the CdeServices driver, that resides once in DXE-, SMM- and PEI-phase each. The CdeLib just provides small wrapper functions that invoke CdeServices.

Interface architecture

architectural view

CdeLoadOptions / command line

Each CdePkgDriver reports its EfiCallerIdGuid while running through CRT0 to CdeLoadOptions. CdeLoadOptions provides a pointer to the matching "Command Line" from an simple EfiCallerIdGuid/CommandLine table within the file CdeLoadOptions.h, compiled into the CdeLoadOptions driver binary.

This is just a proof of concept. In a real implementation, as mentioned above, the command line can be changed without recompilation and BIOS update.

Boot flow architecture

The Boot flow sequence consists of:

  1. PEI CdeLoadOption (to provide the commandline to PEI drivers)
  2. PEI CdeServices (to provide the space optimized worker functions)
  3. PEI custom drivers (CdeServicesPei-based)
  4. DXE CdeLoadOption (to provide the commandline to DXE drivers)
  5. DXE CdeServices (to provide the space optimized worker functions)
  6. DXE custom drivers (CdeServicesDxe-based)
  7. BDS custom drivers
  8. UEFI Shell drivers (CdeServicesDxe-based, yet still Torito-C-Library-based)

bootflow view

Status

The CdeLib and CdeServices are derived from their companion project Toro C Library but split into wrapper/worker architecture. (Internally Torito C Library was designed from the very beginning for that split architecture, but library and driver were merged into one executable, to run on platforms without CdeServices protocol.)

The functions below are already implemented and tested, every single one of them, except otherwise noted:

List of available functions

Toro C Library has passed extensive tests to verify Microsoft's C Library compatibility and is also approved in various real world applications. Therefore the CdePkg's C library will be validated by simple tests only, in the CdeValidationPkg, for DXE, SMM and PEI respectively.

todo

  • add simple UART based (COM1) CON I/O interface since consoles are not supported during POST
  • add SMM support
  • 20190714 add PEI support
  • move CRT0 startup code to CdeServices
  • move local character tables to CdeServices
  • move buffered I/O core to CdeServices
  • validate functions in DXE, SMM and PEI List of available functions
  • complete library implementation

Howto

  1. CdePkg is a submodule of the EDK2020-MinnowBoard project.
    https://github.com/KilianKegel/EDK2020-MinnowBoard#howto-installbuildedit
  2. run LAUNCH.BAT, that will
    1. check build tools are installed
    2. download NASM and OPENSSL tools
    3. download EDK2 and EDK2-NON-OSI from tianocore and CdeBinPkg
    4. setup the build environment variables
  3. Create and debug a new CdePkg driver
    The CdeValidationPkg can be used to create and debug CdePkg-based drivers
  4. Convert an existing, traditional MdePkg driver to a CdePkg driver
    1. adjust the .INF file according image below Ip4Dxe.c
    2. adjust the DriverEntryPoint-C-Sourcecode according to the image below Ip4Dxe.c
  5. Adjust the drivers command lines for the MinnowBoard POST drivers
    1. copy LoadOption.efi tool from the UEFIBinaries folder to the UEFI Boot device
    2. copy delall.nsh, disall.nsh, setall.nsh and enaclock.nsh scripts to the UEFI Boot device
    3. run setall.nsh to enable the approbriate command line to each CdeValidationPkg driver
    4. run disall.nsh to prevent each driver from being started
    5. run enaclock.nsh to enable the clock.efi and the argvc.efi driver only
    6. use LoadOption.efi to adjust each driver for your own needs

Related Projects

 related project annotation
Torito C Library C Library for UEFI Shell only. All projects below are built on or derived from Torito C Library
Visual ANSI C for UEFI Shell Getting started with Visual Studio for UEFI Shell and ANSI C cross-development.
Visual DOS Tools for UEFI Shell more, find command implementation
Visual HWTools for UEFI Shell HWTools: PCI- and GPIOSpy for Baytrail. MemSpy for all.

Revision history

20241222, v0.8.9 Build 227

  • fix abort() processes atexit() registered functions and closes files before exit.
  • fix memset() to do solely 8Bit memory machine operations.
  • add Microsoft C Library functions:
  • fix minor symbol naming error

20241109

  • INTERN: minor correction

20241103, v0.8.8 Build 222

  • add dedicated DEBUG/RELEASE support for CdePkg.
    In preparation for the upcoming EDK2-EMU project the entire CdePkg and CdePkg-based components will be debugable on source code level in the EDK2-Emulator.

20241013, v0.8.7 Build 200

  • fixed: removed disassembled math function wasn't replaced by extracted intrinsic math function from Microsoft LIBCMT.LIB:
    • ftol3.obj
    • ullshr.obj
    • ullrem.obj
    • ulldvrm.obj
    • ulldiv.obj
    • llshr.obj
    • llshl.obj
    • llrem.obj
    • llmul.obj
    • lldvrm.obj
    • lldiv.obj original Microsoft functions are now available in the toro C Library for 32Bit.
  • NEW: Introduce preliminary alpha version of MATH.H functions
    NOTE: Use functions below fails with special parameters.
    It is recommended not to use these functions in productive code.

20240908, v0.8.6 Build 187

  • introduce intrinsic math function (_allXYZ(), _aullXYZ() and __ltod3()) extraction from Microsoft **LIBCMT.LIB
    • remove disassembled __allXYZ() and __aullXYZ() from toroCLibrary
  • fixed stat() running on WINDOWS reports wrong time stamp
  • fixed stat() running on UEFI reports from erronous time stamp by exacly one month
  • fixed stat() running on UEFI to support MSDOS drive name (A:, B:, C: ...)
  • fixed system() running on UEFI with output redirection emits additional garbage characters

20240804, v0.8.5 Build 122

  • improve C++ support for CDE.H
    • enable mixed C/C++ applications based toro C Library using CDE.H
  • fixe SMM issues:
    • fix CdePkg-based SMM drivers hangs on startup.
    • fix CdeServicesSmm.c failed to build
      NOTE: The improvement above doesn't change ANSI-C related behaviour of previous library versions

20240505, v0.8.4 Build 91

  • fixed EDK2 DEBUG trace macro won't crash anymore with UEFI specific (non-ANSI-C) format specifiers:
    • %g
    • %t
    • %r
  • improve EMULATOR support
    • enable EfiStatusCode support for EMULATOR DXE
    • fix div by 0 crash due to non-initialize Clocks-Per-Second in

20240428, v0.8.3 Build 84

  • include static code analysis configuration toroCLibrary.ruleset
  • fix minor static code analysis warnings

20240414, v0.8.2 Build 73

  • add timeout detection for disabled COM1/UART at I/O 3F8h used for debug traces.
    NOTE: Disabled I/O devices usually do not respond to I/O cycles.
    Internally this is done by ignoring the chipselect for that particular I/O address range, e.g. 3F8h .. 3FFh for COM1.
    FFh is driven to the data bus when reading registers of those disabled devices.
    On special implementations hardware designers chose a different approach to disabled devices:
    1. address decoding is kept enabled
    2. internal clock line is stopped or decoupled from internal circuitry
      The disadvantage of this aproach is, that status registers are still visible but not updated anymore.

20240309, v0.8.1 Build 54

20240212, v0.8.0 Build 1

  • add semantic versioning + build enumeration
  • optimize source code
    • reduce number of suppressed warnings (4200;4324;4100 only)
    • enable static code analysis (toroCLibrary.ruleset, suppress warning 28251 only )

20231228

  • update copyright date

20231118

  • add ACPI timer based synchronization for toro C Library Shell programs. NOTE: On recent Intel platforms the previously used legacy timer's (i8254) input clock frequency is clocked down to an unspecified frequency with setup default Enable 8254 Clock Gate. Additionally the I/O latency to access i8254 ports is increased with setup default Legacy IO Low Latency that lowers i8254 based timing precision.
    So i8254 gets unusable for UEFI Shell programs on new platforms.
  • improve synchronization error correction for i8254 based POST drivers (with Enable 8254 Clock Gate := disable, Legacy IO Low Latency := enable)

20231014

20230926

  • fixed: _strefieerror() to return error correct string when running in pre-memory PEI

20230917

  • fix CdePkg\Include\CDE.h for debug trace purpose in conjunction with original Microsoft header files

20230916

  • improve debug trace CDETRACE() configuration switches
    • #define CDEDBG STDOUT – traces directed to stdout
    • #define CDEDBG STDERR – traces directed to stderr
    • #define CDEDBG STDDBG – traces directed to CDE debug channel, normally COM1, I/O 0x3F8 115200,8,n,1
    • CDEDBG undefined – UEFI Shell/post DRIVERS: STDDBG, Windows NT: STDOUT

20230909

  • update to TORO C Library 20230909
  • modify CdePkg (CdeServicesPei.c, CdeServicesDxe.c, CdeServicesSmm.c) for WDK 7.1.0 tool chain and old EDK2 (2017) versions
    • C99-style structure initialization (designator) changed to C90-style (initializer-list)
  • remove warning suppression for CdeLib.mak and CdeLibNull.mak that breaks build with WDK 7.1.0 tool chain
  • add EntryPoints to all [LibraryClasses]
  • add signal handling demonstration to WELCOME.C using signal() and raise()
  • provide CDE_SHELL_PROTOCOL_GUID for future/upcoming code size reduced shell application type
  • minor improvements

20230625

20230415

  • fixed: in the pre-Memory-Discovered PEI (Pre Efi Initialization) POST x86-32 Standard C function localeconv() crashed the platform.
    NOTE: All x86-64 operation modes (UEFI Shell, UEFI SMM, UEFI DXE, Windows NT) and post-Memory-Discovered PEI (Pre Efi Initialization) x86-32 was not affected by that bug.

20230409

  • update to TORO C Library 20230409
  • add CdeServicesPEI/DXE/SMM driver source code representation
  • remove CdeServicesPEI/DXE/SMM driver binary representation
  • modify CdeLib and CdeLibNull build strategy
    • script-based removal of superfluous .OBJ from toro-C-library

20230304

  • update to TORO C Library 20230304
  • improve CDETRACE() macro, CdePkg-based DEBUG macro in a mixed/heterogeneous UEFI BIOS build and POST environment

20230212

  • introduce CDEABI, an additional application binary interface ABI to ease coexistance of CdePkg based BIOS drivers with incomplete tianocore EDK2 C Library fragments

    NOTE: CDEABI uses the Microsoft DLL interface __declspec(dllimport) for EDK2-built drivers . Technically this uses indirect function calls on machine code level.

  • promote CDETRACE(), remove former, alternate trace method (CDEMOFINE()) completely

20230104

  • fixed strftime() parameter: %I, %m, %x

20230103

  • fixed CdeLibNull.mak: remove all EntryPoint--.OBJ from to avoid build conflicts with default UEFI libraries

  • add CDE specific helper macros:

    • __CDEWCSFILE__ -- wide character pendant of Standart C __FILE__
    • __CDEWCSFUNCTION__ -- wide character pendant of Standart C __FUNCTION__
    • CDEELC(array) -- element count to get numbers of elements in an array
    • CDENUMTOSTR(num) -- get narrow string representation of decimal num
    • CDENUMTOWCS(num) -- get wide string representation of decimal num
  • add Microsoft/POSIX C Library functions:

    • _isatty()
  • imitate funny/buggy Microsoft behaviour for fopen() with fmode parameter w+ or a:
    function terminates successfully with errno set to 22, Invalid argument

  • imitate funny/buggy Microsoft behaviour for _fileno() with invalid filepointer:
    MSFT: _fileno(-1) just crashes by an invalid memory access
    This behaviour is imitated by an exit(3) invocation

  • fixed application crash at termination when a redirected I/O stream STDERR is reopened with reopen()

  • improve existing invalidate parameter handling; enable file name string, function name string, line number string and expression string at RELEASE runtime
    NOTE: Microsoft enables this feature only when using DEBUG version of LIBCMT.LIB.

  • internal: add toro C Library specific library extentions

    • wchar_t* _wcsefierror(EFI_STATUS Status), according to Standard C char* strerror(int errnum)
    • char* _strefierror(EFI_STATUS Status), according to Standard C char* strerror(int errnum)

20221022

  • add O_TEMPORARY support to Microsoft/POSIX _open()
  • fixed "fall time bug" (autumn). Broken time calculation on two digit month number (Oct, Nov, Dec).

20220814

  • fixed str/wcs--pbrk/spn()-family malfunction on characters with highest bit set (sign extention error)

20220731

  • add Standard C90 Library functions:
    • wcstoul()
    • wcstol()
  • add Standard C99 Library functions:
    • strtoull()
    • strtoll()
    • strtoimax()
    • strtoumax()
    • wcstoull()
    • wcstoll()
    • wcstoimax()
    • wcstoumax()
  • add Microsoft/POSIX C Library functions:
    • _ultow()
    • _ultoa()
    • _ui64tow()
    • _ui64toa()
    • _ltow()
    • _ltoa()
    • _itow()
    • _itoa()
    • _i64tow()
    • _i64toa()
  • implement full __chkstk() for Windows 32Bit: https://docs.microsoft.com/en-us/windows/win32/devnotes/-win32-chkstk
  • fixed stdout/stderr redirection > and >> didn't work anymore (since 20220501)
  • fixed "a"/O_APPEND append file open attribute didn't work anymore (since 20220501)
  • fixed ftell()/fgetpos() reports wrong offset after writing to "a"/O_APPEND opened files

20220529

  • fixed: free() and C++ operator delete() crash to free NULL pointer

20220522

  • add C++ minimum support
    • void* operator new(size_t size)
    • void* operator new[](size_t size)
    • void operator delete[](void* ptr)
    • void operator delete(void* ptr, unsigned __int64 size)

20220501

  • simplify CDETRACE() implemantation, improve portability of that CdePkg specific debug macro
  • add Tor-C-Library version 20220501
  • update header files
  • add fcntl.h, sys\stat.h

20211218

  • introduce CDETRACE() debug/trace macro that is parameter checked at build time
  • improve wmain() support; now selected at build time by choosing the CRT0 entry point name
    • _cdeCRT0UefiShellW()
    • _cdeCRT0WinNTW()
      NOTE: The *env pointer is not passed to wmain()
  • add missing prototypes in headerfiles
    • wchar.h: typedef unsigned short wint_t;
    • wchar.h: int vfwprintf( FILE * stream, const wchar_t * format, va_list arg );
    • wchar.h: int wctob( wint_t c );
    • stdlib.h: size_t mbstowcs( wchar_t * pwcs, const char * s, size_t n );
    • stdlib.h: size_t wcstombs( char * s, const wchar_t * pwcs, size_t n );

20211031

  • add Microsoft specific fopen() mode string modifier "t" for text mode
    • NOTE: "t" modifier is not defined by ANSI/ISO C, because binary/text mode differentiation is done by "w" modifier only.
  • fix fclose() bug in UEFI shell returns an error, when closing a read only file

20211010

  • add Microsoft C Library functions for UEFIShell 64Bit applications only

    • _mkdir()
    • _stat64i32() that is the Microsoft version of POSIX stat()

    add POSIX C Library functions

    • strnlen(), wcsnlen()

20210912

  • initial version of TORO C LIBRARY (toroC64.lib and toroC32.lib)
  • TORITO C LIBRARY is discontinued from now on
  • add Microsoft C Library functions for UEFIShell applications only
    • getc()
    • _findfirst()
    • _findnext()
    • _findclose()

20210821

  • rename library file to toroC32.lib and toroC64.lib
  • add SMM support
  • introduce CdeWelcome component that runs native ANSI C only on PEI (pre/post memory), DXE and SMM ShellAPP (Windows and Linux too, compiled externally)
  • remove components CdeDiag...(), CdeWelcomeDxe, CdeWelcomePei, CdeWelcomePre
  • simplify CdeLib.lib build, introduce CdeLibNull component
  • currently don't use CdeValidationPkg

20210626

  • add dedicated FATAL ERROR message to DXE+PEI CRT0 if CdeServices protocol fails to be located, due to DEPEX or APRIORI issue

20210624

  • enable Tianocore DEBUG macro for CDE-based/injected drivers to allow usage of DEBUG traces with RELEASE BIOS versions
  • add support for BIOS vendor
    • adjust include path
    • provide component description and configuration files

20210429

  • remove .xdata and .pdata sections ($unwind$ and $pdata$ symbols) from .OBJ before binding the library

20210427

  • source tree redesign
  • torito C library redesign to coexist with / replace EDK2 driver functions
  • configure CdePkg to support original tianocore DEBUG traces
  • extend Microsft intrinsic __acrt_iob_func() to support variable length I/O buffer count
  • improve EDK2 emulator support:
    1. check privileg level before _enable() and _disable()
    2. provide BREAKPOINT entries __cdeImageEntryPointPeiINT3(), __cdeImageEntryPointDxeINT3()
  • remove dependancy from 'LoadOptions' CdePkg based drivers can start w/o LoadOptions and just get argv[0], argc == 1, if the LoadfOptions driver is not present in the system
  • add missing UEFI SHELL Emulation support
  • minor face lifts
    1. move forward to better module naming scheme with prefix '__cde'

20210306/0

  • add native UEFI Print format flags compatibility
    • %g - guid
    • %r- status
    • %t - time This is switched internally for traditional UEFI POST trace emulation. But not for the CDEMOFINE trace engine
  • created __CDEC_HOSTED__ according to __STDC_HOSTED__ in CDE.H for runtime test, whether full `CdeLib library support available or not (NOTE: Microsoft STDC_HOSTED is forced to 1 and can not be changed)
  • changed CDE_APP_IF* _GetCdeAppIf() to void* _CdeGetAppIf() to publish it in CDE.H

20200507

  • add diagnostic driver CdeDiagTSCSync, that demonstrates synchronous timing of RTC and TSC-based <time.h> functions
  • remove diagnostic driver CdeDiagPCI (PCI is available in BDS phase only)
  • improved build configurations for all solution projects
  • update all UEFI shell batch files to configure POST LoadOptions/command lines
    • setall.nsh, to set command line defaults for all CdePkg drivers
    • enaclock.nsh, to set command line defaults for CdeDiagTSCDiag and clock only
    • disall.nsh, to prevent known CdePkg drivers from beeing started
    • delall.nsh, to delete all CdePkg related command lines from flash
    • NOTE:
      1. run setall.nsh first
      2. disall.nshto prevent CdePkg drivers from beeing started if you don't want run all drivers
      3. adjust enaclock.nsh to your needs
  • NOTE: This release is focused on real HW (MinnowBoard). Emulation mode doesn't allow hardware access (GPIO, RTC) For Emulation Build the command lines are still stored in the CdeLoadOptions.h

20200409

  • add diagnostic drivers (CdeDiagGPIO, CdeDiagRTC, CdeDiagPCI, CdeDiagEFIVAR(iable)) for demonstration purpose (CdeDiagPCI under construction)

20200315

  • implement command line support based on NVRAM variables for the MinnowBoard
  • create/provide LoadOption tool to CdePkg (UEFIBinaries\LoadOption.efi) to create command lines stored in NVRAM variables (see Howto)

20200304

  • update CdeServicesPei.efi: restart memory allocation if switched from Pre-Memory-PEI to Post-Memory-PEI Confirmed, that CdeServicesPei.efi has full functionality before and after PEI memory detection.
  • cloned all PEI validation programs to it's PRE (pre-mem) conterparts and add to CdeLoadOptions.h

20200212

  • implement new CdePkg POST driver command line model:
    1. each CdePkg driver listed in CdeLoadOptions.h gets the command line parameters passed
    2. each CdePkg driver listed in CdeLoadOptions.h can be suppressed from beeing started by (rejectStart=1)
    3. each CdePkg driver NOT listed in CdeLoadOptions.h is started with argv[0] == "unknownCdeDriverDxe"
  • add MdePkg to CdePkg convertion sample

20200202

20191202

  • add ASSERT.H and LOCALE.H function validation for EmulationMode and MinnowBoard for PEI and DXE POST drivers
  • assert(), setlocale(), localeconv()

20191129

  • add CTYPE.H and WCTYPE.H function validation for EmulationMode and MinnowBoard for PEI and DXE POST drivers
  • isalnum(),isalpha(),iscntrl(),isdigit(),isgraph(),islower(),isprint(),ispunct(),isspace(),isupper(),isxdigit(),tolower(),toupper()
  • iswalnum(),iswalpha(),iswblank(),iswcntrl(),iswdigit(),iswgraph(),iswlower(),iswprint(),iswpunct(),iswspace(),iswupper(),iswxdigit(),iswctype(),wctype(),towlower(),towupper(),towctrans(),wctrans()

20191127

  • add STDLIB.H function validation for EmulationMode and MinnowBoard for PEI and DXE POST drivers
  • atoi(), atol(), strtol(), strtoul(), rand(), srand(), calloc(), free(), malloc(), realloc(), atexit(), exit(), qsort(), abs(), labs(), div(), ldiv()
  • not available for POST drivers: abort(), strtod(), atof(), getenv(), system(), bsearch()

20191126

  • add STDIO.H function validation for EmulationMode and MinnowBoard for PEI and DXE POST drivers
  • tmpnam(), printf(), snprintf(), sprintf(), vsnprintf(), vsscanf(), sscanf(), vprintf(), vsprintf()
  • NOTE: file access and locale dependent functions are not available for POST drivers.

20191125

  • add WCHAR.H function validation for EmulationMode and MinnowBoard for PEI and DXE POST drivers
  • wprintf(), swprintf(), vswprintf(), wcscpy(), wcsncpy(), wcscat(), wcsncat(), wcscmp(), wcsncmp(), wcschr(), wcscspn(), wcspbrk(), wcsrchr(), wcsspn(), wcsstr(), wcstok(), wcslen(), wmemcmp(), wmemcpy(), wmemmove(), wmemset()
  • NOTE: file access and "locale" dependent functions are not available for POST drivers.

20191119

  • add STRING.H function validation for EmulationMode and MinnowBoard
    memcpy(), memmove(), strcpy(), strncpy(), strcat(), strncat(), memcmp(), strcmp() strncmp(), memchr(), strchr(), strcspn(), strpbrk(), strrchr(), strspn(), strstr() strtok(), memset(), strerror() and strlen()
  • not implemented are strcoll() and strxfrm() that are locale dependant that is not yet supported

20191111

  • add all remaining TIME.H function validation for EmulationMode and MinnowBoard
    difftime(), mktime(), time(), asctime(), ctime(), gmtime(), localetime(), strftime()
  • TIME.H functions are fully available for UEFI POST (PEI and DXE)

20191108

  • add TIME_H\clock() function validation for EmulationMode and MinnowBoard
  • add Torito C Library sourcecode selection to build CdePkg driver and libraries

20191028

  • update to meet offical EDK2-STAGING requirements
    • remove binary driver
    • remove binary library
    • simplify PACKAGE_PATH related components

20191023

  • initial revision