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

Reply via email to