public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* Issue with 64-bit code execution with kvm enabled
@ 2010-11-13 23:37 Adhyas Avasthi
  2010-11-14  6:22 ` Adhyas Avasthi
  2010-11-14  6:59 ` Gleb Natapov
  0 siblings, 2 replies; 4+ messages in thread
From: Adhyas Avasthi @ 2010-11-13 23:37 UTC (permalink / raw)
  To: kvm

I am trying to boot a 64-bit GRUB2 based EFI Boot Loader on top of
OVMF based EFI BIOS (also 64 bit) for x86_64. My host is Ubuntu 10.04
x86_64 and I am running qemu-kvm-0.13.0 with self-built
kvm-kmod-2.6.32.17 for my kernel version which is 2.6.32-24 (I used
the default Ubuntu KVM and qemu versions with same issue earlier). My
host PC is Lenovo T410 with Intel Core i5

GRUB2 is built with gcc and apparently, EFI has a different calling
convention so GRUB2 has an assembly wrapper file that changes the
parameter as per desired calling convention. The problem is that if I
start the loader with kvm disabled, everything goes fine and their
wrapper instructions do the right thing as well. If I enable kvm,
however, I get an x64 exception (as below):

!!!! X64 Exception Type - 000000000000000D !!!!
ExceptionData - 0000000000000000
RIP - 000000001FFA95FA, RFL - 0000000000010202
RAX - 000000001FF35900, RCX - 0000000000000000, RDX - 000000001FFBB510
RBX - 000000001FF35640, RSP - 000000001FF975C0, RBP - 000000001FFBB510
RSI - 000000001FFBB550, RDI - 000000001FF35940
R8  - 0000000000000000, R9  - 000000001FFBB54F, R10 - 000000001D996FFF
R11 - 000000001FF96EB8, R12 - 000000001FFB6A90, R13 - 0000000000000070
R14 - 000000001D99CFFF, R15 - 0000000000000060
CS  - 0028, DS  - 0008, ES  - 0008, FS  - 0008, GS  - 0008, SS  - 0008
GDT - 000000001FF1CE98; 003F,                   IDT - 000000001FE88BC0; 0FFF
LDT - 0000000000000000, TR  - 0000000000000000
CR0 - 0000000080000023, CR2 - 0000000000000000, CR3 - 000000001FF36000
CR4 - 0000000000000668, CR8 - 0000000000000000
DR0 - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000
DR3 - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400

Here is the call that I am making (and also the target function I am
invoking in EFI):
status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA,
pages, &address);
(the target function is:)
EFI_STATUS
EFIAPI
CoreAllocatePages (
  IN EFI_ALLOCATE_TYPE      Type,
  IN EFI_MEMORY_TYPE        MemoryType,
  IN UINTN                  NumberOfPages,
  IN OUT EFI_PHYSICAL_ADDRESS  *Memory
  )

The assembly wrapper that changes as per calling convention in GRUB2 is:

/*
 * x86_64 uses registry to pass parameters. Unfortunately, gcc and efi use
 * different call conversion, so we need to do some conversion.
 *
 * gcc:
 *   %rdi,  %esi,  %rdx,  %rcx, %r8, %r9, 8(%rsp), 16(%rsp), ...
 *
 * efi:
 *   %rcx,  %rdx,  %r8,  %r9,  32(%rsp), 40(%rsp), 48(%rsp), ...
 *
 */
FUNCTION(efi_wrap_4)
        subq $40, %rsp
        mov %r8, %r9
        mov %rcx, %r8
        mov %rsi, %rcx
        call *%rdi
        addq $40, %rsp
        ret


Is this a bug? How can the same piece of code work fine on pure qemu
emulation and not on kvm mode?
I will appreciate if someone can throw more light on this issue I am facing.

Thanks,
Adhyas
********************************************************************
Two types have compatible type if their types are the same.
    — ANSI C Standard, 3.1.2.6.
********************************************************************

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Issue with 64-bit code execution with kvm enabled
  2010-11-13 23:37 Issue with 64-bit code execution with kvm enabled Adhyas Avasthi
