aboutsummaryrefslogtreecommitdiffstats
path: root/Lesson_19/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'Lesson_19/README.md')
-rw-r--r--Lesson_19/README.md186
1 files changed, 186 insertions, 0 deletions
diff --git a/Lesson_19/README.md b/Lesson_19/README.md
new file mode 100644
index 0000000..65e5cb2
--- /dev/null
+++ b/Lesson_19/README.md
@@ -0,0 +1,186 @@
+In this lesson we would be messing with the NVRAM variables (BIOS settings), i.e. variables that are persistent between boots.
+
+As you remember after OVMF build we have these files:
+```
+$ ls -l Build/OvmfX64/RELEASE_GCC5/FV/OVMF*
+-rw-r--r-- 1 kostr kostr 4194304 Jun 25 14:40 Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd
+-rw-r--r-- 1 kostr kostr 3653632 Jun 25 14:40 Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd
+-rw-r--r-- 1 kostr kostr 540672 Jun 25 14:38 Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd
+```
+- `OVMF_CODE.fd` - code image (read-only)
+- `OVMF_VARS.fd` - NVRAM variables image (read-write)
+- `OVMF.fd` - combined image (`OVMF_CODE.fd` + `OVMF_VARS.fd`)
+
+We can boot QEMU either with:
+```
+$ qemu-system-x86_64 -drive if=pflash,format=raw,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd \
+ ...
+```
+or with
+```
+$ qemu-system-x86_64 -drive if=pflash,format=raw,readonly,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd \
+ -drive if=pflash,format=raw,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \
+ ...
+```
+
+It was fine to use short form earlier, but in this lesson we would modify NVRAM variables, so it is best to use full form with a separate copy of `OVMF_VARS.fd`, so you could always revert things to their initial state.
+
+Let's undo our modifications to the `OvmfPkg` package and rebuild it:
+```
+$ git restore OvmfPkg
+$ build --platform=OvmfPkg/OvmfPkgX64.dsc --arch=X64 --buildtarget=RELEASE --tagname=GCC5
+```
+
+After that create a backup copy of `OVMF_VARS.fd` and run QEMU with it:
+```
+$ cp Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd ../
+$ qemu-system-x86_64 -drive if=pflash,format=raw,readonly,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd \
+ -drive if=pflash,format=raw,file=../OVMF_VARS.fd \
+ -drive format=raw,file=fat:rw:~/UEFI_disk \
+ -nographic \
+ -net none
+```
+
+Check boot variables with the help of `bcfg boot dump`:
+```
+Shell> bcfg boot dump
+Option: 00. Variable: Boot0000
+ Desc - UiApp
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
+ OVMF_VARS.fdiOptional- N
+Option: 01. Variable: Boot0001
+ Desc - UEFI QEMU DVD-ROM QM00003
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 02. Variable: Boot0002
+ Desc - UEFI QEMU HARDDISK QM00001
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 03. Variable: Boot0003
+ Desc - EFI Internal Shell
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
+ Optional- N
+```
+
+Besides showing boot options `bcfg` command can add/remove boot options or change their order.
+You can check out help for `bcfg` via:
+```
+bcfg -? -b
+```
+
+Now let's try to add our `InteractiveApp.efi` to the boot options.
+
+```
+Shell> fs0:
+FS0:\> bcfg boot add 4 InteractiveApp.efi "Interactive app"
+Target = 0004.
+bcfg: Add Boot0004 as 4
+FS0:\> bcfg boot dump
+Option: 00. Variable: Boot0000
+ Desc - UiApp
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
+ Optional- N
+Option: 01. Variable: Boot0001
+ Desc - UEFI QEMU DVD-ROM QM00003
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 02. Variable: Boot0002
+ Desc - UEFI QEMU HARDDISK QM00001
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 03. Variable: Boot0003
+ Desc - EFI Internal Shell
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
+ Optional- N
+Option: 04. Variable: Boot0004
+ Desc - Interactive app
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi
+ Optional- N
+```
+
+Now if you navigate to the `Boot Manager` you'll see our app:
+![Boot Manager](BootManager.png?raw=true "Boot manager")
+
+As soon as you don't change `OVMF_VARS.fd` this option would be present even between QEMU restarts.
+
+We can go further and even place our app as a first boot source:
+```
+Shell> bcfg boot mv 4 0
+Shell> bcfg boot dump
+Option: 00. Variable: Boot0004
+ Desc - Interactive app
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi
+ Optional- N
+Option: 01. Variable: Boot0000
+ Desc - UiApp
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
+ Optional- N
+Option: 02. Variable: Boot0001
+ Desc - UEFI QEMU DVD-ROM QM00003
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 03. Variable: Boot0002
+ Desc - UEFI QEMU HARDDISK QM00001
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 04. Variable: Boot0003
+ Desc - EFI Internal Shell
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
+ Optional- N
+```
+
+Now if you reboot UEFI shell with a `reset` command, or rerun QEMU, you will need to pass our app before you can go to the BIOS menu:
+```
+BdsDxe: loading Boot0004 "Interactive app" from PciRoot(0x0)/Pci(0x1,0x1)/Ata(Primary,Master,0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi
+BdsDxe: starting Boot0004 "Interactive app" from PciRoot(0x0)/Pci(0x1,0x1)/Ata(Primary,Master,0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi
+Try to guess the secret symbol!
+```
+
+Input correct symbol, go to the `Boot manager` menu and run UEFI shell so we could delete our app from the boot sources:
+```
+FS0:\> bcfg boot dump
+Option: 00. Variable: Boot0004
+ Desc - Interactive app
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi
+ Optional- N
+Option: 01. Variable: Boot0000
+ Desc - UiApp
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
+ Optional- N
+Option: 02. Variable: Boot0001
+ Desc - UEFI QEMU DVD-ROM QM00003
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 03. Variable: Boot0002
+ Desc - UEFI QEMU HARDDISK QM00001
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 04. Variable: Boot0003
+ Desc - EFI Internal Shell
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
+ Optional- N
+
+FS0:\> bcfg boot rm 0
+
+FS0:\> bcfg boot dump
+Option: 00. Variable: Boot0000
+ Desc - UiApp
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331)
+ Optional- N
+Option: 01. Variable: Boot0001
+ Desc - UEFI QEMU DVD-ROM QM00003
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 02. Variable: Boot0002
+ Desc - UEFI QEMU HARDDISK QM00001
+ DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
+ Optional- Y
+Option: 03. Variable: Boot0003
+ Desc - EFI Internal Shell
+ DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
+ Optional- N
+```
+
+
+
+