2014-05-13 16:24 GMT+02:00 Laszlo Ersek <ler...@redhat.com>:
> On 05/13/14 15:50, Ludovic Rousseau wrote:
>> Hello,
>>
>> I hope this is the correct mailing list for my request. If not sorry.
>>
>> I use OVMF-X64-r15214 with qemu version 1.1.2 (Debian
>> 1.1.2+dfsg-6a+deb7u2). It works great for my first tests.
>>
>> I now want to use the DEBUG() call to have some debug traces.
>> My program is very simple. I use gnu-efi to build it.
>>
>> #include <efi.h>
>> #include <efilib.h>
>>
>> EFI_STATUS
>> EFIAPI
>> efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
>> {
>>     InitializeLib(ImageHandle, SystemTable);
>>
>>     Print(L"a\n");
>>     DEBUG(( D_INFO, (CHAR8 *)"D_INFO\r\n"));
>>     Print(L"b\n");
>>     DEBUG(( D_ERROR, (CHAR8 *)"D_ERROR\r\n"));
>>     Print(L"c\n");
>>
>>     return EFI_SUCCESS;
>> }
>>
>> I start qemu using:
>> qemu-system-x86_64 -bios OVMF-X64-r15214/OVMF.fd \
>>     -boot c -m 128 -hda 'disk.img' \
>>     -serial file:serial.log
>>
>> In the qemu graphical window I see 2 lines:
>> a
>> b
>>
>> In the serial.log file I have:
>> [...]
>> Shell> fs0:
>> FS0:\> usb1
>> a
>> b
>> D_ERROR
>>
>> The first call to DEBUG() with D_INFO is not displayed. I guess it is
>> because of the lines in /usr/include/efi/efidebug.h
>> //
>> // Current Debug level of the system, value of EFIDebug
>> //
>> //#define EFI_DBUG_MASK   (D_ERROR | D_WARN | D_LOAD | D_BLKIO | D_INIT)
>> #define EFI_DBUG_MASK   (D_ERROR)
>>
>>
>> The problem is that right after the "D_ERROR" is logged I get a crash
>> of the virtual machine with:
>> qemu: fatal: Trying to execute code outside RAM or ROM at 0x00000000000b0000
>>
>> RAX=0000000000000000 RBX=0000000080000000 RCX=0000000000000000
>> RDX=0000000000000018
>> RSI=0000000000000005 RDI=0000000007dd0c30 RBP=0000000007f94560
>> RSP=0000000007f94518
>> R8 =0000000000000000 R9 =0000000007f93f5c R10=00000000000003f8
>> R11=0000000000000040
>> R12=0000000000000005 R13=0000000000000000 R14=0000000000000000
>> R15=0000000000000000
>> RIP=00000000000affae RFL=00000202 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
>> ES =0008 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
>> CS =0028 0000000000000000 ffffffff 00af9b00 DPL=0 CS64 [-RA]
>> SS =0008 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
>> DS =0008 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
>> FS =0008 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
>> GS =0008 0000000000000000 ffffffff 00cf9300 DPL=0 DS   [-WA]
>> LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
>> TR =0000 0000000000000000 0000ffff 00008b00 DPL=0 TSS64-busy
>> GDT=     0000000007f1ed98 0000003f
>> IDT=     000000000747f018 00000fff
>> CR0=80000033 CR2=0000000000000000 CR3=0000000007f33000 CR4=00000668
>> DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000
>> DR3=0000000000000000
>> DR6=00000000ffff0ff0 DR7=0000000000000400
>> CCS=0000000000000000 CCD=0000000000000000 CCO=ADDB
>> EFER=0000000000000500
>> FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
>> FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
>> FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
>> FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
>> FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
>> XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
>> XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
>> XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
>> XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
>> XMM08=00000000000000000000000000000000 XMM09=00000000000000000000000000000000
>> XMM10=00000000000000000000000000000000 XMM11=00000000000000000000000000000000
>> XMM12=00000000000000000000000000000000 XMM13=00000000000000000000000000000000
>> XMM14=00000000000000000000000000000000 XMM15=00000000000000000000000000000000
>>
>> I also tried to start qemu using "-debugcon file:debug.log -global
>> isa-debugcon.iobase=0x402" as indicated in [1] but I get the same
>> crash and not log or debug at all.
>>
>>
>> Is it a bug in OVMF-X64-r15214 or in qemu version 1.1.2?
>> Do I need to initialize something before I can call DEBUG()?
>>
>> Thanks
>>
>> [1] https://github.com/tianocore/edk2-OvmfPkg
>>
>
> This looks to me like a gnu-efi bug.
>
> (See
> - http://thread.gmane.org/gmane.comp.bios.tianocore.devel/3669
> - http://thread.gmane.org/gmane.comp.bios.tianocore.devel/6639/focus=6665
> for background.)
>
> Namely, gnu-efi's va_start() implementation, from "inc/efistdarg.h":
>
> #define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
>
> only works if the function using va_start() has been called with the
> EFIAPI calling convention. What you have here is:
>
> DEBUG() [inc/efidebug.h]
>   DbgPrint() [lib/print.c]
>     va_start() [inc/efistdarg.h]
>
> The prototype of DbgPrint() is incorrect, at the end of
> "inc/efidebug.h". Consequently, when your program calls DbgPrint() via
> the DEBUG() macro, it fails to set up the stack correctly (it does not
> pass the arguments through the ellipsis (...) according to the EFIAPI
> calling convention). However, va_start() inside DbgPrint() *assumes*
> that stack.
>
> Please rebuild your gnu-efi installation with the attached patch, and
> retest your app.

I still get a crash but with a different message in serial.log
FS0:\> debug1
a
b
!!!! X64 Exception Type - 000000000000000D     CPU Apic ID - 00000000 !!!!
RIP  - 0000000007DCE98B, CS  - 0000000000000028, RFLAGS - 0000000000000282
ExceptionData - 0000000000000000
RAX  - C9F0458B48685089, RCX - C9F0458B48685089, RDX - 0000000000000000
RBX  - 0000000080000000, RSP - 0000000007F94520, RBP - 0000000007F94560
RSI  - 000000000000000E, RDI - 0000000007DD0C30
R8   - 0000000000000000, R9  - 0000000007F93F07, R10 - 0000000006D86DBA
R11  - 0000000000000040, R12 - 0000000000000000, R13 - 0000000000000000
R14  - 0000000000000000, R15 - 0000000000000000
DS   - 0000000000000008, ES  - 0000000000000008, FS  - 0000000000000008
GS   - 0000000000000008, SS  - 0000000000000008
CR0  - 0000000080000033, CR2 - 0000000000000000, CR3 - 0000000007F33000
CR4  - 0000000000000668, CR8 - 0000000000000000
DR0  - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000
DR3  - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400
GDTR - 0000000007F1ED98 000000000000003F, LDTR - 0000000000000000
IDTR - 000000000747F018 0000000000000FFF,   TR - 0000000000000000
FXSAVE_STATE - 0000000007F94180
!!!! Find PE image
/home/jljusten/tmp/edk2/Build/OvmfX64/RELEASE_GCC47/X64/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe/DEBUG/ConSplitterDxe.dll
(ImageBase=0000000007DC9000, EntryPoint=0000000007DC92AF) !!!!

I do not see the "D_ERROR" log message any more. The crash now occurs
_before_ the debug message is displayed.

Another suggestion?

Thanks

-- 
 Dr. Ludovic Rousseau

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to