diff mbox

[Qemu-devel] E5-2620v2 - emulation stop error

Message ID 20150325230259.GA29924@morn.localdomain (mailing list archive)
State New, archived
Headers show

Commit Message

Kevin O'Connor March 25, 2015, 11:02 p.m. UTC
On Thu, Mar 26, 2015 at 01:31:11AM +0300, Andrey Korolyov wrote:
> On Wed, Mar 25, 2015 at 11:54 PM, Kevin O'Connor <kevin@koconnor.net> wrote:
> >
> > Can you add something like:
> >
> >   -chardev file,path=seabioslog.`date +%s`,id=seabios -device isa-debugcon,iobase=0x402,chardev=seabios
> >
> > to the qemu command line and forward the resulting log from both a
> > succesful boot and a failed one?
> >
> > -Kevin
> 
> Of course, logs are attached.

Thanks.  From a diff of the two logs:

     4: 000000003ffe0000 - 0000000040000000 = 2 RESERVED
     5: 00000000feffc000 - 00000000ff000000 = 2 RESERVED
     6: 00000000fffc0000 - 0000000100000000 = 2 RESERVED
  -enter handle_19:
  -  NULL
  -Booting from Hard Disk...
  -Booting from 0000:7c00

So, it got most of the way through the reboot - there's only a few
function calls between the e820 map being dumped and the handle_19
call.  The fault also seems to show it stopped in the BIOS in 16bit
mode:

> EIP=0000d331 EFL=00010202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
> ES =0000 00000000 0000ffff 00009300
> CS =f000 000f0000 0000ffff 00009b00

Can you add the patch below, force the fault, and forward the log.

Also, if you recreate the failure can you take the EIP from the fault
(eg, d331) and search for the corresponding function in the output of:
  objdump -m i386 -M i8086 -M suffix -ldr out/rom16.o | less
(That is, search for "d331:".)  If that's too much of a pain, just
send me a direct email with the seabios out/rom16.o file and the new
EIP of the fault.  (I need the out/rom16.o that was used to build the
version of SeaBIOS that faulted.)

-Kevin


--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Andrey Korolyov March 25, 2015, 11:35 p.m. UTC | #1
On Thu, Mar 26, 2015 at 2:02 AM, Kevin O'Connor <kevin@koconnor.net> wrote:
> On Thu, Mar 26, 2015 at 01:31:11AM +0300, Andrey Korolyov wrote:
>> On Wed, Mar 25, 2015 at 11:54 PM, Kevin O'Connor <kevin@koconnor.net> wrote:
>> >
>> > Can you add something like:
>> >
>> >   -chardev file,path=seabioslog.`date +%s`,id=seabios -device isa-debugcon,iobase=0x402,chardev=seabios
>> >
>> > to the qemu command line and forward the resulting log from both a
>> > succesful boot and a failed one?
>> >
>> > -Kevin
>>
>> Of course, logs are attached.
>
> Thanks.  From a diff of the two logs:
>
>      4: 000000003ffe0000 - 0000000040000000 = 2 RESERVED
>      5: 00000000feffc000 - 00000000ff000000 = 2 RESERVED
>      6: 00000000fffc0000 - 0000000100000000 = 2 RESERVED
>   -enter handle_19:
>   -  NULL
>   -Booting from Hard Disk...
>   -Booting from 0000:7c00
>
> So, it got most of the way through the reboot - there's only a few
> function calls between the e820 map being dumped and the handle_19
> call.  The fault also seems to show it stopped in the BIOS in 16bit
> mode:
>
>> EIP=0000d331 EFL=00010202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
>> ES =0000 00000000 0000ffff 00009300
>> CS =f000 000f0000 0000ffff 00009b00
>
> Can you add the patch below, force the fault, and forward the log.
>
> Also, if you recreate the failure can you take the EIP from the fault
> (eg, d331) and search for the corresponding function in the output of:
>   objdump -m i386 -M i8086 -M suffix -ldr out/rom16.o | less
> (That is, search for "d331:".)  If that's too much of a pain, just
> send me a direct email with the seabios out/rom16.o file and the new
> EIP of the fault.  (I need the out/rom16.o that was used to build the
> version of SeaBIOS that faulted.)
>
> -Kevin
>
>
> diff --git a/src/post.c b/src/post.c
> index 9ea5620..bbd19c0 100644
> --- a/src/post.c
> +++ b/src/post.c
> @@ -185,21 +185,24 @@ prepareboot(void)
>      pmm_prepboot();
>      malloc_prepboot();
>      memmap_prepboot();
> +    dprintf(1, "a\n");
>
>      HaveRunPost = 2;
>
>      // Setup bios checksum.
>      BiosChecksum -= checksum((u8*)BUILD_BIOS_ADDR, BUILD_BIOS_SIZE);
> +    dprintf(1, "b\n");
>  }
>
>  // Begin the boot process by invoking an int0x19 in 16bit mode.
>  void VISIBLE32FLAT
>  startBoot(void)
>  {
> +    dprintf(1, "e\n");
>      // Clear low-memory allocations (required by PMM spec).
>      memset((void*)BUILD_STACK_ADDR, 0, BUILD_EBDA_MINIMUM - BUILD_STACK_ADDR);
>
> -    dprintf(3, "Jump to int19\n");
> +    dprintf(1, "Jump to int19 (vector=%x)\n", GET_IVT(0x19).segoff);
>      struct bregs br;
>      memset(&br, 0, sizeof(br));
>      br.flags = F_IF;
> @@ -239,9 +242,11 @@ maininit(void)
>      // Prepare for boot.
>      prepareboot();
>
> +    dprintf(1, "c\n");
>      // Write protect bios memory.
>      make_bios_readonly();
>
> +    dprintf(1, "d\n");
>      // Invoke int 19 to start boot process.
>      startBoot();
>  }

