Re: KVM emulation failure with "movups" instruction

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Aug 4, 2017 at 3:03 PM, Anatol Pomozov <anatol.pomozov@xxxxxxxxx> wrote:
> Hello
>
> I am testing my own x86_64 kernel with QEMU/KVM and it report cryptic
> error "KVM internal error. Suberror: 1". I believe this emulation
> error happens in Linux kernel most likely in arch/x86/kvm/emulate.c
>
> I tested KVM with Linux 4.4.0, 4.12.3 and both versions return this
> emulation error. It is strange as QEMU emulation and VMWare work fine
> with the same kernel binary.
>
>
> How to understand what is the KVM issue and why it fails? Is there a
> way to obtain more information about the error?
>
>
> Here is my code where the issue happens:
>
> 0000000000100c20 <console_write>:
>   100c20:       48 85 f6                test   %rsi,%rsi
>   100c23:       0f 84 11 05 00 00       je     10113a <console_write+0x51a>
>   100c29:       45 31 c0                xor    %r8d,%r8d
>   100c2c:       b9 0e 8f 0b 00          mov    $0xb8f0e,%ecx
>   100c31:       66 66 66 66 66 66 2e    data32 data32 data32 data32
> data32 nopw %cs:0x0(%rax,%rax,1)
>   100c38:       0f 1f 84 00 00 00 00
>   100c3f:       00
>   100c40:       0f be 07                movsbl (%rdi),%eax
>   100c43:       0f b7 d0                movzwl %ax,%edx
>   100c46:       83 fa 0a                cmp    $0xa,%edx
>   100c49:       0f 85 91 00 00 00       jne    100ce0 <console_write+0xc0>
>   100c4f:       48 8b 05 aa 83 00 00    mov    0x83aa(%rip),%rax
>  # 109000 <row>
>   100c56:       48 8d 50 01             lea    0x1(%rax),%rdx
>   100c5a:       48 89 15 9f 83 00 00    mov    %rdx,0x839f(%rip)
>  # 109000 <row>
>   100c61:       48 83 fa 19             cmp    $0x19,%rdx
>   100c65:       0f 85 35 04 00 00       jne    1010a0 <console_write+0x480>
>   100c6b:       31 d2                   xor    %edx,%edx
>   100c6d:       0f 1f 00                nopl   (%rax)
>   100c70:       0f 10 84 51 92 f1 ff    movups -0xe6e(%rcx,%rdx,2),%xmm0

Likely this instruction is accessing an MMIO region (probably a VGA
buffer, given "mov    $0xb8f0e,%ecx"). This will cause a trap to KVM
and KVM will try to emulate the instruction. The instruction doing the
MMIO access is an SSE instruction, which KVM does not have support to
emulate, thus the internal error. If you didn't hand write this
assembly I would try compiling your kernel with compilation flags to
disable SSE code generation and see if that fixes your issue.

>
> ^^^^^^^^^^^^ KVM error happens here ^^^^^^^ See registers stack below
>
>   100c77:       ff
>   100c78:       0f 11 84 51 f2 f0 ff    movups %xmm0,-0xf0e(%rcx,%rdx,2)
>   100c7f:       ff
>   100c80:       48 83 c2 08             add    $0x8,%rdx
>   100c84:       48 81 fa 80 07 00 00    cmp    $0x780,%rdx
>   100c8b:       75 e3                   jne    100c70 <console_write+0x50>
>   100c8d:       48 89 05 6c 83 00 00    mov    %rax,0x836c(%rip)
>  # 109000 <row>
>   100c94:       48 c7 05 c1 3b 00 00    movq   $0xb8f00,0x3bc1(%rip)
>      # 104860 <cursor>
>   100c9b:       00 8f 0b 00
>   100c9f:       4c 8b 0d 62 83 00 00    mov    0x8362(%rip),%r9
> # 109008 <column>
>   100ca6:       4d 85 c9                test   %r9,%r9
>   100ca9:       0f 84 71 04 00 00       je     101120 <console_write+0x500>
>   100caf:       49 8d 41 ff             lea    -0x1(%r9),%rax
>   100cb3:       44 89 ca                mov    %r9d,%edx
>   100cb6:       83 e2 07                and    $0x7,%edx
>   100cb9:       48 83 f8 07             cmp    $0x7,%rax
>   100cbd:       0f 83 f6 03 00 00       jae    1010b9 <console_write+0x499>
>
>
>
>
>
> Registers at KVM error as reported by QEMU
>
> RAX=0000000000000018 RBX=0000000000000001 RCX=00000000000b8f0e
> RDX=0000000000000000
> RSI=0000000000000001 RDI=000000000010445a RBP=000000000010445b
> RSP=000000000010af78
> R8 =0000000000000000 R9 =00000000000b8f56 R10=000000000010445c
> R11=0000000000000004
> R12=000000000010445a R13=000000007fffffd3 R14=0000000000000001
> R15=000000000000002c
> RIP=0000000000100c70 RFL=00010246 [---Z-P-] CPL=0 II=0 A20=1 SMM=0 HLT=0
> ES =0000 0000000000000000 ffffffff 00c00000
> CS =0008 0000000000000000 00000000 00209900 DPL=0 CS64 [--A]
> SS =0000 0000000000000000 ffffffff 00c00000
> DS =0000 0000000000000000 ffffffff 00c00000
> FS =0000 0000000000000000 ffffffff 00c00000
> GS =0000 0000000000000000 ffffffff 00c00000
> LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
> TR =0000 0000000000000000 0000ffff 00008b00 DPL=0 TSS64-busy
> GDT=     0000000000104518 0000000f
> IDT=     0000000000105030 00000fff
> CR0=80000033 CR2=0000000000000000 CR3=0000000000107000 CR4=00000620
> DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000
> DR3=0000000000000000
> DR6=00000000ffff0ff0 DR7=0000000000000400
> EFER=0000000000000500



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux