2 # Local APIC acceleration for Windows XP and related guests
4 # Copyright 2011 Red Hat, Inc. and/or its affiliates
6 # Author: Avi Kivity <avi@redhat.com>
8 # This work is licensed under the terms of the GNU GPL, version 2, or (at your
9 # option) any later version. See the COPYING file in the top-level directory.
17 .byte (_end - _start) / 512
18 # clear vapic area: firmware load using rep insb may cause
19 # stale tpr/isr/irr data to corrupt the vapic area.
24 mov $vapic_size/2, %cx
39 .long 777b + \delta - vapic_base
57 .long vapic_base ; fixup
58 .long fixup_start ; fixup
59 .long fixup_end ; fixup
67 .long up_set_tpr ; fixup
68 .long up_set_tpr_eax ; fixup
69 .long up_get_tpr_eax ; fixup
70 .long up_get_tpr_ecx ; fixup
71 .long up_get_tpr_edx ; fixup
72 .long up_get_tpr_ebx ; fixup
73 .long 0 /* esp. won't work. */
74 .long up_get_tpr_ebp ; fixup
75 .long up_get_tpr_esi ; fixup
76 .long up_get_tpr_edi ; fixup
77 .long up_get_tpr_stack ; fixup
78 .long mp_set_tpr ; fixup
79 .long mp_set_tpr_eax ; fixup
80 .long mp_get_tpr_eax ; fixup
81 .long mp_get_tpr_ecx ; fixup
82 .long mp_get_tpr_edx ; fixup
83 .long mp_get_tpr_ebx ; fixup
84 .long 0 /* esp. won't work. */
85 .long mp_get_tpr_ebp ; fixup
86 .long mp_get_tpr_esi ; fixup
87 .long mp_get_tpr_edi ; fixup
88 .long mp_get_tpr_stack ; fixup
91 .byte 0x0f, 0x01, 0xc1
94 kvm_hypercall_vapic_poll_irq = 1
106 fs/movzbl pcr_cpu, %eax
108 mov vcpu_shift, %ecx ; fixup
110 testb $1, vapic+4(%eax) ; fixup delta=-5
112 movzbl vapic(%eax), %eax ; fixup
120 mov real_tpr, %eax ; fixup
180 fs/movzbl pcr_cpu, %edx
182 mov vcpu_shift, %ecx ; fixup
185 testb $1, vapic+4(%edx) ; fixup delta=-5
188 mov vapic(%edx), %eax ; fixup
193 /* %ebx = new vapic (%bl = tpr, %bh = isr, %b3 = irr) */
195 lock cmpxchg %ebx, vapic(%edx) ; fixup
196 jnz mp_set_tpr_failed
205 mov %bl, %ch /* ch = ppr */
207 /* now: %bl = irr, %bh = ppr */
209 ja mp_set_tpr_poll_irq
220 mov $kvm_hypercall_vapic_poll_irq, %eax
226 mov real_tpr, %eax ; fixup
232 movzbl vapic, %eax ; fixup
237 movzbl vapic, %ebx ; fixup
242 movzbl vapic, %ecx ; fixup
247 movzbl vapic, %edx ; fixup
252 movzbl vapic, %esi ; fixup
257 movzbl vapic, %edi ; fixup
262 movzbl vapic, %ebp ; fixup
267 movzbl vapic, %eax ; fixup
284 mov vapic, %eax ; fixup
289 /* %ebx = new vapic (%bl = tpr, %bh = isr, %b3 = irr) */
291 lock cmpxchg %ebx, vapic ; fixup
292 jnz up_set_tpr_failed
301 mov %bl, %ch /* ch = ppr */
303 /* now: %bl = irr, %bh = ppr */
305 ja up_set_tpr_poll_irq
315 mov $kvm_hypercall_vapic_poll_irq, %eax
325 * per-vcpu records of size 2^vcpu shift.
327 * byte 1: highest in-service interrupt (isr) (r/o); bits 3:0 are zero
329 * byte 3: highest pending interrupt (irr) (r/o)
338 .byte 0 # reserve space for signature