it's not pretty but this is working to get into mode 117 on the (private) tree I am using.
It's in the emulator. The 'entering emulator' is what you would see; the first X86EMU_exec is when we run the vga bios. src/devices/emulator/biosemu.c
The way it works is that I put an INT 10 at f0000, followed by a HLT. It's ok to scribble there because that is the 55aa signature for the expansion bios -- it's not needed any more, the BIOS is installed.
This appears to work. Tomorrow I'll try scribbling on the frame buffer and see how it goes.
As Jordan has pointed out,coreboot starts up so fast that I'm going to need to put a delay in to let the splash screen be visible. But this is important enough that it is worth doing.
Now I need a modern opteron laptop :-)
thanks ron printk_info("entering emulator\n");
X86EMU_exec();
printk_err("Done; now try to set the mode to x117\n"); X86_AX = 0x4f02; X86_BX = 0x117; X86_CX = 1; X86_DX = 0x0; X86_DI = 0; X86_EIP = 0x0000; X86_CS = initialcs;
/* Initialize stack and data segment */ X86_SS = initialcs; X86_SP = 0xfffe; X86_DS = 0x0040; X86_ES = 0x0000;
/* 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); #if 0 1 .code16 2 0000 CD10 int $0x10 3 0002 F4 hlt 4 0003 F4 hlt #endif MEM_WB(initialcs<<4+0, 0xCD); MEM_WB(initialcs<<4+1, 0x10); MEM_WB(initialcs<<4+2, 0xF4); MEM_WB(initialcs<<4+3, 0xF4); // MEM_WB(initialcs<<4+0, 0xF4); // X86EMU_trace_on();
printk_err("entering emulator\n");
X86EMU_exec(); printk_err("Mode should now be set\n"); #endif }