From brettstahlman at gmail.com Mon Jun 6 18:14:36 2016 From: brettstahlman at gmail.com (Brett Stahlman) Date: Mon, 6 Jun 2016 17:14:36 -0500 Subject: [Fw_Os_Forum] Why does UEFI firmware on x64 not initialize "long mode" GDT? Message-ID: Just inside my 64-bit x64 EFI boot loader, I print out the contents of the GDT to see how it was initialized by the firmware. I've tried running the boot loader both in QEMU (OVMF) and VMware ESXi. In both cases, the first 5 descriptors after the leading null descriptor look like this: 0x000000000000ffff Note all the leading zeroes: in particular, flags such as D/B and L being clear seem to suggest a GDT that's inappropriate for 64-bit long mode. I've verified by looking at CR* registers and such that the firmware has indeed placed me in IA32e "long mode" with identity paging. This is what I would expect, in light of section 2.3.4 in the UEFI spec. But why does the GDT have all leading 0's? Thanks, Brett S. From Aaron.Pop at congatec.com Mon Jun 6 18:30:04 2016 From: Aaron.Pop at congatec.com (Aaron.Pop at congatec.com) Date: Mon, 6 Jun 2016 15:30:04 -0700 Subject: [Fw_Os_Forum] Why does UEFI firmware on x64 not initialize "long mode" GDT? In-Reply-To: References: Message-ID: Hi Brett, Since this question is in relation to the EDK2's QEMU (OVMF) project, you might get a better answer by emailing the EDK2 development list. http://www.tianocore.org/docs/member-faq.html From: Brett Stahlman To: fw_os_forum at mailman.uefi.org Date: 06/06/2016 03:14 PM Subject: [Fw_Os_Forum] Why does UEFI firmware on x64 not initialize "long mode" GDT? Sent by: fw_os_forum-bounces at mailman.uefi.org Just inside my 64-bit x64 EFI boot loader, I print out the contents of the GDT to see how it was initialized by the firmware. I've tried running the boot loader both in QEMU (OVMF) and VMware ESXi. In both cases, the first 5 descriptors after the leading null descriptor look like this: 0x000000000000ffff Note all the leading zeroes: in particular, flags such as D/B and L being clear seem to suggest a GDT that's inappropriate for 64-bit long mode. I've verified by looking at CR* registers and such that the firmware has indeed placed me in IA32e "long mode" with identity paging. This is what I would expect, in light of section 2.3.4 in the UEFI spec. But why does the GDT have all leading 0's? Thanks, Brett S. _______________________________________________ Fw_os_forum mailing list Fw_os_forum at mailman.uefi.org http://lists.mailman.uefi.org/mailman/listinfo/fw_os_forum -------------- next part -------------- An HTML attachment was scrubbed... URL: From brettstahlman at gmail.com Mon Jun 6 18:54:04 2016 From: brettstahlman at gmail.com (Brett Stahlman) Date: Mon, 6 Jun 2016 17:54:04 -0500 Subject: [Fw_Os_Forum] Why does UEFI firmware on x64 not initialize "long mode" GDT? In-Reply-To: References: Message-ID: Aaron, Thanks. I'll probably do that, but I'd just like to be sure that my expectations are based on a correct understanding of the UEFI spec (and Intel docs). As I read the section on x64 handoff, a GDT descriptor value of 0x000000000000ffff makes no sense in a loader that's running in 64-bit long mode. For one thing, the P (Present) flag is clear for all segments. For another, the L (Long mode) flag is clear. I'm thinking it should be set, at least for code segments. As for code segments, there don't appear to be any, as all Type fields are 0. The UEFI spec says something about segments being effectively "unused" in 64-bit long mode, but even for "flat" mode, they have to be configured correctly, right? It's just hard for me to believe that 2 popular firmware implementation have gotten it so wrong... Hoping someone in this forum can tell me whether my understanding of the spec is flawed... Thanks, Brett S. On Mon, Jun 6, 2016 at 5:30 PM, wrote: > Hi Brett, > > Since this question is in relation to the EDK2's QEMU (OVMF) project, you > might get a better answer by emailing the EDK2 development list. > > http://www.tianocore.org/docs/member-faq.html > > > > > > > From: Brett Stahlman > To: fw_os_forum at mailman.uefi.org > Date: 06/06/2016 03:14 PM > Subject: [Fw_Os_Forum] Why does UEFI firmware on x64 not initialize > "long mode" GDT? > Sent by: fw_os_forum-bounces at mailman.uefi.org > ________________________________ > > > > Just inside my 64-bit x64 EFI boot loader, I print out the contents of > the GDT to see how it was initialized by the firmware. I've tried > running the boot loader both in QEMU (OVMF) and VMware ESXi. In both > cases, the first 5 descriptors after the leading null descriptor look > like this: > > 0x000000000000ffff > > Note all the leading zeroes: in particular, flags such as D/B and L > being clear seem to suggest a GDT that's inappropriate for 64-bit long > mode. I've verified by looking at CR* registers and such that the > firmware has indeed placed me in IA32e "long mode" with identity > paging. This is what I would expect, in light of section 2.3.4 in the > UEFI spec. But why does the GDT have all leading 0's? > > Thanks, > Brett S. > _______________________________________________ > Fw_os_forum mailing list > Fw_os_forum at mailman.uefi.org > http://lists.mailman.uefi.org/mailman/listinfo/fw_os_forum > >