@ 2010-11-14  6:22 ` Adhyas Avasthi
  2010-11-14  6:41   ` Adhyas Avasthi
  2010-11-14  6:59 ` Gleb Natapov
  1 sibling, 1 reply; 4+ messages in thread
From: Adhyas Avasthi @ 2010-11-14  6:22 UTC (permalink / raw)
  To: kvm

[-- Attachment #1: Type: text/plain, Size: 4400 bytes --]

An alternate implementation of the efi_wrap_4 function has the same
issue. Here is the alternate function I found from another Unix to EFI
calling wrapper, which is part of the EFI BIOS code base.

 movq    %rdi, %rax    // Swizzle args
 movq    %rsi, %r9
//  movq    %rdx, %rdx
 movq    %rcx, %r8
 movq    %r9,  %rcx

       subq  $40, %rsp              // 32-byte shadow space plus alignment pad
       call    *%rax
 addq  $40, %rsp

       ret

This works in pure emulation without kvm, but gives me an exception
with kvm enabled.
I don't quite understand what may have caused this. Perhaps this is a
naive question, but how good is kvm for recent 64 bit Intel CPUs ? I
have also attached my host's cpuinfo output if that helps.

Thanks,
Adhyas

On Sat, Nov 13, 2010 at 3:37 PM, Adhyas Avasthi <adhyas@gmail.com> wrote:
> I am trying to boot a 64-bit GRUB2 based EFI Boot Loader on top of
> OVMF based EFI BIOS (also 64 bit) for x86_64. My host is Ubuntu 10.04
> x86_64 and I am running qemu-kvm-0.13.0 with self-built
> kvm-kmod-2.6.32.17 for my kernel version which is 2.6.32-24 (I used
> the default Ubuntu KVM and qemu versions with same issue earlier). My
> host PC is Lenovo T410 with Intel Core i5
>
> GRUB2 is built with gcc and apparently, EFI has a different calling
> convention so GRUB2 has an assembly wrapper file that changes the
> parameter as per desired calling convention. The problem is that if I
> start the loader with kvm disabled, everything goes fine and their
> wrapper instructions do the right thing as well. If I enable kvm,
> however, I get an x64 exception (as below):
>
> !!!! X64 Exception Type - 000000000000000D !!!!
> ExceptionData - 0000000000000000
> RIP - 000000001FFA95FA, RFL - 0000000000010202
> RAX - 000000001FF35900, RCX - 0000000000000000, RDX - 000000001FFBB510
> RBX - 000000001FF35640, RSP - 000000001FF975C0, RBP - 000000001FFBB510
> RSI - 000000001FFBB550, RDI - 000000001FF35940
> R8  - 0000000000000000, R9  - 000000001FFBB54F, R10 - 000000001D996FFF
> R11 - 000000001FF96EB8, R12 - 000000001FFB6A90, R13 - 0000000000000070
> R14 - 000000001D99CFFF, R15 - 0000000000000060
> CS  - 0028, DS  - 0008, ES  - 0008, FS  - 0008, GS  - 0008, SS  - 0008
> GDT - 000000001FF1CE98; 003F,                   IDT - 000000001FE88BC0; 0FFF
> LDT - 0000000000000000, TR  - 0000000000000000
> CR0 - 0000000080000023, CR2 - 0000000000000000, CR3 - 000000001FF36000
> CR4 - 0000000000000668, CR8 - 0000000000000000
> DR0 - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000
> DR3 - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400
>
> Here is the call that I am making (and also the target function I am
> invoking in EFI):
> status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA,
> pages, &address);
> (the target function is:)
> EFI_STATUS
> EFIAPI
> CoreAllocatePages (
>  IN EFI_ALLOCATE_TYPE      Type,
>  IN EFI_MEMORY_TYPE        MemoryType,
>  IN UINTN                  NumberOfPages,
>  IN OUT EFI_PHYSICAL_ADDRESS  *Memory
>  )
>
> The assembly wrapper that changes as per calling convention in GRUB2 is:
>
> /*
>  * x86_64 uses registry to pass parameters. Unfortunately, gcc and efi use
>  * different call conversion, so we need to do some conversion.
>  *
>  * gcc:
>  *   %rdi,  %esi,  %rdx,  %rcx, %r8, %r9, 8(%rsp), 16(%rsp), ...
>  *
>  * efi:
>  *   %rcx,  %rdx,  %r8,  %r9,  32(%rsp), 40(%rsp), 48(%rsp), ...
>  *
>  */
> FUNCTION(efi_wrap_4)
>        subq $40, %rsp
>        mov %r8, %r9
>        mov %rcx, %r8
>        mov %rsi, %rcx
>        call *%rdi
>        addq $40, %rsp
>        ret
>
>
> Is this a bug? How can the same piece of code work fine on pure qemu
> emulation and not on kvm mode?
> I will appreciate if someone can throw more light on this issue I am facing.
>
> Thanks,
> Adhyas
> ********************************************************************
> Two types have compatible type if their types are the same.
>     — ANSI C Standard, 3.1.2.6.
> ********************************************************************
>



-- 
Adhyas
********************************************************************
Two types have compatible type if their types are the same.
    — ANSI C Standard, 3.1.2.6.
********************************************************************

[-- Attachment #2: cpuinfo --]
[-- Type: application/octet-stream, Size: 1666 bytes --]

processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 37
model name	: Intel(R) Core(TM) i5 CPU       M 520  @ 2.40GHz
stepping	: 2
cpu MHz		: 1199.000
cache size	: 3072 KB
physical id	: 0
siblings	: 2
core id		: 0
cpu cores	: 2
apicid		: 0
initial apicid	: 0
fpu		: yes
fpu_exception	: yes
cpuid level	: 11
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt aes lahf_lm ida arat tpr_shadow vnmi flexpriority ept vpid
bogomips	: 4787.40
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 37
model name	: Intel(R) Core(TM) i5 CPU       M 520  @ 2.40GHz
stepping	: 2
cpu MHz		: 1199.000
cache size	: 3072 KB
physical id	: 0
siblings	: 2
core id		: 2
cpu cores	: 2
apicid		: 4
initial apicid	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 11
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt aes lahf_lm ida arat tpr_shadow vnmi flexpriority ept vpid
bogomips	: 4787.40
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Issue with 64-bit code execution with kvm enabled
  2010-11-14  6:22 ` Adhyas Avasthi
