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

Kevin O'Connor
2015-03-25T23:03:01Z

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();
}