|
本帖最后由 wintoflash 于 2023-5-7 12:04 编辑
逻辑似乎有误。是否支持 Handover 是可以判断出来的
- struct linux_kernel_header
- {
- ...
- unsigned short version; // 协议版本
- ...
- #define LINUX_XLF_KERNEL_64 (1<<0) // 64位内核
- #define LINUX_XLF_CAN_BE_LOADED_ABOVE_4G (1<<1)
- #define LINUX_XLF_EFI_HANDOVER_32 (1<<2) // 支持 EFI32 Handover
- #define LINUX_XLF_EFI_HANDOVER_64 (1<<3) // 支持 EFI64 Handover
- #define LINUX_XLF_EFI_KEXEC (1<<4)
- unsigned short xloadflags;
- ...
- unsigned int handover_offset; // Handover 入口,没有那就不支持 Handover
- } __attribute__ ((packed));
复制代码
伪代码:
- struct linux_kernel_header lh;
- grub_read (kernel, filemax, ...);
- memcpy (&lh, kernel, sizeof (lh));
- ...
- if (lh.version < 0x020b)
- goto LoadFile2Boot;
- if (!lh.handover_offset)
- goto LoadFile2Boot;
- if (IS_UEFI_32 && (lh.xloadflags & LINUX_XLF_KERNEL_64) && !(lh.xloadflags & LINUX_XLF_EFI_HANDOVER_32))
- goto LoadFile2Boot;
- if (IS_UEFI_64 && !(lh.xloadflags & LINUX_XLF_KERNEL_64))
- goto LoadFile2Boot;
- goto EfiHandoverBoot;
复制代码
|
|