aboutsummaryrefslogtreecommitdiff
path: root/src/system.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2014-04-19 12:22:22 -0400
committerKevin O'Connor <kevin@koconnor.net>2014-05-06 12:10:36 -0400
commit6c68e7adfa6255268a80522ea39dfef4aa20ca70 (patch)
treefe7f741029166626daf5d21930d1f499ac37dcda /src/system.c
parentd85c22e44ee4e24f2be19d579ea8fa0066a85fbb (diff)
downloadseabios-hppa-6c68e7adfa6255268a80522ea39dfef4aa20ca70.zip
seabios-hppa-6c68e7adfa6255268a80522ea39dfef4aa20ca70.tar.gz
seabios-hppa-6c68e7adfa6255268a80522ea39dfef4aa20ca70.tar.bz2
If an int 1587 call is made from an option rom, stay in bigreal mode.
Modify the int 1587 handler to check if the POST phase is still running. If it is, use bigreal mode segment limits so that the caller remains in bigreal mode when the 1587 handler completes. This helps with SeaVGABIOS' use of "direct" framebuffer accesses (an option rom may attempt to display text during its option rom execution which can cause SeaVGABIOS to make the int 1587 calls). Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/system.c')
-rw-r--r--src/system.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/system.c b/src/system.c
index 5d10cc8..3cb2228 100644
--- a/src/system.c
+++ b/src/system.c
@@ -115,12 +115,13 @@ handle_1587(struct bregs *regs)
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(