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> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4852 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
committed by
Stefan Reinauer
parent
46a895e633
commit
074356ec81
@ -29,7 +29,7 @@
|
|||||||
#include <console.h>
|
#include <console.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define REALMODE_BASE ((void *)0x500)
|
#define REALMODE_BASE ((void *)0x600)
|
||||||
|
|
||||||
struct realmode_idt {
|
struct realmode_idt {
|
||||||
u16 offset, cs;
|
u16 offset, cs;
|
||||||
@ -41,8 +41,8 @@ extern unsigned char __idt_handler, __idt_handler_size;
|
|||||||
extern unsigned char __realmode_code, __realmode_code_size;
|
extern unsigned char __realmode_code, __realmode_code_size;
|
||||||
extern unsigned char __run_optionrom, __run_interrupt;
|
extern unsigned char __run_optionrom, __run_interrupt;
|
||||||
|
|
||||||
void (*run_optionrom)(u32 devfn) = (void *)&__run_optionrom;
|
void (*run_optionrom)(u32 devfn) __attribute__((regparm(0))) = (void *)&__run_optionrom;
|
||||||
void (*vga_enable_console)(void) = (void *)&__run_interrupt;
|
void (*vga_enable_console)(void) __attribute__((regparm(0))) = (void *)&__run_interrupt;
|
||||||
|
|
||||||
int (*intXX_handler[256])(struct eregs *regs) = { NULL };
|
int (*intXX_handler[256])(struct eregs *regs) = { NULL };
|
||||||
|
|
||||||
@ -127,9 +127,7 @@ void run_bios(struct device *dev, unsigned long addr)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* clear vga bios data area */
|
/* clear vga bios data area */
|
||||||
for (i = 0x400; i < 0x500; i++) {
|
memset(0x400, 0, 0x200);
|
||||||
*(unsigned char *) i = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set up C interrupt handlers */
|
/* Set up C interrupt handlers */
|
||||||
setup_interrupt_handlers();
|
setup_interrupt_handlers();
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
|
* 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)
|
#define RELOCATED(x) (x - __realmode_code + REALMODE_BASE)
|
||||||
|
|
||||||
/* CR0 bits */
|
/* CR0 bits */
|
||||||
|
@ -206,6 +206,7 @@ int int15_handler(struct eregs *regs)
|
|||||||
regs->eax = 0x860f;
|
regs->eax = 0x860f;
|
||||||
break;
|
break;
|
||||||
/* And now Intel IGD code */
|
/* And now Intel IGD code */
|
||||||
|
#define BOOT_DISPLAY_DEFAULT 0
|
||||||
#define BOOT_DISPLAY_CRT (1 << 0)
|
#define BOOT_DISPLAY_CRT (1 << 0)
|
||||||
#define BOOT_DISPLAY_TV (1 << 1)
|
#define BOOT_DISPLAY_TV (1 << 1)
|
||||||
#define BOOT_DISPLAY_EFP (1 << 2)
|
#define BOOT_DISPLAY_EFP (1 << 2)
|
||||||
@ -217,7 +218,7 @@ int int15_handler(struct eregs *regs)
|
|||||||
|
|
||||||
case 0x5f35:
|
case 0x5f35:
|
||||||
regs->eax = 0x5f;
|
regs->eax = 0x5f;
|
||||||
regs->ecx = BOOT_DISPLAY_LCD|BOOT_DISPLAY_CRT;
|
regs->ecx = BOOT_DISPLAY_DEFAULT;
|
||||||
res = 0;
|
res = 0;
|
||||||
break;
|
break;
|
||||||
case 0x5f40:
|
case 0x5f40:
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#ifndef CONFIG_COREBOOT_V2
|
#ifndef CONFIG_COREBOOT_V2
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <string.h>
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
|
|
||||||
#define VMEM_SIZE 1024 *1024 /* 1 MB */
|
#define VMEM_SIZE 1024 *1024 /* 1 MB */
|
||||||
@ -33,6 +34,9 @@ u32 biosemu(u8 *biosmem, u32 biosmem_size, struct device *dev,
|
|||||||
void run_bios(struct device * dev, unsigned long addr)
|
void run_bios(struct device * dev, unsigned long addr)
|
||||||
{
|
{
|
||||||
biosemu(vmem, VMEM_SIZE, dev, 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)
|
u64 get_time(void)
|
||||||
|
@ -36,6 +36,9 @@ extern int write_io(void *, unsigned int, size_t);
|
|||||||
//defined in net-snk/kernel/timer.c
|
//defined in net-snk/kernel/timer.c
|
||||||
extern u64 get_time(void);
|
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
|
// these are not used, only needed for linking, must be overridden using X86emu_setupPioFuncs
|
||||||
// with the functions and struct below
|
// with the functions and struct below
|
||||||
void
|
void
|
||||||
@ -82,7 +85,7 @@ inl(u16 port)
|
|||||||
HALT_SYS();
|
HALT_SYS();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
u32 pci_cfg_read(X86EMU_pioAddr addr, u8 size);
|
u32 pci_cfg_read(X86EMU_pioAddr addr, u8 size);
|
||||||
void pci_cfg_write(X86EMU_pioAddr addr, u32 val, u8 size);
|
void pci_cfg_write(X86EMU_pioAddr addr, u32 val, u8 size);
|
||||||
u8 handle_port_61h(void);
|
u8 handle_port_61h(void);
|
||||||
@ -106,7 +109,8 @@ my_inb(X86EMU_pioAddr addr)
|
|||||||
switch (addr) {
|
switch (addr) {
|
||||||
case 0x61:
|
case 0x61:
|
||||||
//8254 KB Controller / Timer Port
|
//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);
|
//DEBUG_PRINTF_IO("%s(%04x) KB / Timer Port B --> %02x\n", __func__, addr, rval);
|
||||||
return rval;
|
return rval;
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user