File seabios-preXX-enable-irq-in-spin-functions.patch of Package kvm
commit 68c51390e3c78ed4a5b012d9097007f7cb0b8bbe
Author: Kevin O'Connor <kevin@koconnor.net>
Date: Sat Mar 13 22:23:44 2010 -0500
Enable irqs in kbd/clock calls that caller might "spin" on.
Some old programs will spin on a clock/keyboard call with irqs
disabled. They assume the BIOS will enable irqs and allow key events
and clock events to occur.
So, enable irqs in those functions that a caller might "spin" on.
Index: qemu-kvm-0.12.3/roms/seabios/src/clock.c
===================================================================
--- qemu-kvm-0.12.3.orig/roms/seabios/src/clock.c
+++ qemu-kvm-0.12.3/roms/seabios/src/clock.c
@@ -228,6 +228,7 @@ timer_setup(void)
static void
handle_1a00(struct bregs *regs)
{
+ yield();
u32 ticks = GET_BDA(timer_counter);
regs->cx = ticks >> 16;
regs->dx = ticks;
Index: qemu-kvm-0.12.3/roms/seabios/src/kbd.c
===================================================================
--- qemu-kvm-0.12.3.orig/roms/seabios/src/kbd.c
+++ qemu-kvm-0.12.3/roms/seabios/src/kbd.c
@@ -73,6 +73,7 @@ enqueue_key(u8 scan_code, u8 ascii_code)
static void
dequeue_key(struct bregs *regs, int incr, int extended)
{
+ yield();
u16 buffer_head;
u16 buffer_tail;
for (;;) {
@@ -126,6 +127,7 @@ handle_1601(struct bregs *regs)
static void
handle_1602(struct bregs *regs)
{
+ yield();
regs->al = GET_BDA(kbd_flag0);
}
@@ -184,6 +186,7 @@ handle_1611(struct bregs *regs)
static void
handle_1612(struct bregs *regs)
{
+ yield();
regs->al = GET_BDA(kbd_flag0);
regs->ah = ((GET_BDA(kbd_flag1) & ~(KF2_RCTRL|KF2_RALT))
| (GET_BDA(kbd_flag2) & (KF2_RCTRL|KF2_RALT)));