#define PORT_MATH_CLEAR 0x00f0
+// Indicator if POST phase has been started (and if it has completed).
+int HaveRunPost VARFSEG;
+
+int
+in_post(void)
+{
+ return GET_GLOBAL(HaveRunPost) == 1;
+}
+
/****************************************************************
* Misc 16bit ISRs
#include "string.h" // memset
#include "util.h" // dma_setup
-// Indicator if POST phase has been run.
-int HaveRunPost VARFSEG;
-
// Handler for post calls that look like a resume.
void VISIBLE16
handle_resume(void)
SET_FARVAR(gdt_seg, gdt_far[1], GDT_DATA | GDT_LIMIT((6*sizeof(u64))-1)
| GDT_BASE(loc));
// Initialize CS descriptor
- SET_FARVAR(gdt_seg, gdt_far[4], GDT_CODE | GDT_LIMIT(BUILD_BIOS_SIZE-1)
- | GDT_BASE(BUILD_BIOS_ADDR));
+ u64 lim = GDT_LIMIT(0x0ffff);
+ if (in_post())
+ lim = GDT_GRANLIMIT(0xffffffff);
+ SET_FARVAR(gdt_seg, gdt_far[4], GDT_CODE | lim | GDT_BASE(BUILD_BIOS_ADDR));
// Initialize SS descriptor
loc = (u32)MAKE_FLATPTR(GET_SEG(SS), 0);
- SET_FARVAR(gdt_seg, gdt_far[5], GDT_DATA | GDT_LIMIT(0x0ffff)
- | GDT_BASE(loc));
+ SET_FARVAR(gdt_seg, gdt_far[5], GDT_DATA | lim | GDT_BASE(loc));
u16 count = regs->cx;
asm volatile(