diff options
Diffstat (limited to 'src/devices/oprom/x86_interrupts.c')
-rw-r--r-- | src/devices/oprom/x86_interrupts.c | 150 |
1 files changed, 83 insertions, 67 deletions
diff --git a/src/devices/oprom/x86_interrupts.c b/src/devices/oprom/x86_interrupts.c index 1dd645b421..86d20d7d2e 100644 --- a/src/devices/oprom/x86_interrupts.c +++ b/src/devices/oprom/x86_interrupts.c @@ -26,17 +26,7 @@ #include <console/console.h> #include <arch/io.h> #include <arch/registers.h> - -enum { - PCIBIOS_CHECK = 0xb101, - PCIBIOS_FINDDEV = 0xb102, - PCIBIOS_READCONFBYTE = 0xb108, - PCIBIOS_READCONFWORD = 0xb109, - PCIBIOS_READCONFDWORD = 0xb10a, - PCIBIOS_WRITECONFBYTE = 0xb10b, - PCIBIOS_WRITECONFWORD = 0xb10c, - PCIBIOS_WRITECONFDWORD = 0xb10d -}; +#include "x86.h" // errors go in AH. Just set these up so that word assigns // will work. KISS. @@ -48,9 +38,54 @@ enum { PCIBIOS_BADREG = 0x8700 }; -int int12_handler(struct eregs *regs); -int int1a_handler(struct eregs *regs); -int int15_handler(struct eregs *regs); +int int10_handler(struct eregs *regs) +{ + int res=-1; + static u8 cursor_row=0, cursor_col=0; + switch((regs->eax & 0xff00)>>8) { + case 0x01: // Set cursor shape + res = 0; + break; + case 0x02: // Set cursor position + if (cursor_row != ((regs->edx >> 8) & 0xff) || + cursor_col >= (regs->edx & 0xff)) { + printk(BIOS_INFO, "\n"); + } + cursor_row = (regs->edx >> 8) & 0xff; + cursor_col = regs->edx & 0xff; + res = 0; + break; + case 0x03: // Get cursor position + regs->eax &= 0x00ff; + regs->ecx = 0x0607; + regs->edx = (cursor_row << 8) | cursor_col; + res = 0; + break; + case 0x06: // Scroll up + printk(BIOS_INFO, "\n"); + res = 0; + break; + case 0x08: // Get Character and Mode at Cursor Position + regs->eax = 0x0f00 | 'A'; // White on black 'A' + res = 0; + break; + case 0x09: // Write Character and attribute + case 0x10: // Write Character + printk(BIOS_INFO, "%c", regs->eax & 0xff); + res = 0; + break; + case 0x0f: // Get video mode + regs->eax = 0x5002; //80x25 + regs->ebx &= 0x00ff; + res = 0; + break; + default: + printk(BIOS_WARNING, "Unknown INT10 function %04x!\n", + regs->eax & 0xffff); + break; + } + return res; +} int int12_handler(struct eregs *regs) { @@ -58,6 +93,26 @@ int int12_handler(struct eregs *regs) return 0; } +int int16_handler(struct eregs *regs) +{ + int res=-1; + switch((regs->eax & 0xff00)>>8) { + case 0x00: // Check for Keystroke + regs->eax = 0x6120; // Space Bar, Space + res = 0; + break; + case 0x01: // Check for Keystroke + regs->eflags |= 1<<6; // Zero Flag set (no key available) + res = 0; + break; + default: + printk(BIOS_WARNING, "Unknown INT16 function %04x!\n", + regs->eax & 0xffff); + break; + } + return res; +} + #define PCI_CONFIG_SPACE_TYPE1 (1 << 0) #define PCI_CONFIG_SPACE_TYPE2 (1 << 1) #define PCI_SPECIAL_CYCLE_TYPE1 (1 << 4) @@ -77,7 +132,7 @@ int int1a_handler(struct eregs *regs) u8 byte, reg; switch (func) { - case PCIBIOS_CHECK: + case 0xb101: /* PCIBIOS Check */ regs->edx = 0x20494350; /* ' ICP' */ regs->eax &= 0xffff0000; /* Clear AH / AL */ regs->eax |= PCI_CONFIG_SPACE_TYPE1 | PCI_SPECIAL_CYCLE_TYPE1; @@ -87,7 +142,7 @@ int int1a_handler(struct eregs *regs) regs->edi = 0x00000000; /* protected mode entry */ retval = 0; break; - case PCIBIOS_FINDDEV: + case 0xb102: /* Find Device */ devid = regs->ecx; vendorid = regs->edx; devindex = regs->esi; @@ -114,12 +169,12 @@ int int1a_handler(struct eregs *regs) retval = -1; } break; - case PCIBIOS_READCONFDWORD: - case PCIBIOS_READCONFWORD: - case PCIBIOS_READCONFBYTE: - case PCIBIOS_WRITECONFDWORD: - case PCIBIOS_WRITECONFWORD: - case PCIBIOS_WRITECONFBYTE: + case 0xb10a: /* Read Config Dword */ + case 0xb109: /* Read Config Word */ + case 0xb108: /* Read Config Byte */ + case 0xb10d: /* Write Config Dword */ + case 0xb10c: /* Write Config Word */ + case 0xb10b: /* Write Config Byte */ devfn = regs->ebx & 0xff; bus = regs->ebx >> 8; reg = regs->edi; @@ -133,27 +188,27 @@ int int1a_handler(struct eregs *regs) return retval; } switch (func) { - case PCIBIOS_READCONFBYTE: + case 0xb108: /* Read Config Byte */ byte = pci_read_config8(dev, reg); regs->ecx = byte; break; - case PCIBIOS_READCONFWORD: + case 0xb109: /* Read Config Word */ word = pci_read_config16(dev, reg); regs->ecx = word; break; - case PCIBIOS_READCONFDWORD: + case 0xb10a: /* Read Config Dword */ dword = pci_read_config32(dev, reg); regs->ecx = dword; break; - case PCIBIOS_WRITECONFBYTE: + case 0xb10b: /* Write Config Byte */ byte = regs->ecx; pci_write_config8(dev, reg, byte); break; - case PCIBIOS_WRITECONFWORD: + case 0xb10c: /* Write Config Word */ word = regs->ecx; pci_write_config16(dev, reg, word); break; - case PCIBIOS_WRITECONFDWORD: + case 0xb10d: /* Write Config Dword */ dword = regs->ecx; pci_write_config32(dev, reg, dword); break; @@ -178,42 +233,3 @@ int int1a_handler(struct eregs *regs) return retval; } -int int15_handler(struct eregs *regs) -{ - int res = -1; - - /* This int15 handler is Intel IGD. specific. Other chipsets need other - * handlers. The right way to do this is to move this handler code into - * the mainboard or northbridge code. - * TODO: completely move to mainboards / chipsets. - */ - switch (regs->eax & 0xffff) { - /* And now Intel IGD code */ -#define BOOT_DISPLAY_DEFAULT 0 -#define BOOT_DISPLAY_CRT (1 << 0) -#define BOOT_DISPLAY_TV (1 << 1) -#define BOOT_DISPLAY_EFP (1 << 2) -#define BOOT_DISPLAY_LCD (1 << 3) -#define BOOT_DISPLAY_CRT2 (1 << 4) -#define BOOT_DISPLAY_TV2 (1 << 5) -#define BOOT_DISPLAY_EFP2 (1 << 6) -#define BOOT_DISPLAY_LCD2 (1 << 7) - case 0x5f35: - regs->eax = 0x5f; - regs->ecx = BOOT_DISPLAY_DEFAULT; - res = 0; - break; - case 0x5f40: - regs->eax = 0x5f; - regs->ecx = 3; // This is mainboard specific - printk(BIOS_DEBUG, "DISPLAY=%x\n", regs->ecx); - res = 0; - break; - default: - printk(BIOS_DEBUG, "Unknown INT15 function %04x!\n", - regs->eax & 0xffff); - } - - return res; -} - |