[FREELDR] Several changes regarding chainloading and Linux boot.
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 29 Sep 2019 17:20:15 +0000 (19:20 +0200)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Mon, 7 Oct 2019 00:54:07 +0000 (02:54 +0200)
commit21c51eed0517ccca05ccf5a0724e0c9ce2a5e058
treecf7ef0eea3ca00507384116bf6514c405b07ee63
parent912268762eb3287ba286615fa1b1c3bd0c04336b
[FREELDR] Several changes regarding chainloading and Linux boot.

- Introduce "Relocator16Boot()". So far its aim is just to correctly set
  the CPU state (segments, registers, flags) to what is expected by a
  given boot image before running it.
  This function can be seen as the embryonic state of a future boot relocator
  (see e.g. GRUB or SYSLINUX) that would also relocate the boot image at
  the correct places. (Such feature is needed when boot images have to
  be loaded in memory areas that cover where the boot loader is in memory.)

- Implement ChainLoadBiosBootSectorCode() around it.

- Replace BootOldLinuxKernel() and BootNewLinuxKernel() by a new
  BootLinuxKernel() function (in assembly) that relocates the kernel
  to a given position and then boot it, using Relocator16Boot().
  Ideally the relocation should be done by a future boot relocator...

Implementation notes for Relocator16Boot():
===========================================

For setting the CPU state the function is based on a similar code as the
Int386() helper, namely it takes a pointer to REGS structure and pass
this information through the 32->16 bits call before setting the CPU state
in accordance.
New stack segment/pointer and code segment/pointer are also specified.
For passing these values through the 32->16 bits call the 16-bit BSS
memory offsets "BSS_CallbackReturn" and "BSS_RealModeEntry" (respectively)
are reused.
12 files changed:
boot/freeldr/freeldr/arch/i386/entry.S
boot/freeldr/freeldr/arch/i386/i386rtl.c
boot/freeldr/freeldr/arch/i386/linux.S
boot/freeldr/freeldr/arch/powerpc/mach.c
boot/freeldr/freeldr/arch/realmode/helpers.inc
boot/freeldr/freeldr/arch/realmode/i386.S
boot/freeldr/freeldr/arch/realmode/int386.inc
boot/freeldr/freeldr/arch/realmode/linux.inc [deleted file]
boot/freeldr/freeldr/include/arch/pc/pcbios.h
boot/freeldr/freeldr/include/arch/pc/x86common.h
boot/freeldr/freeldr/include/linux.h
boot/freeldr/freeldr/linuxboot.c