[coreboot] How can I call the interrupt of SeaBIOS in coreboot?

Zhang Rui zrfail at gmail.com
Thu Jul 17 03:50:17 CEST 2008


2008/7/16 Stefan Reinauer <stepan at coresystems.de>:
> Zhang Rui wrote:
>> Hello Kevin,
>>
>> I can use SeaBIOS to initialize vga and return to coreboot now.
>>
>> But when I returned to coreboot and call int19, nothing happens.
>> It can boot correctly when call int19 in SeaBIOS.
>> Maybe it has something to do with the stack?
>> How can I call the interrupt of SeaBIOS in coreboot?
>>
> How are you doing this currently?
> Maybe coreboot-v2/src/mainboard/via/epia-m/vgabios.c:void
> vga_enable_console()
> (around line 233) helps?
to use SeaBIOS to initialize vga, refer to
http://www.coreboot.org/pipermail/coreboot/2008-July/036593.html
to return to coreboot from SeaBIOS, refer to
http://www.coreboot.org/pipermail/coreboot/2008-July/036620.html

For calling int19 in coreboot, I wrote a function in SeaBIOS:
	void VISIBLE32 boot_coreboot()
	{
		struct bregs br;
		dprintf(1, "boot_coreboot: begin\n");
		memset(&br, 0, sizeof(br));
		dprintf(1, "boot_coreboot: call int 19\n");
		call16_int(0x19, &br);
		dprintf(1, "boot_coreboot: end\n");
	}
and then use run_address() to execute this boot_coreboot() function in coreboot.

I will read coreboot-v2/src/mainboard/via/epia-m/vgabios.c:void
vga_enable_console() to see if it can help.



>>> But pci_dev_init() is executed more than one time so vga is
>>> initialized more than one time in SeaBIOS. A flag variable would be
>>> used to run SeaBIOS only once.
>>>
>>>
>> This is fixed now.
>>
>
> How are you doing it? I think the correct way is to only initialize one
> given device for every call into the init function.
>
I inserted some codes at the beginning of run_seabios() which I wrote in vm86.c:
	static int entered = 0;
	if (1 == entered)
		return;
	entered = 1;
So run_seabios() will run only once.

And original pci_dev_init() function in pci_device.c can not execute
to the run_bios() function, so I modified it to the following code:

	void pci_dev_init(struct device *dev)
	{
		printk(BIOS_SPEW, "PCI: pci_dev_init\n");
	#if 0
	#ifdef CONFIG_PCI_OPTION_ROM_RUN
		void run_bios(struct device *dev, unsigned long addr);
		struct rom_header *rom, *ram;

		printk(BIOS_INFO, "Probing for option ROM\n");
		rom = pci_rom_probe(dev);
		if (rom == NULL)
			return;
		ram = pci_rom_load(dev, rom);
		if (ram == NULL)
			return;
		run_bios(dev, (unsigned long)ram);
	#endif
	#else
	#ifdef CONFIG_PCI_OPTION_ROM_RUN
		//zhang rui
		void run_seabios();
		run_seabios();
	#endif
	#endif
	}

Is this OK?


Zhang Rui




More information about the coreboot mailing list