@ 2010-11-14  6:41   ` Adhyas Avasthi
  0 siblings, 0 replies; 4+ messages in thread
From: Adhyas Avasthi @ 2010-11-14  6:41 UTC (permalink / raw)
  To: kvm

Some more debug information (if it helps someone analyze my problem
and suggest a solution).
I changed the wrapper code to hang just before making the call. And
here is the modified wrapper:

FUNCTION(efi_wrap_4_with_hang)
       subq $40, %rsp
       mov %r8, %r9
       mov %rcx, %r8
       mov %rsi, %rcx
efi_wrap_4_hang:
       jmp   efi_wrap_4_hang
       call *%rdi
       addq $40, %rsp
       ret

I am not making the call as:

efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA, pages, &address);

#define efi_call_4(func, a, b, c, d) \
 efi_wrap_4(func, (grub_uint64_t) a, (grub_uint64_t) b, (grub_uint64_t) c, \
 (grub_uint64_t) d)

The target of the call is (and the calling convention is as per EFI
requirements):
And the target is:
EFI_STATUS
EFIAPI
CoreAllocatePages (
 IN EFI_ALLOCATE_TYPE      Type,
 IN EFI_MEMORY_TYPE        MemoryType,
 IN UINTN                  NumberOfPages,
 IN OUT EFI_PHYSICAL_ADDRESS  *Memory
 )

The register dump at the hang-ed point for both kvm-enabled and
kvm-disabled is as below. Note that the code seems to work for
kvm-disabled case but issues an exception for kvm-enabled case. That
is the issue I am facing.

(With KVM enabled, code issues exception, register layout at hang is):
(qemu) info registers
RAX=000000001ff34f18 RBX=0000000000000006 RCX=0000000000000000
RDX=0000000000000002
RSI=0000000000000000 RDI=000000001ff9a504 RBP=000000001d9a4285
RSP=000000001ff97708
R8 =0000000000000006 R9 =000000001ff97740 R10=0000000000000010
R11=0000000000000009
R12=000000001ffb5960 R13=000000001ff97740 R14=0000000000000000
R15=000000001d99d750
RIP=000000001d99d75d RFL=00000212 [----A--] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0008 0000000000000000 ffffffff 00c09300 DPL=0 DS   [-WA]
CS =0028 0000000000000000 ffffffff 00a09b00 DPL=0 CS64 [-RA]
SS =0008 0000000000000000 ffffffff 00c09300 DPL=0 DS   [-WA]
DS =0008 0000000000000000 ffffffff 00c09300 DPL=0 DS   [-WA]
FS =0008 0000000000000000 ffffffff 00c09300 DPL=0 DS   [-WA]
GS =0008 0000000000000000 ffffffff 00c09300 DPL=0 DS   [-WA]
LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
TR =0000 0000000000000000 0000ffff 00008b00 DPL=0 TSS64-busy
GDT=     000000001ff1ce98 0000003f
IDT=     000000001fe88bc0 00000fff
CR0=80000023 CR2=0000000000000000 CR3=000000001ff36000 CR4=00000668
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000
DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
EFER=0000000000000500
FCW=027f FSW=0000 [ST=0] FTW=00 MXCSR=00000000
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

The working case (with kvm disabled), register layout at hang:
(qemu) info registers
RAX=000000001ff34f18 RBX=0000000000000006 RCX=0000000000000000
RDX=0000000000000002
RSI=0000000000000000 RDI=000000001ff9a504 RBP=000000001d9a4285
RSP=000000001ff97708
R8 =0000000000000006 R9 =000000001ff97740 R10=0000000000000010
R11=0000000000000009
R12=000000001ffb5960 R13=000000001ff97740 R14=0000000000000000
R15=000000001d99d750
RIP=000000001d99d75d RFL=00000212 [----A--] 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=     000000001ff1ce98 0000003f
IDT=     000000001fe88bc0 00000fff
CR0=80000033 CR2=0000000000000000 CR3=000000001ff36000 CR4=00000668
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000
DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
EFER=0000000000000500
FCW=027f 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

Does that give someone an idea as to what may be going wrong? I will
try to debug it further to root cause the issue.

Thanks,
Adhyas

On Sat, Nov 13, 2010 at 10:22 PM, Adhyas Avasthi <adhyas@gmail.com> wrote:
> An alternate implementation of the efi_wrap_4 function has the same
> issue. Here is the alternate function I found from another Unix to EFI
> calling wrapper, which is part of the EFI BIOS code base.
>
>  movq    %rdi, %rax    // Swizzle args
>  movq    %rsi, %r9
> //  movq    %rdx, %rdx
>  movq    %rcx, %r8
>  movq    %r9,  %rcx
>
>       subq  $40, %rsp              // 32-byte shadow space plus alignment pad
>       call    *%rax
>  addq  $40, %rsp
>
>       ret
>
> This works in pure emulation without kvm, but gives me an exception
> with kvm enabled.
> I don't quite understand what may have caused this. Perhaps this is a
> naive question, but how good is kvm for recent 64 bit Intel CPUs ? I
> have also attached my host's cpuinfo output if that helps.
>
> Thanks,
> Adhyas
>
> On Sat, Nov 13, 2010 at 3:37 PM, Adhyas Avasthi <adhyas@gmail.com> wrote:
>> I am trying to boot a 64-bit GRUB2 based EFI Boot Loader on top of
>> OVMF based EFI BIOS (also 64 bit) for x86_64. My host is Ubuntu 10.04
>> x86_64 and I am running qemu-kvm-0.13.0 with self-built
>> kvm-kmod-2.6.32.17 for my kernel version which is 2.6.32-24 (I used
>> the default Ubuntu KVM and qemu versions with same issue earlier). My
>> host PC is Lenovo T410 with Intel Core i5
>>
>> GRUB2 is built with gcc and apparently, EFI has a different calling
>> convention so GRUB2 has an assembly wrapper file that changes the
>> parameter as per desired calling convention. The problem is that if I
>> start the loader with kvm disabled, everything goes fine and their
>> wrapper instructions do the right thing as well. If I enable kvm,
>> however, I get an x64 exception (as below):
>>
>> !!!! X64 Exception Type - 000000000000000D !!!!
>> ExceptionData - 0000000000000000
>> RIP - 000000001FFA95FA, RFL - 0000000000010202
>> RAX - 000000001FF35900, RCX - 0000000000000000, RDX - 000000001FFBB510
>> RBX - 000000001FF35640, RSP - 000000001FF975C0, RBP - 000000001FFBB510
>> RSI - 000000001FFBB550, RDI - 000000001FF35940
>> R8  - 0000000000000000, R9  - 000000001FFBB54F, R10 - 000000001D996FFF
>> R11 - 000000001FF96EB8, R12 - 000000001FFB6A90, R13 - 0000000000000070
>> R14 - 000000001D99CFFF, R15 - 0000000000000060
>> CS  - 0028, DS  - 0008, ES  - 0008, FS  - 0008, GS  - 0008, SS  - 0008
>> GDT - 000000001FF1CE98; 003F,                   IDT - 000000001FE88BC0; 0FFF
>> LDT - 0000000000000000, TR  - 0000000000000000
>> CR0 - 0000000080000023, CR2 - 0000000000000000, CR3 - 000000001FF36000
>> CR4 - 0000000000000668, CR8 - 0000000000000000
>> DR0 - 0000000000000000, DR1 - 0000000000000000, DR2 - 0000000000000000
>> DR3 - 0000000000000000, DR6 - 00000000FFFF0FF0, DR7 - 0000000000000400
>>
>> Here is the call that I am making (and also the target function I am
>> invoking in EFI):
>> status = efi_call_4 (b->allocate_pages, type, GRUB_EFI_LOADER_DATA,
>> pages, &address);
>> (the target function is:)
>> EFI_STATUS
>> EFIAPI
>> CoreAllocatePages (
>>  IN EFI_ALLOCATE_TYPE      Type,
>>  IN EFI_MEMORY_TYPE        MemoryType,
>>  IN UINTN                  NumberOfPages,
>>  IN OUT EFI_PHYSICAL_ADDRESS  *Memory
>>  )
>>
>> The assembly wrapper that changes as per calling convention in GRUB2 is:
>>
>> /*
>>  * x86_64 uses registry to pass parameters. Unfortunately, gcc and efi use
>>  * different call conversion, so we need to do some conversion.
>>  *
>>  * gcc:
>>  *   %rdi,  %esi,  %rdx,  %rcx, %r8, %r9, 8(%rsp), 16(%rsp), ...
>>  *
>>  * efi:
>>  *   %rcx,  %rdx,  %r8,  %r9,  32(%rsp), 40(%rsp), 48(%rsp), ...
>>  *
>>  */
>> FUNCTION(efi_wrap_4)
>>        subq $40, %rsp
>>        mov %r8, %r9
>>        mov %rcx, %r8
>>        mov %rsi, %rcx
>>        call *%rdi
>>        addq $40, %rsp
>>        ret
>>
>>
>> Is this a bug? How can the same piece of code work fine on pure qemu
>> emulation and not on kvm mode?
>> I will appreciate if someone can throw more light on this issue I am facing.
>>
>> Thanks,
>> Adhyas
>> ********************************************************************
>> Two types have compatible type if their types are the same.
>>     — ANSI C Standard, 3.1.2.6.
>> ********************************************************************
>>
>
>
>
> --
> Adhyas
> ********************************************************************
> Two types have compatible type if their types are the same.
>     — ANSI C Standard, 3.1.2.6.
> ********************************************************************
>



-- 
Adhyas
********************************************************************
Two types have compatible type if their types are the same.
    — ANSI C Standard, 3.1.2.6.
********************************************************************

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: Issue with 64-bit code execution with kvm enabled
  2010-11-13 23:37 Issue with 64-bit code execution with kvm enabled Adhyas Avasthi
  2010-11-14  6:22 ` Adhyas Avasthi