Thanks, strangely the reboot is always failing now and always reaching
seabios greeting. May be prints straightened up a race (e.g. it is not
int19 problem really).

object file part:

0000d331 <irq_trampoline_0x19>:
irq_trampoline_0x19():
/root/seabios-1.8.1/src/romlayout.S:195
    d331:       cd 19                   int    $0x19
    d333:       cb                      lretw
Kevin O'Connor March 26, 2015, 12:05 a.m. UTC | #2
On Thu, Mar 26, 2015 at 02:35:58AM +0300, Andrey Korolyov wrote:
> Thanks, strangely the reboot is always failing now and always reaching
> seabios greeting. May be prints straightened up a race (e.g. it is not
> int19 problem really).
> 
> object file part:
> 
> 0000d331 <irq_trampoline_0x19>:
> irq_trampoline_0x19():
> /root/seabios-1.8.1/src/romlayout.S:195
>     d331:       cd 19                   int    $0x19
>     d333:       cb                      lretw

[...]
> Jump to int19 (vector=f000e6f2)

Thanks.  So, it dies on the "int $0x19" instruction itself.  The
vector looks correct and I don't see anything in the cpu register
state that looks wrong.  Maybe one of the kvm developers will have an
idea what could cause a fault there.

-Kevin
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/src/post.c b/src/post.c
index 9ea5620..bbd19c0 100644
--- a/src/post.c
+++ b/src/post.c
@@ -185,21 +185,24 @@  prepareboot(void)
     pmm_prepboot();
     malloc_prepboot();
     memmap_prepboot();
+    dprintf(1, "a\n");
 
     HaveRunPost = 2;
 
     // Setup bios checksum.
     BiosChecksum -= checksum((u8*)BUILD_BIOS_ADDR, BUILD_BIOS_SIZE);
+    dprintf(1, "b\n");
 }
 
 // Begin the boot process by invoking an int0x19 in 16bit mode.
 void VISIBLE32FLAT
 startBoot(void)
 {
+    dprintf(1, "e\n");
     // Clear low-memory allocations (required by PMM spec).
     memset((void*)BUILD_STACK_ADDR, 0, BUILD_EBDA_MINIMUM - BUILD_STACK_ADDR);
 
-    dprintf(3, "Jump to int19\n");
+    dprintf(1, "Jump to int19 (vector=%x)\n", GET_IVT(0x19).segoff);
     struct bregs br;
     memset(&br, 0, sizeof(br));
     br.flags = F_IF;
@@ -239,9 +242,11 @@  maininit(void)
     // Prepare for boot.
     prepareboot();
 
+    dprintf(1, "c\n");
     // Write protect bios memory.
     make_bios_readonly();
 
+    dprintf(1, "d\n");
     // Invoke int 19 to start boot process.
     startBoot();
 }