From: Avi Kivity <[EMAIL PROTECTED]> up is simpler and doesn't need messing with tr; that may help with hibernate.
Signed-off-by: Avi Kivity <[EMAIL PROTECTED]> diff --git a/bios/vapic.S b/bios/vapic.S index 16e5cc4..9e007c9 100644 --- a/bios/vapic.S +++ b/bios/vapic.S @@ -25,16 +25,26 @@ vcpu_shift: .long 0 real_tpr: .long 0 - .long set_tpr ; fixup - .long set_tpr_eax ; fixup - .long get_tpr_eax ; fixup - .long get_tpr_ecx ; fixup - .long get_tpr_edx ; fixup - .long get_tpr_ebx ; fixup + .long up_set_tpr ; fixup + .long up_set_tpr_eax ; fixup + .long up_get_tpr_eax ; fixup + .long up_get_tpr_ecx ; fixup + .long up_get_tpr_edx ; fixup + .long up_get_tpr_ebx ; fixup .long 0 /* esp. won't work. */ - .long get_tpr_ebp ; fixup - .long get_tpr_esi ; fixup - .long get_tpr_edi ; fixup + .long up_get_tpr_ebp ; fixup + .long up_get_tpr_esi ; fixup + .long up_get_tpr_edi ; fixup + .long mp_set_tpr ; fixup + .long mp_set_tpr_eax ; fixup + .long mp_get_tpr_eax ; fixup + .long mp_get_tpr_ecx ; fixup + .long mp_get_tpr_edx ; fixup + .long mp_get_tpr_ebx ; fixup + .long 0 /* esp. won't work. */ + .long mp_get_tpr_ebp ; fixup + .long mp_get_tpr_esi ; fixup + .long mp_get_tpr_edi ; fixup .macro kvm_hypercall .byte 0x0f, 0x01, 0xc1 @@ -46,81 +56,81 @@ tr_vcpu_signature = 0xdb .align 64 -get_tpr_eax: +mp_get_tpr_eax: pushf push %ecx str %eax cmp $tr_vcpu_signature, %al - jne get_tpr_bad + jne mp_get_tpr_bad movzbl %ah, %eax mov vcpu_shift, %ecx ; fixup shl %cl, %eax movzbl vapic(%eax), %eax ; fixup -get_tpr_out: +mp_get_tpr_out: pop %ecx popf ret -get_tpr_bad: +mp_get_tpr_bad: mov real_tpr, %eax ; fixup mov (%eax), %eax - jmp get_tpr_out + jmp mp_get_tpr_out -get_tpr_ebx: +mp_get_tpr_ebx: mov %eax, %ebx - call get_tpr_eax + call mp_get_tpr_eax xchg %eax, %ebx ret -get_tpr_ecx: +mp_get_tpr_ecx: mov %eax, %ecx - call get_tpr_eax + call mp_get_tpr_eax xchg %eax, %ecx ret -get_tpr_edx: +mp_get_tpr_edx: mov %eax, %edx - call get_tpr_eax + call mp_get_tpr_eax xchg %eax, %edx ret -get_tpr_esi: +mp_get_tpr_esi: mov %eax, %esi - call get_tpr_eax + call mp_get_tpr_eax xchg %eax, %esi ret -get_tpr_edi: +mp_get_tpr_edi: mov %eax, %edi - call get_tpr_edi + call mp_get_tpr_edi xchg %eax, %edi ret -get_tpr_ebp: +mp_get_tpr_ebp: mov %eax, %ebp - call get_tpr_eax + call mp_get_tpr_eax xchg %eax, %ebp ret -set_tpr_eax: +mp_set_tpr_eax: push %eax - call set_tpr + call mp_set_tpr ret -set_tpr: +mp_set_tpr: pushf push %eax push %ecx push %edx push %ebx -set_tpr_failed: +mp_set_tpr_failed: str %eax cmp $tr_vcpu_signature, %al - jne set_tpr_bad + jne mp_set_tpr_bad movzbl %ah, %edx mov vcpu_shift, %ecx ; fixup @@ -134,22 +144,22 @@ set_tpr_failed: /* %ebx = new vapic (%bl = tpr, %bh = isr, %b3 = irr) */ lock cmpxchg %ebx, vapic(%edx) ; fixup - jnz set_tpr_failed + jnz mp_set_tpr_failed /* compute ppr */ cmp %bh, %bl - jae tpr_is_bigger -isr_is_bigger: + jae mp_tpr_is_bigger +mp_isr_is_bigger: mov %bh, %bl -tpr_is_bigger: +mp_tpr_is_bigger: /* %bl = ppr */ mov %bl, %ch /* ch = ppr */ rol $8, %ebx /* now: %bl = irr, %bh = ppr */ cmp %bh, %bl - ja set_tpr_poll_irq + ja mp_set_tpr_poll_irq -set_tpr_out: +mp_set_tpr_out: pop %ebx pop %edx pop %ecx @@ -157,16 +167,91 @@ set_tpr_out: popf ret $4 -set_tpr_poll_irq: +mp_set_tpr_poll_irq: mov $kvm_hypercall_vapic_poll_irq, %eax kvm_hypercall - jmp set_tpr_out + jmp mp_set_tpr_out -set_tpr_bad: +mp_set_tpr_bad: mov 24(%esp), %ecx mov real_tpr, %eax ; fixup mov %ecx, (%eax) - jmp set_tpr_out + jmp mp_set_tpr_out + +up_get_tpr_eax: + movzbl vapic, %eax ; fixup + ret + +up_get_tpr_ebx: + movzbl vapic, %ebx ; fixup + ret + +up_get_tpr_ecx: + movzbl vapic, %ecx ; fixup + ret + +up_get_tpr_edx: + movzbl vapic, %edx ; fixup + ret + +up_get_tpr_esi: + movzbl vapic, %esi ; fixup + ret + +up_get_tpr_edi: + movzbl vapic, %edi ; fixup + ret + +up_get_tpr_ebp: + movzbl vapic, %ebp ; fixup + ret + +up_set_tpr_eax: + push %eax + call up_set_tpr + ret + +up_set_tpr: + pushf + push %eax + push %ecx + push %ebx + +up_set_tpr_failed: + mov vapic, %eax ; fixup + + mov %eax, %ebx + mov 20(%esp), %bl + + /* %ebx = new vapic (%bl = tpr, %bh = isr, %b3 = irr) */ + + lock cmpxchg %ebx, vapic ; fixup + jnz up_set_tpr_failed + + /* compute ppr */ + cmp %bh, %bl + jae up_tpr_is_bigger +up_isr_is_bigger: + mov %bh, %bl +up_tpr_is_bigger: + /* %bl = ppr */ + mov %bl, %ch /* ch = ppr */ + rol $8, %ebx + /* now: %bl = irr, %bh = ppr */ + cmp %bh, %bl + ja up_set_tpr_poll_irq + +up_set_tpr_out: + pop %ebx + pop %ecx + pop %eax + popf + ret $4 + +up_set_tpr_poll_irq: + mov $kvm_hypercall_vapic_poll_irq, %eax + kvm_hypercall + jmp up_set_tpr_out .align 4096 /* ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ kvm-commits mailing list kvm-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-commits