Interrupts should be enabled when calling 16bit code.
authorKevin O'Connor <kevin@koconnor.net>
Fri, 25 Sep 2009 01:01:16 +0000 (21:01 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Fri, 25 Sep 2009 01:01:16 +0000 (21:01 -0400)
Set most code paths to have interrupts on when calling 16bit code.
This fixes at least one optionrom that needed irqs on.

src/boot.c
src/optionroms.c
src/output.c
src/post.c
src/ramdisk.c
src/util.c

index b6afd351b524f9779c16d3d5e76b173c6d20757b..7b74007279c5e5c1556a43947acf83d4ef368464 100644 (file)
@@ -328,6 +328,7 @@ call_boot_entry(u16 bootseg, u16 bootip, u8 bootdrv)
 
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     br.code = SEGOFF(bootseg, bootip);
     // Set the magic number in ax and the boot drive in dl.
     br.dl = bootdrv;
@@ -344,6 +345,7 @@ boot_disk(u8 bootdrv, int checksig)
     // Read sector
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     br.dl = bootdrv;
     br.es = bootseg;
     br.ah = 2;
@@ -459,6 +461,7 @@ do_boot(u16 seq_nr)
     // Boot failed: invoke the boot recovery function
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     call16_int(0x18, &br);
 }
 
index 18526f4b57c2249413cc9fac59ba208157f60ba3..bdc0cb5f1247003eb4f6a0439aaf5e27a2d1c3e3 100644 (file)
@@ -87,6 +87,7 @@ __callrom(struct rom_header *rom, u16 offset, u16 bdf)
 
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     br.ax = bdf;
     br.bx = 0xffff;
     br.dx = 0xffff;
@@ -442,6 +443,7 @@ vga_setup()
     dprintf(1, "Turning on vga console\n");
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     br.ax = 0x0003;
     call16_int(0x10, &br);
 
index 6a164e1e6a0707aa6a9302862434847a43138441..da585b4f35b18f9266cb17ea93db4bf4831b0d15 100644 (file)
@@ -70,6 +70,7 @@ screenc(u8 c)
         return;
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     br.ah = 0x0e;
     br.al = c;
     call16_int(0x10, &br);
index c21b46e62547eeb1367dc2ef4f0cfa10c4928a7e..45a319df2f9e074b4f51c449ff6c1061dc040a3b 100644 (file)
@@ -227,5 +227,6 @@ _start()
     dprintf(3, "Jump to int19\n");
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     call16_int(0x19, &br);
 }
index 83aa7c4aabdf76cab70ab71a3e868338247c3516..36b9f2266b2fe739ecfd71ab1fc1519052229f68 100644 (file)
@@ -73,7 +73,7 @@ ramdisk_copy(struct disk_op_s *op, int iswrite)
     // Call int 1587 to copy data.
     struct bregs br;
     memset(&br, 0, sizeof(br));
-    br.flags = F_CF;
+    br.flags = F_CF|F_IF;
     br.ah = 0x87;
     br.es = GET_SEG(SS);
     br.si = (u32)gdt;
index 841c00a7ac3ecbd103dc5d79f0af4f1b423cc04c..c09b8515306623a51ea439b1e167b61f51d07ec7 100644 (file)
@@ -239,6 +239,7 @@ usleep(u32 usec)
 {
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     br.ah = 0x86;
     br.cx = usec >> 16;
     br.dx = usec;
@@ -251,6 +252,7 @@ check_for_keystroke()
 {
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     br.ah = 1;
     call16_int(0x16, &br);
     return !(br.flags & F_ZF);
@@ -262,6 +264,7 @@ get_raw_keystroke()
 {
     struct bregs br;
     memset(&br, 0, sizeof(br));
+    br.flags = F_IF;
     call16_int(0x16, &br);
     return br.ah;
 }