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

--
coreboot mailing list
[email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to