diff options
-rw-r--r-- | x86/realmode.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/x86/realmode.c b/x86/realmode.c index 31f84d0..3518224 100644 --- a/x86/realmode.c +++ b/x86/realmode.c @@ -814,6 +814,26 @@ static void test_int(void) report("int 1", 0, 1); } +static void test_sti_inhibit(void) +{ + init_inregs(NULL); + + *(u32 *)(0x73 * 4) = 0x1000; /* Store IRQ 11 handler in the IDT */ + *(u8 *)(0x1000) = 0xcf; /* 0x1000 contains an IRET instruction */ + + MK_INSN(sti_inhibit, "cli\n\t" + "movw $0x200b, %dx\n\t" + "movl $1, %eax\n\t" + "outl %eax, %dx\n\t" /* Set IRQ11 */ + "movl $0, %eax\n\t" + "outl %eax, %dx\n\t" /* Clear IRQ11 */ + "sti\n\t" + "hlt\n\t"); + exec_in_big_real_mode(&insn_sti_inhibit); + + report("sti inhibit", ~0, 1); +} + static void test_imul(void) { MK_INSN(imul8_1, "mov $2, %al\n\t" @@ -1739,6 +1759,7 @@ void realmode_start(void) test_xchg(); test_iret(); test_int(); + test_sti_inhibit(); test_imul(); test_mul(); test_div(); |