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 <ste...@coresystems.de>
Acked-by: Peter Stuge <pe...@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;


-- 
coreboot mailing list: coreboot@coreboot.org
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to