UEFI Shell sticks the UCS2 of li->FilePath in li->LoadOptions. Ignore it.

If li->LoadOptions tells us to execute our own binary, it's clearly not
what we want to do for the second stage.  So simply ignore that case.

Signed-off-by: Peter Jones <pjones@redhat.com>
Don't put the directory in the file path twice.

Sometimes when we're creating paths, the ImagePath can contain the
directory name already.  If that happens, don't add it in again.

Signed-off-by: Peter Jones <pjones@redhat.com>
Get rid of extra label.

Signed-off-by: Peter Jones <pjones@redhat.com>
Adopt the UEFI shell style LoadOptions

The previous commit, 14d4b8e, caused shim failed to parse the name
of the 2nd stage loader in UEFI shell. Amend parsing of the name the
2nd stage loader to be compatible with UEFI shell.

To create an boot entry for elilo.efi:

 # efibootmgr -c -L "shim elilo" -l "efi\\shim.efi" -u "shim.efi elilo.efi"
Add StrCSpn()

Signed-off-by: Peter Jones <pjones@redhat.com>
Add a fallback loader for when shim is invoked as BOOTX64.EFI

If shim is invoked as \EFI\BOOT\BOOT*.EFI and a file exists named
\EFI\BOOT\FALLBACK.EFI, try it instead of our second stage.  So don't
put fallback.efi on your install media in \EFI\BOOT, because that won't
do whatever it is you're hoping for, unless you're hoping not to start
the installer.

So here's the process for using this:
in /EFI/fedora/ (or whichever directory you happen to own), you put:
  shim.efi
  grub.efi
  boot.csv - format is: shim.efi,Nice Label,cmdline arguments,comments
           - filenames refer only to files in this directory, with no
	     leading characters such as L"./" or L"/EFI/fedora/"
           - note that while this is CSV, the character encoding is
	     UCS-2

and if /EFI/BOOT/BOOTX64.EFI doesn't already exist, then in /EFI/BOOT:
  shim.efi as BOOTX64.EFI
  fallback.efi

Signed-off-by: Peter Jones <pjones@redhat.com>
Make shim use fallback when appropriate.

If we're called as /BOOT/EFI/BOOT*.EFI, and /BOOT/EFI/FALLBACK.EFI exists,
give it a shot.

Signed-off-by: Peter Jones <pjones@redhat.com>
Fix error checking on AllocateZeroPool() in update_boot_order()

Signed-off-by: Peter Jones <pjones@redhat.com>
Get rid of extra "continue".

It's confusing, and it doesn't actually accomplish anything when applied
to *either* loop.

Signed-off-by: Peter Jones <pjones@redhat.com>
Fix crash due to memory allocation
Reset the system after restoring the boot entries
Don't update BootOrder until all csv files are processed
Explain byte order handling better.

Signed-off-by: Peter Jones <pjones@redhat.com>
[fallback] Try to execute the first new boot option.

I'm told rebooting is sometimes unreliable when called here, and we'll
get bootx64.efi loaded anyway.  I'll just assume that's true and try to
load the first option, since it's clearly what we'd prefer happens next.

Signed-off-by: Peter Jones <pjones@redhat.com>
Pass parameters correctly when booting.

Signed-off-by: Peter Jones <pjones@redhat.com>
Fix some minor type errors.

Signed-off-by: Peter Jones <pjones@redhat.com>
Remove some unnecessary code.

Signed-off-by: Peter Jones <pjones@redhat.com>
Add some error messages when things don't work.

Signed-off-by: Peter Jones <pjones@redhat.com>
Use the correct define on Open.

The value here doesn't actually change any, but we should still use the
right name.

Signed-off-by: Peter Jones <pjones@redhat.com>
Use MS ABI instead of terrible wrappers.

This means that we now require gnu-efi 3.0s

Signed-off-by: Peter Jones <pjones@redhat.com>