Author: stepan Date: 2009-10-25 20:50:47 +0100 (Sun, 25 Oct 2009) New Revision: 4852
Modified: trunk/coreboot-v2/util/x86emu/x86.c trunk/coreboot-v2/util/x86emu/x86_asm.S trunk/coreboot-v2/util/x86emu/x86_interrupts.c trunk/coreboot-v2/util/x86emu/yabel/compat/functions.c trunk/coreboot-v2/util/x86emu/yabel/io.c Log: Option ROM init x86/x86emu update
- use default display in int 15 5f35 - move REALMODE_BASE to 0x600, 0x500 can be BDA - add regparm for assembler functions - use memset instead of own implementation - YABEL: copy back the IVT, BDA and VBIOS. Some Xorg drivers require this. - YABEL: use hardware timer instead of emulated timer, because the emulated timer's base is never initialized (leading to division by zero if the timer is really used)
Signed-off-by: Stefan Reinauer stepan@coresystems.de Acked-by: Peter Stuge peter@stuge.se
Modified: trunk/coreboot-v2/util/x86emu/x86.c =================================================================== --- trunk/coreboot-v2/util/x86emu/x86.c 2009-10-24 22:52:33 UTC (rev 4851) +++ trunk/coreboot-v2/util/x86emu/x86.c 2009-10-25 19:50:47 UTC (rev 4852) @@ -29,7 +29,7 @@ #include <console.h> #endif
-#define REALMODE_BASE ((void *)0x500) +#define REALMODE_BASE ((void *)0x600)
struct realmode_idt { u16 offset, cs; @@ -41,8 +41,8 @@ extern unsigned char __realmode_code, __realmode_code_size; extern unsigned char __run_optionrom, __run_interrupt;
-void (*run_optionrom)(u32 devfn) = (void *)&__run_optionrom; -void (*vga_enable_console)(void) = (void *)&__run_interrupt; +void (*run_optionrom)(u32 devfn) __attribute__((regparm(0))) = (void *)&__run_optionrom; +void (*vga_enable_console)(void) __attribute__((regparm(0))) = (void *)&__run_interrupt;
int (*intXX_handler[256])(struct eregs *regs) = { NULL };
@@ -127,9 +127,7 @@ int i;
/* clear vga bios data area */ - for (i = 0x400; i < 0x500; i++) { - *(unsigned char *) i = 0; - } + memset(0x400, 0, 0x200); /* Set up C interrupt handlers */ setup_interrupt_handlers();
Modified: trunk/coreboot-v2/util/x86emu/x86_asm.S =================================================================== --- trunk/coreboot-v2/util/x86emu/x86_asm.S 2009-10-24 22:52:33 UTC (rev 4851) +++ trunk/coreboot-v2/util/x86emu/x86_asm.S 2009-10-25 19:50:47 UTC (rev 4852) @@ -17,7 +17,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
-#define REALMODE_BASE 0x500 +#define REALMODE_BASE 0x600 #define RELOCATED(x) (x - __realmode_code + REALMODE_BASE)
/* CR0 bits */
Modified: trunk/coreboot-v2/util/x86emu/x86_interrupts.c =================================================================== --- trunk/coreboot-v2/util/x86emu/x86_interrupts.c 2009-10-24 22:52:33 UTC (rev 4851) +++ trunk/coreboot-v2/util/x86emu/x86_interrupts.c 2009-10-25 19:50:47 UTC (rev 4852) @@ -206,6 +206,7 @@ regs->eax = 0x860f; break; /* 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) @@ -217,7 +218,7 @@
case 0x5f35: regs->eax = 0x5f; - regs->ecx = BOOT_DISPLAY_LCD|BOOT_DISPLAY_CRT; + regs->ecx = BOOT_DISPLAY_DEFAULT; res = 0; break; case 0x5f40:
Modified: trunk/coreboot-v2/util/x86emu/yabel/compat/functions.c =================================================================== --- trunk/coreboot-v2/util/x86emu/yabel/compat/functions.c 2009-10-24 22:52:33 UTC (rev 4851) +++ trunk/coreboot-v2/util/x86emu/yabel/compat/functions.c 2009-10-25 19:50:47 UTC (rev 4852) @@ -17,6 +17,7 @@ #ifndef CONFIG_COREBOOT_V2 #include <config.h> #endif +#include <string.h> #include <device/device.h>
#define VMEM_SIZE 1024 *1024 /* 1 MB */ @@ -33,6 +34,9 @@ void run_bios(struct device * dev, unsigned long addr) { biosemu(vmem, VMEM_SIZE, dev, addr); + memcpy(0x0, vmem + 0x0, 0x400); + memcpy(0x400, vmem + 0x400, 0x100); + memcpy(0xc0000, vmem + 0xc0000, 0x10000); }
u64 get_time(void)
Modified: trunk/coreboot-v2/util/x86emu/yabel/io.c =================================================================== --- trunk/coreboot-v2/util/x86emu/yabel/io.c 2009-10-24 22:52:33 UTC (rev 4851) +++ trunk/coreboot-v2/util/x86emu/yabel/io.c 2009-10-25 19:50:47 UTC (rev 4852) @@ -36,6 +36,9 @@ //defined in net-snk/kernel/timer.c extern u64 get_time(void);
+#ifdef COREBOOT_V2 +#include <arch/io.h> +#else // these are not used, only needed for linking, must be overridden using X86emu_setupPioFuncs // with the functions and struct below void @@ -82,7 +85,7 @@ HALT_SYS(); return 0; } - +#endif u32 pci_cfg_read(X86EMU_pioAddr addr, u8 size); void pci_cfg_write(X86EMU_pioAddr addr, u32 val, u8 size); u8 handle_port_61h(void); @@ -106,7 +109,8 @@ switch (addr) { case 0x61: //8254 KB Controller / Timer Port - rval = handle_port_61h(); + // rval = handle_port_61h(); + rval = inb(0x61); //DEBUG_PRINTF_IO("%s(%04x) KB / Timer Port B --> %02x\n", __func__, addr, rval); return rval; break;