1 EADK 2 EDK II Standard Libraries and Applications 3 ReadMe 4 Version 1.02 5 21 Dec. 2012 6 7 8OVERVIEW 9======== 10The EADK (uEfi Application Development Kit) provides a set of standards-based 11libraries, along with utility and demonstration applications, intended to 12ease development of UEFI applications based upon the EDK II Open-Source 13distribution. 14 15At this time, applications developed with the EADK are intended to reside 16on, and be loaded from, storage separate from the core firmware. This is 17primarily due to size and environmental requirements. 18 19This release of the EADK should only be used to produce UEFI Applications. Due to the execution 20environment built by the StdLib component, execution as a UEFI driver can cause system stability 21issues. 22 23This document describes the EDK II specific aspects of installing, building, 24and using the Standard C Library component of the EDK II Application 25Development Kit, EADK. 26 27The EADK is comprised of three packages: 28 AppPkg, StdLib, and StdLibPrivateInternalFiles. 29 30 AppPkg This package contains applications which demonstrate use of the 31 Standard C and Sockets Libraries. 32 These applications reside in AppPkg/Applications. 33 34 Enquire This is a program that determines many properties of the 35 C compiler and the target machine that Enquire is run on. The 36 only changes required to port this 1990s era Unix program to 37 EDK II were the addition of eight pragmas to enquire.c in 38 order to disable some Microsoft VC++ specific warnings. 39 40 Hello This is a very simple EDK II native application that doesn't use 41 any features of the Standard C Library. 42 43 Main This application is functionally identical to Hello, except that 44 it uses the Standard C Library to provide a main() entry point. 45 46 Python A port of the Python-2.7.2 interpreter for UEFI. Building this 47 application is disabled by default. 48 See the PythonReadMe.txt file, in the Python directory, 49 for information on configuring and building Python. 50 51 Lua A port of the Lua-5.2.3 interpreter for UEFI. This 52 application is disabled by default. Un-comment the line for 53 LuaLib.inf in the [LibraryClasses] section and Lua.inf in the 54 [Components] section of AppPkg.dsc to enable building Lua. 55 56 OrderedCollectionTest A small Standard C Library application that 57 demonstrates the use of the OrderedCollectionLib library class 58 (provided by the BaseOrderedCollectionRedBlackTreeLib library 59 instance in this application), and allows the user to "fuzz" the 60 library with interactive or scripted API calls. 61 62 Sockets A collection of applications demonstrating use of the 63 EDK II Socket Libraries. These applications include: 64 65 * DataSink * DataSource 66 * GetAddrInfo * GetHostByAddr 67 * GetHostByDns * GetHostByName 68 * GetNetByAddr * GetNetByName 69 * GetServByName * GetServByPort 70 * OobRx * OobTx 71 * RawIp4Rx * RawIp4Tx 72 * RecvDgram * SetHostName 73 * SetSockOpt * TftpServer 74 * WebServer 75 76 StdLib The StdLib package contains the standard header files as well as 77 implementations of other standards-based libraries. 78 79 * BsdSocketLib 80 Support routines above the sockets layer and C interface for 81 the UEFI socket library. 82 * Efi 83 Template contents for the target system's 84 \Efi\StdLib\etc directory. 85 * EfiSocketLib 86 UEFI socket implementation, may be linked into an 87 application or run as a driver. 88 * Include 89 Standard include files. 90 * LibC 91 C Standard Library implementation as per 92 ISO/IEC 9899:199409 (C95). 93 * PosixLib 94 Selected functions from the "Single Unix v4" specification. 95 * SocketDxe 96 UEFI sockets driver, includes EfiSocketLib. 97 * UseSocketDxe 98 Alternate linkage for applications that get built into the 99 firmware. Cause application to use a common instance of the 100 sockets driver instead of including all of sockets into the 101 application. 102 103 StdLibPrivateInternalFiles The contents of this package are for the 104 exclusive use of the library implementations in StdLib. Please do 105 not use anything from this package in your application or else 106 unexpected behavior may occur. 107 This package may be removed in a future release. 108 109 110RELEASE NOTES 111============= 112 Fixes and Additions 113 ------------------- 114Beginning with release 1.01, applications built with the StdLib package 115no longer have a dependency on the TimerLib. 116 117 Known Issues 118 ----------------- 119This release of the EADK has some restrictions, as described below. 120 121 1. The target machine must be running firmware which provides the 122 UEFI 2.3 HII protocol. 123 124 2. Applications must be launched from within the EFI Shell. 125 126 3. Absolute file paths may optionally be prefixed by a volume specifier 127 such as "FS0:". The volume specifier is separated from the remainder 128 of the path by a single colon ':'. The volume specifier must be one of 129 the Shell's mapped volume names as shown by the "map" command. 130 131 4. Absolute file paths that don't begin with a volume specifier; 132 e.g. paths that begin with "/", are relative to the currently selected 133 volume. When the EFI Shell first starts, there is NO selected volume. 134 135 5. The tmpfile(), and related, functions require that the current volume 136 have a temporary directory as specified in <paths.h>. This directory 137 is specified by macro _PATH_TMP as /Efi/StdLib/tmp. 138 139The Standard C Library provided by this package is a "hosted" implementation 140conforming to the ISO/IEC 9899-1990 C Language Standard with Addendum 1. This 141is commonly referred to as the "C 95" specification or ISO/IEC 9899:199409. 142The following instructions assume that you have an existing EDK II or UDK 2010 143source tree that has been configured to build with your tool chain. For 144convenience, it is assumed that your EDK II source tree is located at 145C:\Source\Edk2. 146 147 148EADK INSTALLATION 149================= 150The EADK is integrated within the EDK II source tree and is included with 151current EDK II check-outs. If they are missing from your tree, they may be 152installed by extracting, downloading or copying them to the root of your EDK II 153source tree. The three package directories should be peers to the Conf, 154MdePkg, Nt32Pkg, etc. directories. 155 156There are some boiler-plate declarations and definitions that need to be 157included in your application's INF and DSC build files. These are described 158in the CONFIGURATION section, below. 159 160A subset of the Python 2.7.2 distribution is included as part of AppPkg. If desired, 161the full Python 2.7.2 distribution may be downloaded from python.org and used instead. 162Delete or rename the existing Python-2.7.2 directory then extract the downloaded 163Python-2.7.2.tgz file into the AppPkg\Applications\Python directory. This will produce a 164Python-2.7.2 directory containing the full Python distribution. Python files that had to be 165modified for EDK II are in the AppPkg\Applications\Python\PyMod-2.7.2 directory. These 166files need to be copied into the corresponding directories within the extracted Python-2.7.2 167directory before Python can be built. 168 169 170BUILDING 171======== 172It is not necessary to build the libraries separately from the target 173application(s). If the application references the libraries, as described in 174USAGE, below; the required libraries will be built as needed. 175To build the applications included in AppPkg, one would execute the following 176commands within the "Visual Studio Command Prompt" window: 177 178 > cd C:\Source\Edk2 179 > .\edksetup.bat 180 > build -a X64 -p AppPkg\AppPkg.dsc 181 182This will produce the application executables: Enquire.efi, Hello.efi, and 183Main.efi in the C:\Source\Edk2\Build\AppPkg\DEBUG_VS2008\X64 directory; with 184the DEBUG_VS2008 component being replaced with the actual tool chain and build 185type you have selected in Conf\Tools_def.txt. These executables can now be 186loaded onto the target platform and executed. 187 188If you examine the AppPkg.dsc file, you will notice that the StdLib package is 189referenced in order to resolve the library classes comprising the Standard 190C Library. This, plus referencing the StdLib package in your application's 191.inf file is all that is needed to link your application to the standard 192libraries. 193 194Unless explicitly stated as allowed, EADK components should not be added as 195components of a DSC file which builds a platform's core firmware. There are 196incompatibilities in build flags and requirements that will conflict with the 197requirements of the core firmware. EADK components should be built using a 198separate DSC file then, if absolutely necessary, included as binary components 199of other DSC files. 200 201USAGE 202===== 203This implementation of the Standard C Library is comprised of 16 separate 204libraries in addition to the standard header files. Nine of the libraries are 205associated with use of one of the standard headers; thus, if the header is used 206in an application, it must be linked with the associated library. Three 207libraries are used to provide the Console and File-system device abstractions. 208The libraries and associated header files are described in the following table. 209 210 Library 211 Class Header File(s) Notes 212---------- ---------------- ------------------------------------------------- 213LibC -- Use Always -- This library is always required. 214LibCtype ctype.h, wctype.h Character classification and mapping 215LibLocale locale.h Localization types, macros, and functions 216LibMath math.h Mathematical functions, types, and macros 217LibStdio stdio.h Standard Input and Output functions, types, and 218 macros 219LibStdLib stdlib.h General Utilities for numeric conversion, random 220 num., etc. 221LibString string.h String copying, concatenation, comparison, 222 & search 223LibSignal signal.h Functions and types for handling run-time 224 conditions 225LibTime time.h Time and Date types, macros, and functions 226LibUefi sys/EfiSysCall.h Provides the UEFI system interface and 227 "System Calls" 228LibWchar wchar.h Extended multibyte and wide character utilities 229LibNetUtil Network address and number manipulation utilities 230DevConsole Automatically provided File I/O abstractions for 231 the UEFI Console device. No need to list this 232 library class in your INF file(s). 233DevShell Add if desired File I/O abstractions using UEFI shell 234 facilities. Add this to the application's main 235 INF file if file-system access needed. 236DevUtility -- Do Not Use -- Utility functions used internally by the Device abstractions 237LibGdtoa -- Do Not Use -- This library is used internally and should not 238 need to be explicitly specified by an 239 application. It must be defined as one of the 240 available library classes in the application's 241 DSC file. 242 243 Table 1: Standard Libraries 244 ============================ 245 246The DevConsole and DevShell libraries provide device I/O functionality and are treated 247specially. DevConsole is automatically included so there is no need to reference it in your 248application's DSC or INF files. DevShell must be listed, in your application's INF file in the 249[LibraryClasses] section, if your application does file I/O. 250 251These libraries must be fully described in the [LibraryClasses] section of the 252application package's DSC file. Then, each individual application needs to 253specify which libraries to link to by specifying the Library Class, from the 254above table, in the [LibraryClasses] section of the application's INF file. The 255AppPkg.dsc, StdLib.dsc, and Enquire.inf files provide good examples of this. 256More details are in the CONFIGURATION section, below. 257 258In order to simplify this process, the [LibraryClasses] definitions, and others, are 259specified in the StdLib.inc file. If this file is included in the DSC file, usually at the 260end, then other DSC file changes or additions are unnecessary. This is further described in 261the CONFIGURATION section, below. 262 263Within the source files of the application, use of the Standard headers and 264library functions follow standard C programming practices as formalized by 265ISO/IEC 9899:1990, with Addendum 1, (C 95) C language specification. 266 267 268BUILD CONFIGURATION 269=================== 270DSC Files 271--------- 272 273All EDK II packages which build applications that use the standard libraries 274must include some "boilerplate" text in the package's .dsc file. To make it 275easier, and to reduce cut-and-paste errors, the "boilerplate" text has been 276consolidated into a single file, StdLib/StdLib.inc, which can be included in 277your .dsc file using the !include directive. The provided AppPkg.dsc and 278StdLib.dsc files do this on their last line. 279 280The "boilerplate" text can be included using a !include directive in the 281package's .dsc file. The provided AppPkg.dsc and StdLib.dsc files include 282the following "boilerplate" text: 283 284 ############################################################################## 285 # 286 # Specify whether we are running in an emulation environment, or not. 287 # Define EMULATE if we are, else keep the DEFINE commented out. 288 # 289 # DEFINE EMULATE = 1 290 291 ############################################################################## 292 # 293 # Include Boilerplate text required for building with the Standard Libraries. 294 # 295 ############################################################################## 296 !include StdLib/StdLib.inc 297 298 Figure 1: "Boilerplate" Inclusion 299 ================================= 300 301The EMULATE macro must be defined if one desires to do source-level debugging within one of 302the emulated environments such as NT32Pkg or UnixPkg. 303 304The final boilerplate line, in Figure 1, includes the StdLib.inc file. 305Each section of StdLib/StdLib.inc is described below. 306 307If desired, all of the Socket applications, in AppPkg, can be built by including Sockets.inc: 308 309 !include AppPkg/Applications/Sockets/Sockets.inc 310 311 Figure 2: Socket Applications "Boilerplate" Inclusion 312 ===================================================== 313 314 315Descriptions of the Library Classes comprising the Standard Libraries, 316as shown in Figure 3: Library Class Descriptions, are provided. 317 318 [LibraryClasses] 319 # 320 # C Standard Libraries 321 # 322 LibC|StdLib/LibC/LibC.inf 323 LibCType|StdLib/LibC/Ctype/Ctype.inf 324 LibLocale|StdLib/LibC/Locale/Locale.inf 325 LibMath|StdLib/LibC/Math/Math.inf 326 LibSignal|StdLib/LibC/Signal/Signal.inf 327 LibStdio|StdLib/LibC/Stdio/Stdio.inf 328 LibStdLib|StdLib/LibC/StdLib/StdLib.inf 329 LibString|StdLib/LibC/String/String.inf 330 LibTime|StdLib/LibC/Time/Time.inf 331 LibUefi|StdLib/LibC/Uefi/Uefi.inf 332 LibWchar|StdLib/LibC/Wchar/Wchar.inf 333 334 # Common Utilities for Networking Libraries 335 LibNetUtil|StdLib/LibC/NetUtil/NetUtil.inf 336 337 # Additional libraries for POSIX functionality. 338 LibErr|StdLib/PosixLib/Err/LibErr.inf 339 LibGen|StdLib/PosixLib/Gen/LibGen.inf 340 LibGlob|StdLib/PosixLib/Glob/LibGlob.inf 341 LibStringlist|StdLib/PosixLib/Stringlist/LibStringlist.inf 342 343 # Libraries for device abstractions within the Standard C Library 344 # Applications should not directly access any functions defined in these libraries. 345 LibGdtoa|StdLib/LibC/gdtoa/gdtoa.inf 346 DevConsole|StdLib/LibC/Uefi/Devices/daConsole.inf 347 DevShell|StdLib/LibC/Uefi/Devices/daShell.inf 348 DevUtility|StdLib/LibC/Uefi/Devices/daUtility.inf 349 350 [LibraryClasses.ARM.UEFI_APPLICATION] 351 NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf 352 353 Figure 3: Library Class Descriptions 354 ==================================== 355 356 357The directives in Figure 4: Package Component Descriptions will create 358instances of the BaseLib and BaseMemoryLib library classes that are built 359with Link-time-Code-Generation disabled. This is necessary when using the 360Microsoft tool chains in order to allow the library's functions to be 361resolved during the second pass of the linker during Link-Time-Code-Generation 362of the application. 363 364A DXE driver version of the Socket library is also built. 365 366 [Components] 367 # BaseLib and BaseMemoryLib need to be built with the /GL- switch 368 # when using the Microsoft tool chains. This is required so that 369 # the library functions can be resolved during the second pass of 370 # the linker during link-time-code-generation. 371 # 372 MdePkg/Library/BaseLib/BaseLib.inf { 373 <BuildOptions> 374 MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t /GL- 375 } 376 MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf { 377 <BuildOptions> 378 MSFT:*_*_*_CC_FLAGS = /X /Zc:wchar_t /GL- 379 } 380 381 ########## 382 # Socket Layer 383 ########## 384 StdLib/SocketDxe/SocketDxe.inf 385 386 Figure 4: Package Component Descriptions 387 ======================================== 388 389 390Each compiler assumes, by default, that it will be used with standard libraries 391and headers provided by the compiler vendor. Many of these assumptions are 392incorrect for the UEFI environment. By including a BuildOptions section, as 393shown in Figure 5: Package Build Options, these assumptions can be 394tailored for compatibility with UEFI and the EDK II Standard Libraries. 395 396Note that the set of BuildOptions used is determined by the state of the EMULATE macro. 397 398 [BuildOptions] 399 !ifndef $(EMULATE) 400 # These Build Options are used when building the Standard Libraries to be run 401 # on real hardware. 402 INTEL:*_*_IA32_CC_FLAGS = /Qfreestanding 403 MSFT:*_*_IA32_CC_FLAGS = /X /Zc:wchar_t 404 GCC:*_*_IA32_CC_FLAGS = -nostdinc -nostdlib 405 406 !else 407 # The Build Options, below, are only used when building the Standard Libraries 408 # to be run under an emulation environment. 409 # They disable optimization which facillitates debugging under the Emulation environment. 410 INTEL:*_*_IA32_CC_FLAGS = /Od 411 MSFT:*_*_IA32_CC_FLAGS = /Od 412 GCC:*_*_IA32_CC_FLAGS = -O0 413 414 Figure 5: Package Build Options 415 =============================== 416 417 418INF Files 419========= 420The INF files for most modules will not require special directives in order to 421support the Standard Libraries. The two sections which require attention: LibraryClasses 422and BuildOptions, are described below. 423 424 [LibraryClasses] 425 UefiLib 426 LibC 427 LibString 428 LibStdio 429 DevShell 430 431 Figure 6: Module Library Classes 432 ================================ 433 434 435Modules of type UEFI_APPLICATION that perform file I/O must include library 436class DevShell. Including this library class will allow file operations to be 437handled by the UEFI Shell. Without this class, only Console I/O is supported. 438 439 440An application's INF file might need to include a [BuildOptions] section 441specifying additional compiler and linker flags necessary to allow the 442application to be built. Usually, this section is not needed. When building 443code from external sources, though, it may be necessary to disable some 444warnings or enable/disable some compiler features. 445 446 [BuildOptions] 447 INTEL:*_*_*_CC_FLAGS = /Qdiag-disable:181,186 448 MSFT:*_*_*_CC_FLAGS = /Oi- /wd4018 /wd4131 449 GCC:*_*_IPF_SYMRENAME_FLAGS = --redefine-syms=Rename.txt 450 451 Figure 7: Module Build Options 452 ============================== 453 454 455TARGET-SYSTEM INSTALLATION 456========================== 457Applications that use file system features or the Socket library depend upon 458the existence of a specific directory tree structure on the same volume that 459the application was loaded from. This tree structure is described below: 460 461 /EFI Root of the UEFI system area. 462 |- /Tools Directory containing applications. 463 |- /Boot UEFI specified Boot directory. 464 |- /StdLib Root of the Standard Libraries sub-tree. 465 |- /etc Configuration files used by libraries. 466 |- /tmp Temporary files created by tmpfile(), etc. 467 468 469The /Efi/StdLib/etc directory must be manually populated from the StdLib/Efi/etc source 470directory. 471 472IMPLEMENTATION-Specific Features 473================================ 474It is very strongly recommended that applications not use the long or 475unsigned long types. The size of these types varies between compilers and is one 476of the less portable aspects of C. Instead, one should use the UEFI defined 477types whenever possible. Use of these types, listed below for reference, 478ensures that the declared objects have unambiguous, explicitly declared, sizes 479and characteristics. 480 481 UINT64 INT64 UINT32 INT32 UINT16 CHAR16 482 INT16 BOOLEAN UINT8 CHAR8 INT8 483 UINTN INTN PHYSICALADDRESS 484 485There are similar types declared in sys/types.h and related files. 486 487The types UINTN and INTN have the native width of the target processor 488architecture. Thus, INTN on IA32 has a width of 32 bits while INTN on X64 and 489IPF has a width of 64 bits. 490 491For maximum portability, data objects intended to hold addresses should be 492declared with type intptr_t or uintptr_t. These types, declared in 493sys/stdint.h, can be used to create objects capable of holding pointers. Note 494that these types will generate different sized objects on different processor 495architectures. If a constant size across all processors and compilers is 496needed, use type PHYSICAL_ADDRESS. 497 498Though not specifically required by the ISO/IEC 9899 standard, this 499implementation of the Standard C Library provides the following system calls 500which are declared in sys/EfiSysCall.h and/or unistd.h. 501 502 close creat chmod dup dup2 503 fcntl fstat getcwd ioctl isatty 504 lseek lstat mkdir open poll 505 read rename rmdir stat unlink write 506 507The open function will accept file names of "stdin:", "stdout:", and "stderr:" 508which cause the respective streams specified in the UEFI System Table to be 509opened. Normally, these are associated with the console device. When the 510application is first started, these streams are automatically opened on File 511Descriptors 0, 1, and 2 respectively. 512 513 # # # 514