does not work yet.. sorry :-( git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1119 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
		
			
				
	
	
		
			138 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <types.h>
 | 
						|
#include <io.h>
 | 
						|
#include <x86emu.h>
 | 
						|
#include <x86glue.h>
 | 
						|
 | 
						|
void printk(const char *fmt, ...);
 | 
						|
void x86emu_dump_xregs(void);
 | 
						|
void pci_init(void);
 | 
						|
 | 
						|
int int10_handler(void);
 | 
						|
int int1a_handler(void);
 | 
						|
 | 
						|
void pushw(u16 val);
 | 
						|
unsigned char biosmem[1024 * 1024];
 | 
						|
int verbose = 0;
 | 
						|
 | 
						|
u8 x_inb(u16 port)
 | 
						|
{
 | 
						|
	return inb(port);
 | 
						|
}
 | 
						|
 | 
						|
u16 x_inw(u16 port)
 | 
						|
{
 | 
						|
	return inw(port);
 | 
						|
}
 | 
						|
 | 
						|
u32 x_inl(u16 port)
 | 
						|
{
 | 
						|
	return inb(port);
 | 
						|
}
 | 
						|
 | 
						|
void x_outb(u16 port, u8 val)
 | 
						|
{
 | 
						|
	outb(port, val);
 | 
						|
}
 | 
						|
 | 
						|
void x_outw(u16 port, u16 val)
 | 
						|
{
 | 
						|
	outb(port, val);
 | 
						|
}
 | 
						|
 | 
						|
void x_outl(u16 port, u32 val)
 | 
						|
{
 | 
						|
	outb(port, val);
 | 
						|
}
 | 
						|
 | 
						|
X86EMU_pioFuncs myfuncs = {
 | 
						|
	x_inb, x_inw, x_inl,
 | 
						|
	x_outb, x_outw, x_outl
 | 
						|
};
 | 
						|
 | 
						|
void irq_multiplexer(int num)
 | 
						|
{
 | 
						|
	int ret = 0;
 | 
						|
	switch (num) {
 | 
						|
	case 0x10:
 | 
						|
	case 0x42:
 | 
						|
	case 0x6d:
 | 
						|
		ret = int10_handler();
 | 
						|
		break;
 | 
						|
	case 0x1a:
 | 
						|
		ret = int1a_handler();
 | 
						|
		break;
 | 
						|
	default:
 | 
						|
		break;
 | 
						|
	}
 | 
						|
 | 
						|
	if (!ret) {
 | 
						|
		printk("int%x not implemented\n", num);
 | 
						|
		x86emu_dump_xregs();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
ptr current = 0;                                                                                                                   
 | 
						|
int startrom(unsigned char *addr)
 | 
						|
{
 | 
						|
	X86EMU_intrFuncs intFuncs[256];
 | 
						|
	void X86EMU_setMemBase(void *base, size_t size);
 | 
						|
	int trace = 1;
 | 
						|
	int i;
 | 
						|
	
 | 
						|
	int devfn=0x18; // FIXME
 | 
						|
	int size=64*1024; // FIXME
 | 
						|
	int initialcs=0xc000;
 | 
						|
	int initialip=0x0003; 
 | 
						|
	int base=0xc0000;
 | 
						|
 | 
						|
	X86EMU_setMemBase(biosmem, sizeof(biosmem));
 | 
						|
	X86EMU_setupPioFuncs(&myfuncs);
 | 
						|
	pci_init();
 | 
						|
	for (i = 0; i < 256; i++)
 | 
						|
		intFuncs[i] = irq_multiplexer;
 | 
						|
	X86EMU_setupIntrFuncs(intFuncs);
 | 
						|
 | 
						|
	
 | 
						|
	current->ax = devfn ? devfn : 0xff; // FIXME
 | 
						|
	/* above we need to search the device on the bus */
 | 
						|
	
 | 
						|
	current->dx = 0x80;
 | 
						|
	//      current->ip = 0;
 | 
						|
 | 
						|
	for (i = 0; i < size; i++)
 | 
						|
		wrb(base + i, addr[i]);
 | 
						|
 | 
						|
	/* cpu setup */
 | 
						|
	X86_AX = devfn ? devfn : 0xff;
 | 
						|
	X86_DX = 0x80;
 | 
						|
	X86_EIP = initialip;
 | 
						|
	X86_CS = initialcs;
 | 
						|
 | 
						|
	/* Initialize stack and data segment */
 | 
						|
	X86_SS = 0x0030;
 | 
						|
	X86_DS = 0x0040;
 | 
						|
	X86_SP = 0xfffe;
 | 
						|
 | 
						|
	/* We need a sane way to return from bios
 | 
						|
	 * execution. A hlt instruction and a pointer
 | 
						|
	 * to it, both kept on the stack, will do.
 | 
						|
	 */
 | 
						|
 | 
						|
	pushw(0xf4f4);		/* hlt; hlt */
 | 
						|
	pushw(X86_SS);
 | 
						|
	pushw(X86_SP + 2);
 | 
						|
 | 
						|
	X86_ES = 0x0000;
 | 
						|
 | 
						|
	if (trace) {
 | 
						|
		printk("Switching to single step mode.\n");
 | 
						|
		X86EMU_trace_on();
 | 
						|
	}
 | 
						|
 | 
						|
	X86EMU_exec();
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 |