@ 2010-11-14  6:59 ` Gleb Natapov
  1 sibling, 0 replies; 4+ messages in thread
From: Gleb Natapov @ 2010-11-14  6:59 UTC (permalink / raw)
  To: Adhyas Avasthi; +Cc: kvm

On Sat, Nov 13, 2010 at 03:37:14PM -0800, Adhyas Avasthi wrote:
> I am trying to boot a 64-bit GRUB2 based EFI Boot Loader on top of
> OVMF based EFI BIOS (also 64 bit) for x86_64. My host is Ubuntu 10.04
> x86_64 and I am running qemu-kvm-0.13.0 with self-built
> kvm-kmod-2.6.32.17 for my kernel version which is 2.6.32-24 (I used
> the default Ubuntu KVM and qemu versions with same issue earlier). My
> host PC is Lenovo T410 with Intel Core i5
> 
> GRUB2 is built with gcc and apparently, EFI has a different calling
> convention so GRUB2 has an assembly wrapper file that changes the
> parameter as per desired calling convention. The problem is that if I
> start the loader with kvm disabled, everything goes fine and their
> wrapper instructions do the right thing as well. If I enable kvm,
> however, I get an x64 exception (as below):
> 
> !!!! X64 Exception Type - 000000000000000D !!!!
> ExceptionData - 0000000000000000
> RIP - 000000001FFA95FA, RFL - 0000000000010202
Can you disassemble code around the RIP?
Also provide ftrace of kvm execution during the failure.

--
			Gleb.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-11-14  6:59 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-13 23:37 Issue with 64-bit code execution with kvm enabled Adhyas Avasthi
2010-11-14  6:22 ` Adhyas Avasthi
2010-11-14  6:41   ` Adhyas Avasthi
2010-11-14  6:59 ` Gleb Natapov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox