aboutsummaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2015-05-21 00:30:07 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2015-05-21 11:44:57 +0200
commit7cadd5a6fbdbf078c2e6a4d59dcb5e5e2371406e (patch)
tree05d10e9f3c96176752f71d5cea34b7fb695a1f35 /main.c
parent3d3a334ec62c68c07ef45f144c77b8ac5c2835bf (diff)
downloadqboot-7cadd5a6fbdbf078c2e6a4d59dcb5e5e2371406e.zip
qboot-7cadd5a6fbdbf078c2e6a4d59dcb5e5e2371406e.tar.gz
qboot-7cadd5a6fbdbf078c2e6a4d59dcb5e5e2371406e.tar.bz2
setup pic
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'main.c')
-rw-r--r--main.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/main.c b/main.c
index ed871df..5ef38cf 100644
--- a/main.c
+++ b/main.c
@@ -45,11 +45,34 @@ static void set_realmode_int(int vec, void *p)
realmode_idt[vec * 2 + 1] = flat_to_seg16((uintptr_t) p);
}
+static void setup_pic(void)
+{
+ /* Send ICW1 (select OCW1 + will send ICW4) */
+ outb(0x20, 0x11);
+ outb(0xa0, 0x11);
+ /* Send ICW2 (base irqs: 0x08-0x0f for irq0-7, 0x70-0x77 for irq8-15) */
+ outb(0x21, 8);
+ outb(0xa1, 0x70);
+ /* Send ICW3 (cascaded pic ids) */
+ outb(0x21, 0x04);
+ outb(0xa1, 0x02);
+ /* Send ICW4 (enable 8086 mode) */
+ outb(0x21, 0x01);
+ outb(0xa1, 0x01);
+ /* Mask all irqs (except cascaded PIC2 irq) */
+ outb(0x21, ~(1 << 2));
+ outb(0xa1, ~0);
+}
+
static void setup_idt(void)
{
int i;
for (i = 0; i < 0x1f; i++)
set_realmode_int(i, bios_intfake);
+ for (i = 8; i < 16; i++)
+ set_realmode_int(i, bios_irq);
+ for (i = 0x70; i < 0x78; i++)
+ set_realmode_int(i, bios_irq);
set_realmode_int(0x10, bios_int10);
set_realmode_int(0x15, bios_int15);
}
@@ -57,6 +80,7 @@ static void setup_idt(void)
int main(void)
{
make_bios_writable();
+ setup_pic();
setup_idt();
// extract_acpi();
// extract_e820();