efi/x86_64: leave long mode properly
commitae853e99a7aed22cb28b387e1e3cb32dbf1ab8fa
authorThomas Letan <thomas.letan@ssi.gouv.fr>
Sun, 6 Sep 2015 11:50:39 +0000 (6 07:50 -0400)
committerGene Cumm <gene.cumm@gmail.com>
Sun, 6 Sep 2015 11:51:26 +0000 (6 07:51 -0400)
treeb6381beb5bee75cbf41c921b2c624c0d4875651c
parent62f63cb7706974eba2c34dbea425bf2e9ede0f9e
efi/x86_64: leave long mode properly

Syslinux 6.03 (efi64) fails to boot a 32-bit kernel. The way Syslinux
leaves long mode in kernel_jump assembly routine does not follow AMD64
specifications. More precisely:
1. After setting a new GADT, `cs` has to be refresh by doing a long
jump, but it is not
2. Other segments have to be updated, but they are not
3. Disabling paging has to be done before disabling long mode, but the
implementation does the opposite

In most cases, a computer that tries to execute the kernel_jump routine
reboot (it can also hangs). This patch fixes the kernel_jump routine.

Signed-off-by: Thomas Letan <thomas.letan@ssi.gouv.fr>
Tested-by: Patrick Masotta <masottaus@yahoo.com>
Tested-by: Celelibi <celelibi@gmail.com>
efi/x86_64/linux.S