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

Kevin O'Connor kevin at koconnor.net
Wed Aug 6 02:34:21 CEST 2008


On Tue, Aug 05, 2008 at 12:50:54PM +0800, Zhang Rui wrote:
> Hello,
> 	I am blocked with calling interrupt in coreboot.
> 	I tryed these ways:
> 	1. use "asm("int $0x19 \n");".  Qemu has no output when executeed
> here and nothing happens. The reason is that it should jump to real
> mode before calling int 19.

Right.  You'd need to call "int 0x19" after transitioning to real
mode.

> 	2. write a function boot_coreboot() in seabios. like:
> 
> 	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");
> 	}
> 	
> 	then call boot_coreboot() in seabios. It booted successfully.
> 
> 	I have read the source code of call16_int, it jump to real mode and
> jump to the int 19 handler function directly, but do not use "int
> $0x19" asm code. why?

No.  The call_int16(0x19, ...) function will call irq_trampoline_0x19
in real mode (see src/util.h).  The irq_trampoline_0x19 code is
defined in src/romlayout.S (see macro "IRQ_TRAMPOLINE 19") which runs
"int 0x19".

> 	3. write asm code to jump to real mode and call int 19.
> 	but in coreboot there is compiling errors when I write asm codes with
> lables in it in vm86.c.
> 	for a simple example:
> 	__asm__ __volatile__ (
> 			/* paranoia -- does ecx get saved? not sure. This is
> 			 * the easiest safe thing to do. */
> 			"	pushal			\n"
> 			"	ljmp 	$0x28, $cbint16bit\n"
> 			"cbint16bit:		\n"
> 			"	.code16			\n"
> 			"	popal\n"
> 			);
> 
> 	will cause errors:
> 	{standard input}: Assembler messages:
> 	{standard input}:746: Error: symbol `cbint16bit' is already defined
> 	
> 	in seabios there is compiling errors because of ".code16":
> 	out/../src/post.c:349: relocation truncated to fit: R_386_16 against `.text'
> 
> 	what is wrong here?

I'm guessing you didn't issue a ".code32" after the ".code16".  Not
putting the assembler back into 32bit mode will totally confuse it.

Also, you may be running into trouble with the segmented memory model
- the 32bit code runs at 0xfxxxx and uses 32bit offsets, while the
16bit code runs at 0xf000:xxxx and uses 16bit offsets.

I'm not sure why you'd want to do this in seabios though - option 2
above would be the preferred way to call int19.

-Kevin




More information about the coreboot mailing list