---?image=assets/images/gitpitch-audience.jpg
@title[Platform Build Lab]
This slide deck has moved to: https://gitpitch.com/tianocore-training/UEFI_Shell_App_Pres/master#/
tianocore.org Note: PITCHME.md for UEFI / EDK II Training UEFI Shell Application
Copyright (c) 2019, Intel Corporation. All rights reserved.
Redistribution and use in source (original document form) and 'compiled' forms (converted to PDF, epub, HTML and other formats) with or without modification, are permitted provided that the following conditions are met:
-
Redistributions of source code (original document form) must retain the above copyright notice, this list of conditions and the following disclaimer as the first lines of this file unmodified.
-
Redistributions in compiled form (transformed to other DTDs, converted to PDF, epub, HTML and other formats) must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS DOCUMENTATION IS PROVIDED BY TIANOCORE PROJECT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TIANOCORE PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@title[Lesson Objective]
@fa[certificate gp-bullet-green] Explain UEFI, the shell, and how they work together
@fa[certificate gp-bullet-cyan] Define the shell components
@fa[certificate gp-bullet-yellow] Use the shell API in a UEFI application
@fa[certificate gp-bullet-magenta] UEFI Shell command Library
@fa[certificate gp-bullet-ltgreen] UEFI Shell scripts
---?image=assets/images/binary-strings-black2.jpg
@title[UEFI Shell Overview Section]
Components of the UEFI Shell
---?image=/assets/images/slides/Slide4.JPG
@title[What is a UEFI Shell?]
What is a UEFI Shell?
Note:
Where the Shell sits between the Platform H/w and the OS after all console / devices initialized
What is a UEFI Shell? UEFI Application Standardized Command Line Interface for pre-OS Sits directly on UEFI firmware (CIRCLE) Optimized for small footprint Supports rich pre-OS applications Standard scripting & API
Versus EFI Shell UEFI App Same characteristics No specification
USE THESE AS BULLETS
+++?image=/assets/images/slides/Slide5.JPG
@title[What is a UEFI Shell? 02]
What is a UEFI Shell?
Note:
+++?image=/assets/images/slides/Slide6.JPG
@title[What is a UEFI Shell? 03]
What is a UEFI Shell?
Note:
+++?image=/assets/images/slides/Slide7.JPG
@title[What is a UEFI Shell? 04]
What is a UEFI Shell?
Note:
+++?image=/assets/images/slides/Slide8.JPG
@title[What is a UEFI Shell? 06]
What is a UEFI Shell?
@snap[north-east span-40 fragment]
@css[ text-yellow](
)
@snapend
@snap[east span-30 fragment]
@css[ text-white](
Extensive & Standardize Pre-OS UEFI Application)
@snapend
Note:
Where the Shell sits between the Platform H/w and the OS after all console / devices initialized
What is a UEFI Shell? UEFI Application Standardized Command Line Interface for pre-OS Sits directly on UEFI firmware (CIRCLE) Optimized for small footprint Supports rich pre-OS applications Standard scripting & API
Versus EFI Shell UEFI App Same characteristics No specification
USE THESE AS BULLETS
---?image=/assets/images/slides/Slide9_1.JPG @title[What is a UEFI Shell?]
http://www.uefi.org/specsandtesttools
UEFI Shell v2.0 specification first released 2008 – Latest V2.2 Jan 2016
Note:
@title[UEFI Shell Elements]
@snap[west span-45 fragment] @box[bg-royal text-white waved ](Small Size Profiles ) @snapend
@snap[east span-45 fragment] @box[bg-gold2 text-white waved ](Shell Commands ) @snapend
@snap[south-west span-45 fragment]
@box[bg-purple-pp text-white waved ](New Shell API
)
@snapend
@snap[south-east span-45 fragment]
@box[bg-green-pp text-white waved ](Enhanced Scripting
)
@snapend
Note:
1)Small Size Profiles Took the UEFI Shell that Intel has been working on as a starting point 4 areas for size
Levels of support Different levels of support for different usage scenarios and space constraints: Level 0: No Command-line Interface (CLI). No shell commands. Only shell API. Level 1: Adds basic scripting support Level 2: Adds basic commands (cd, cp, mv) Level 3: Adds interactive CLI Shell support level can be detected using an environment variable. Beyond level 3, additional command “profiles” are defined for debug, networking and driver support
- Shell Commands
Standardized existing usage Updated for UEFI 2.1+ Standardized argument usage and output Example some of the grep commands are standardized
- New Shell API Smaller executable size – put common functionally back into the shell Expose previously hidden shell capabilities – the shell does some really cool things – Example to change the current directory (CD) it did not exposes this and no one else could take advantage of this unless they were linked right into it
Execution break support – control “C”
- Enhanced Scripting Compatible with existing scripts Added input redirection & piping Enhanced if command example added capability to use shell without a HD or RAM Drive present. – may not have a HD for Manufacturing May not have a Hard drive input output to environment variables
UEFI Advantages = UEFI Shell Advantages
-
Flat memory model
-
Robust, extensible architecture
-
File system, Network, Keyboard, Mouse
-
UEFI Works = UEFI Shell Works
-
No additional requirements to run
-
Write Once/Run Anywhere For Pre-OS
-
With standard API/commands = applications from different ISVs work on any platform (Ex: UEFI SCT)
@title[Small Size Profiles]
@snap[midpoint span-65 ] @box[bg-royal text-white waved ](Small Size Profiles ) @snapend
Note:
Took the UEFI Shell that Intel has been working on as a starting point 4 areas for size
Levels of support Different levels of support for different usage scenarios and space constraints:
Level 0: No Command-line Interface (CLI). No shell commands. Only shell API.
Level 1: Adds basic scripting support
Level 2: Adds basic commands (cd, cp, mv)
Level 3: Adds interactive CLI
Shell support level can be detected using an environment variable.
Beyond level 3, additional command “profiles” are defined for debug, networking and driver support
@title[Small Size Profiles detail]
Level / Profile |
Commands |
Level 0 | Shell API Only |
Level 1 |
Basic scripting support |
Level 2 |
File Support, cmds(cd, cp, mv) |
Level 3 |
Adds interactive CLI + Profiles |
UEFI Debug Profile |
bcfg, comp, dblk, dmem, dmpstore, echo, edit, |
UEFI Network Profile |
ipconfig, ping |
UEFI Driver Profile |
drvdiag, openinfo, reconnect, load, unload |
@snap[south-west fragment ] @box[bg-purple-pp text-white rounded ](Choose the shell that best matches your product needs ) @snapend
Note:
Different levels; defining a platform confined in a space – go with a smaller profile.
Took the same shell commands that have always been there and standardized them
Some were never used so were deprecated
Level 0: provide shell API and that is about it
Level 1: Provide basic scripting support – but not any command line interface so if you want any support then you need to provide the disk itself
Level 2: basic file manipulation commands
Level 3:CLI
Grouped the rest into 3 groups
- UEFI Debug
- Network
- Driver
- also install
@title[Shell Commands]
@snap[midpoint span-65 ] @box[bg-gold2 text-white waved ](Shell Commands ) @snapend
Note:
---?image=/assets/images/slides/Slide25.JPG @title[Shell Commands detail]
Note:
List of all shell commands from the shell prompt by doing help -b
Only the commands built with the currenet shell being executed will also be listed in the Help list
@title[New Shell API]
@snap[midpoint span-65 ]
@box[bg-purple-pp text-white waved ](New Shell API
)
@snapend
Note:
- Application interface
@title[New Shell API detail]
`EFI_SHELL_PROTOCOL`
Group |
Functions |
File Manipulation | `OpenFileByName(), WriteFile(),` etc. . . |
Mapping, Alias & Environmental Variables |
`GetMapFromDevicePath(), GetFilePathFromDevicePath()`, etc . . . |
Launch Application or Script |
`Execute(), BatchIsActive(), IsRootShell()`,etc . . . |
Miscellaneous |
`GetPageBreak(), EnablePageBreak()` ,etc . . . |
@snap[south-west fragment ]
@box[bg-purple-pp text-white rounded ](EFI_SHELL_PROTOCOL
is installed on each application image handle )
@snapend
Note:
This just to give an idea of the over all groups
CreateFile, DeleteFile, ReadFile, WriteFile, DeleteFileByName, CloseFile, FindFiles, FindFilesInDir, GetFilePosition, SetFilePosition, GetFileInfo, SetFileInfo, FreeFileList, OpenFileByName, OpenFileList, OpenRoot, OpenRootByHandle, GetFileSize, RemoveDupInFileList
GetMapFromDevicePath, GetFilePathFromDevicePath, GetDevicePathFromFilePath, GetDevicePathFromMap, SetMap, SetAlias, GetEnv, SetEnv, GetCurDir, SetCurDir
Execute, BatchIsActive, IsRootShell
GetPageBreak, EnablePageBreak, DisablePageBreak, GetHelpText, GetDeviceName
Mapping – FS0 instead of full
---?image=/assets/images/slides/Slide31.JPG
@title[ShellPkg Main Libraries]
ShellPkg Main Libraries
Note:
There are three main libraries used by almost all shell commands
-
ShellLib
- Used by both commands and applications. Provides easy access to Shell Protocols, File I/O, and printing to the user.
-
HandleParsingLib
- Used by both commands and applications. Provides easy access for manipulating handles. This means things like conversion the handle to and from the handle index; the index is the 2 digit hex identifier of the handle seen by the user sorting of handles to determine parent controllers, child controllers, or which driver controls a given controller
-
ShellCommandLib
- fully usable only when linked within the shell binary and therefore only by internal shell commands. This provides extra features for internal commands.
+++?image=/assets/images/slides/Slide32.JPG
@title[ShellPkg Main Libraries 02]
ShellPkg Main Libraries
Note:
+++?image=/assets/images/slides/Slide33.JPG
@title[ShellPkg Main Libraries 03]
ShellPkg Main Libraries
Note:
There are three main libraries used by almost all shell commands
-
ShellLib
- Used by both commands and applications. Provides easy access to Shell Protocols, File I/O, and printing to the user.
-
HandleParsingLib
- Used by both commands and applications. Provides easy access for manipulating handles. This means things like conversion the handle to and from the handle index; the index is the 2 digit hex identifier of the handle seen by the user sorting of handles to determine parent controllers, child controllers, or which driver controls a given controller
-
ShellCommandLib
- fully usable only when linked within the shell binary and therefore only by internal shell commands. This provides extra features for internal commands.
@title[EDK II ShellPkg]
EDK II ShellPkg
@snap[north-west span-45 fragment]
@css[text-yellow](
)
@box[bg-royal text-white rounded ](Support binary portability )
@snapend
@snap[north-east span-45 fragment]
@css[text-yellow](
)
@box[bg-green-pp text-white rounded ](Shell protocols
)
@snapend
@snap[south span-55 fragment]
@box[bg-purple-pp text-white rounded ](Shell parameters
#include
<Library/ShellLib.h
>gEfiShellParametersProtocol
gEfiShellProtocol
)
@snapend
Note:
- EDK II native library for shell applications
- ShellPkg on Open Source, Repository: https://github.com/tianocore/edk2/tree/master/ShellPkg
- Supports binary portability between EFI Shell 1.0 and UEFI 2.0 shell
- Shell protocols: Calls into UEFI (default) or EFI for functionality
- Shell parameters
- Handles parameter parsing for flag, value, and position command-line parameters
- EDK II UEFI Shell 2.0 Library globals in Shell applications
- #Include <Library/ShellLib.h>
- gEfiShellParametersProtocol
- gEfiShellProtocol
@title[Shell Call example]
Shell Call Example
// use UEFI shell 2.x interface
//
if (gEfiShellParametersProtocol != NULL) {
Argc = gEfiShellParametersProtocol->Argc;
Argv = gEfiShellParametersProtocol->Argv;
//Create the file with Argv[1] with
// read/write/create
Status = gEfiShellProtocol->OpenFileByName
(Argv[1], &Handle,
EFI_FILE_MODE_READ |
EFI_FILE_MODE_WRITE |
EFI_FILE_MODE_CREATE);
// . . .
// Write the buffer data to the file
Status = gEfiShellProtocol->WriteFile( Handle,
(UINTN *)&BufferSize, (void *)Buffer);
@[4-5](Parameters Argc and Argv from the command line passed to YOUR shell application) @[6-8](Create the file with Argv string using the Shell Open File by name function) @[15-17](After your application is finished with it's task, write the contains using the Shell handle)
Note:
@title[Enhanced Scripting]
@snap[midpoint span-65 ] @box[bg-green-pp text-white waved ](Enhanced Scripting ) @snapend
Note:
@title[Enhanced Scripting details]
Shell Enhanced Scripting
@fa[circle gp-bullet-magenta] Contains .nsh extention
@fa[circle gp-bullet-gold] "`Startup.nsh`" runs first
@fa[circle gp-bullet-cyan] Supports:
✓ Command-line arguments
✓ Standard script commands
✓ Input & output redirection & pipes
Note:
-
Text files with .nsh extension are shell scripts
-
Supports command-line arguments using positional parameters %0 - %9 and shift.
-
Supports standard script commands
- if/else/endif
- goto
- for/endfor
- echo
- exit
-
Supports input & output redirection & pipes.
-
Can also redirect to/from environment variables!
-
Startup.nsh – First Shell script can be on any FS system. the first script run by the UEFI Shell and it can be run from any removable device
@title[Shell Scripts (Benefits)]
Shell Scripts (Benefits)
@snap[north-west span-25 ]
@snapend
@snap[north-east span-70 ]
Preform basic flow control
@snapend
@snap[east span-25 fragment ] @snapend
@snap[west span-70 fragment ] Allows branching / looping @snapend
@snap[south-west span-25 fragment ] @snapend
@snap[south-east span-70 fragment ]
Users can control input, output and script nesting
@snapend
Note:
The UEFI Shell can execute commands from a file, which is called a batch script file (.nsh files).
- Perform basic flow control.
- Allow branching and looping in a script.
- Allow users to control input and output and call other batch programs (known as script nesting).
@title[Script Detects Shell Capabilities]
Script that Detects Shell Capabilities
```shell # check if Shell supports level 3 commands # Exit on error if %uefishellsupport% ult 3 then echo Must support UEFI Shell, Level 3 exit /b 2 endif
if profiles(Debug1)then echo UEFI Shell supports Debug1 profile endif
@[2-4](Check if Shell supports level 3 commands - That means a Command Line Interface (CLI)
@[9-10](Check that Shell supports Debug1 profile.)
Note:
Walk through the code
- "ult" is <u>u</u>nsigned <u>l</u>ess <u>t</u>han)
---
@title[UEFI Shell Script Example]
<br>
<p align="center"><span class="gold" >UEFI Shell Script Example</span></p>
<br>
<span style="font-size:0.7em"><font color="yellow">Script1.nsh</font></span>
```shell
# Simple UEFI Shell script file
echo -off
script2.nsh
if exist %cwd%Mytime.log then
type Mytime.log
endif
echo "%HThank you.” “%VByeBye:) %N"
Script2.nsh ```shell # Show nested scripts time > Mytime.log for %a run (3 1 -1) echo %a counting down endfor ```
Note: walk through the script calling the second script
- if
- for loop
- %a counting down...
---?image=/assets/images/slides/Slide47.JPG @title[Documentation for EDK II ShellPkg]
Documentation for EDK II ShellPkg
@fa[book gp-bullet-ltgreen] Documenation Link:
wiki Shell Package
Note:
UEFI Shell Documentation updated in the Engineering Resources section
@title[UEFI Shell 2.2 Vs. EFI Shell 1.0]
UEFI Shell 2.2 Vs. EFI Shell 1.0
@fa[circle gp-bullet-ltgreen] UEFI Shell 2.x - EFI_SHELL_PARAMETERS_PROTOCOL
@fa[circle gp-bullet-yellow] EFI Shell 1.0 - EFI_SHELL_INTERFACE
```C // #include //GUID protocol for EFI Shell 1.0 #include //GUID protocol for UEFI Shell 2.x
// . . .
EFI_SHELL_PARAMETERS_PROTOCOL *mEfiShellParametersProtocol; EFI_SHELL_INTERFACE *mEfiShellInterface; //
<span style="font-size:0.6em"> See example C file: <a href="https://github.com/tianocore-training/UEFI_Shell_App_pres/tree/master/Sample/MyShellApp/MyShellApp.c">MyShellApp.c </a></span>
Note:
Protocol GUID will be for either Shell 1.0 or Shell 2.0
This slide shows how to access UEFI Shell 2.0 Versus EFI Shell 1.0
There are 2 different GUIDs
Simply try to open one GUID verse the other to see which Shell is currently in use.
Notice the lower case "g" is for global - this notation is used throughout EDK II code
Lower case "m" means global for "my" Application, driver, etc
+++?code=Sample/MyShellApp/MyShellApp.c&lang=c++&title=UEFI Shell 2.2 Vs. EFI Shell 1.0
@[69-79](Check input parameters from command line using UEFI Shell 2.2 - notice <b>gEfiShellParametersProtocolGuid</b>)
@[81-82](Protocol GUID was found, so assign Argc & Argv from Shell 2.2 protocol)
@[85-92](Else, check if EFI Shell 1.0 - notice <b>gEfiShellInterfaceGuid</b> , Lower case "g")
@[96-97](Protocol GUID was found, so assign Argc & Argv from Shell 1.0 protocol)
@[99-100](Else, Error out of application )
Note:
This slide shows how to access UEFI Shell 2.0 Versus EFI Shell 1.0
There are 2 different GUIDs
Simply try to open one GUID verse the other to see which Shell is currently in use.
Notice the lower case "g" is for global - this notation is used throughout EDK II code
Lower case "m" means global for "my" Application, driver, etc
---?image=/assets/images/slides/Slide52.JPG
@title[Legacy vs. UEFI ]
### <p align="right"><span class="gold" >Legacy vs. UEFI</span></p>
Note:
The UEFI SHELL is an UEFI application that allows you to interface with the UEFI environment prior to the time the OS is loaded. Once the OS starts loading, the UEFI environment is no longer accessible through the Shell.
The UEFI Shell supports a command line interface similar to DOS or Unix. In fact a lot of the same commands exist in the UEFI shell that are in DOS and forms of Linux.
---?image=/assets/images/slides/Slide54.JPG
@title[Shell Usage ]
### <p align="right"><span class="gold" >Shell Usage</span></p>
Note:
The shell is where preboot programs will execute. For example, manufacturing test applications with the rich pre boot environment there is no need to run / execute an operating system
Typical environment that an EFI application might need to execute pre-operating system functions:
- Execute preboot programs
- update programs
- disk utilities
- tests(hwd and soft)
- operating system installation – Configuration utility of a Driver
- Diagnostics
- Platform Testing & Driver Diagnostics
- Move files around between different devices (hard disk, CD/DVD, USB flash drives, …)
- The shell is where files can be moved around just as in DOS or Unix.
- Load a preboot UEFI driver in the system (.efi)
- The shell is where preboot EFI drivers are loaded in the system such as a lan stack tcpip drivers, update old drivers in flash, new drivers for plugin cards etc.
- LAN stack & TCP/IP drivers
- Update old drivers in flash
- New drivers for plug-in cards
---?image=/assets/images/slides/Slide56.JPG
@title[Accessing the Shell]
### <p align="right"><span class="gold" >Accessing the Shell</span></p>
Note:
Boot UEFI Shell from FAT/FAT32 partition:
1. Special boot file located under /EFI/boot/ directory:
- BOOTia32.efi (IA32) or BOOTx64.efi (x64) or other NON IA
---?image=/assets/images/slides/Slide58.JPG
<!-- .slide: data-transition="none" -->
@title[UEFI File System & Device Path]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>
Note:
Can manipulate only UEFI system partitions (FAT/FAT32) where boot loader and UEFI applications are located:
An example of the EFI File system is best seen using the MAP Command that will display the mappings in nvram between block devices .
The EFI shell is replacing what is to the left of the “:” with the device path to the right of the “:”
- Blkxx designates a raw block device
- Such as a disk controller, floppy controller etc.
- FSy designates that a block device has a fat file system on that device.
- The Map command displays all the raw block devices in the system and the FAT file systems mounted and usable.
- After the colon is the device path or physical location of where that device or file system is located.
- Lets try the Map Command on your classroom systems.
+++?image=/assets/images/slides/Slide60.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->
@title[UEFI File System & Device Path 02]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>
Note:
+++?image=/assets/images/slides/Slide61.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->
@title[UEFI File System & Device Path 03]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>
Note:
+++?image=/assets/images/slides/Slide62.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->
@title[UEFI File System & Device Path 04]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>
Note:
+++?image=/assets/images/slides/Slide63.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->
@title[UEFI File System & Device Path 05]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>
Note:
+++?image=/assets/images/slides/Slide64.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->
@title[UEFI File System & Device Path 06]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>
Note:
+++?image=/assets/images/slides/Slide65.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->
@title[UEFI File System & Device Path 07]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>
Note:
+++?image=/assets/images/slides/Slide66.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->
@title[UEFI File System & Device Path 08]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>
Note:
Can manipulate only UEFI system partitions (FAT/FAT32) where boot loader and UEFI applications are located:
An example of the EFI File system is best seen using the MAP Command that will display the mappings in nvram between block devices .
The EFI shell is replacing what is to the left of the “:” with the device path to the right of the “:”
- Blkxx designates a raw block device
- Such as a disk controller, floppy controller etc.
- FSy designates that a block device has a fat file system on that device.
- The Map command displays all the raw block devices in the system and the FAT file systems mounted and usable.
- After the colon is the device path or physical location of where that device or file system is located.
- Lets try the Map Command on your classroom systems.
---
@title[Summary]
<BR>
### <p align="center"><span class="gold" >Summary </span></p><br>
<br>
@fa[certificate gp-bullet-green]<span style="font-size:0.9em"> Explain UEFI, the shell, and how they work together </span><br>
@fa[certificate gp-bullet-cyan]<span style="font-size:0.9em"> Define the shell components</span><br>
@fa[certificate gp-bullet-yellow]<span style="font-size:0.9em"> Use the shell API in a UEFI application</span> <br>
@fa[certificate gp-bullet-magenta]<span style="font-size:0.9em"> UEFI Shell command Library</span> <br>
@fa[certificate gp-bullet-ltgreen]<span style="font-size:0.9em"> UEFI Shell scripts</span>
---?image=assets/images/gitpitch-audience.jpg
@title[Questions]
<br>
![Questions](/assets/images/questions.JPG =10x)
---
@title[return to main]
<p align="center"><span class="gold" >@size[1.2em](<b>Return to Main Training Page</b>)</span></p>
<br>
<br>
<br>
<br>
<br>
<p align="center"><span style="font-size:0.9em">Return to Training Table of contents for next presentation <a href="https://github.com/tianocore-training/Tianocore_Training_Contents/wiki#schedule--outline">link</a></span></p>
@snap[north span-30 ]
<br>
<br>
<br>
<a href="https://github.com/tianocore-training/Tianocore_Training_Contents/wiki#schedule--outline">
![trainingLogo](/assets/images/returnTrainingLogo.png)</a>
@snapend
---?image=assets/images/gitpitch-audience.jpg
@title[Logo Slide]
<br><br><br>
![Logo Slide](/assets/images/TianocoreLogo.png =10x)
---
@title[Acknowledgements]
#### <p align="center"><span class="gold" >Acknowledgements</span></p>
```c++
/**
Redistribution and use in source (original document form) and 'compiled' forms (converted
to PDF, epub, HTML and other formats) with or without modification, are permitted provided
that the following conditions are met:
Redistributions of source code (original document form) must retain the above copyright
notice, this list of conditions and the following disclaimer as the first lines of this
file unmodified.
Redistributions in compiled form (transformed to other DTDs, converted to PDF, epub, HTML
and other formats) must reproduce the above copyright notice, this list of conditions and
the following disclaimer in the documentation and/or other materials provided with the
distribution.
THIS DOCUMENTATION IS PROVIDED BY TIANOCORE PROJECT "AS IS" AND ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TIANOCORE PROJECT BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
Copyright (c) 2019, Intel Corporation. All rights reserved.
**/