aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2014-05-08 18:32:32 -0400
committerKevin O'Connor <kevin@koconnor.net>2014-05-08 18:44:35 -0400
commit3fcabf0281bb89f3e54d4f2ffad14fca22def6ae (patch)
treefde3f0515b943a425530084381700e9f5c0f2b0e
parent9d0d08c8debe560eadec5079def966874e90f026 (diff)
downloadseabios-3fcabf0281bb89f3e54d4f2ffad14fca22def6ae.zip
seabios-3fcabf0281bb89f3e54d4f2ffad14fca22def6ae.tar.gz
seabios-3fcabf0281bb89f3e54d4f2ffad14fca22def6ae.tar.bz2
Fix int 1589 calls when CONFIG_ENTRY_EXTRASTACK is enabled.
The int 1589 call is entered in real mode and returns in protected mode. However, the code to use the "extra stack" does not support that. Fix this by never using the "extra stack" on int 1589 calls. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--src/post.c2
-rw-r--r--src/romlayout.S10
-rw-r--r--src/system.c4
3 files changed, 13 insertions, 3 deletions
diff --git a/src/post.c b/src/post.c
index 0d9e66f..0fdd28e 100644
--- a/src/post.c
+++ b/src/post.c
@@ -61,7 +61,7 @@ ivt_init(void)
SET_IVT(0x12, FUNC16(entry_12));
SET_IVT(0x13, FUNC16(entry_13_official));
SET_IVT(0x14, FUNC16(entry_14));
- SET_IVT(0x15, FUNC16(entry_15));
+ SET_IVT(0x15, FUNC16(entry_15_official));
SET_IVT(0x16, FUNC16(entry_16));
SET_IVT(0x17, FUNC16(entry_17));
SET_IVT(0x18, FUNC16(entry_18));
diff --git a/src/romlayout.S b/src/romlayout.S
index f6b7979..57e8bcc 100644
--- a/src/romlayout.S
+++ b/src/romlayout.S
@@ -378,6 +378,12 @@ entry_pcibios16:
ENTRY_ARG handle_pcibios
iretw
+// int 1589 entry point
+ DECLFUNC entry_1589
+entry_1589:
+ ENTRY_ARG handle_1589
+ iretw
+
// BIOS32 support
.code32
DECLFUNC entry_bios32
@@ -682,6 +688,10 @@ entry_10_0x0f:
IRQ_ENTRY_ARG 11
ORG 0xf859
+ .global entry_15_official
+entry_15_official:
+ cmpb $0x89, %ah
+ je entry_1589 // 1589 calls return in protected mode
IRQ_ENTRY_ARG 15
// 0xfa6e - vgafont8 in font.c
diff --git a/src/system.c b/src/system.c
index 3cb2228..756dc31 100644
--- a/src/system.c
+++ b/src/system.c
@@ -191,9 +191,10 @@ handle_1588(struct bregs *regs)
}
// Switch to protected mode
-static void
+void VISIBLE16
handle_1589(struct bregs *regs)
{
+ debug_enter(regs, DEBUG_HDL_15);
set_a20(1);
pic_reset(regs->bl, regs->bh);
@@ -355,7 +356,6 @@ handle_15(struct bregs *regs)
case 0x86: handle_1586(regs); break;
case 0x87: handle_1587(regs); break;
case 0x88: handle_1588(regs); break;
- case 0x89: handle_1589(regs); break;
case 0x90: handle_1590(regs); break;
case 0x91: handle_1591(regs); break;
case 0xc0: handle_15c0(regs); break;