extern int inst_copy_from_guest(unsigned char *buf, unsigned long guest_eip,
int inst_len);
-extern uint32_t vlapic_update_ppr(struct vlapic *vlapic);
extern asmlinkage void do_IRQ(struct cpu_user_regs *);
extern void svm_dump_inst(unsigned long eip);
extern int svm_dbg_on;
if ( vlapic == NULL )
break;
vlapic_set_reg(vlapic, APIC_TASKPRI, ((value & 0x0F) << 4));
- vlapic_update_ppr(vlapic);
break;
}
return result;
}
-uint32_t vlapic_update_ppr(struct vlapic *vlapic)
+uint32_t vlapic_get_ppr(struct vlapic *vlapic)
{
uint32_t tpr, isrv, ppr;
int isr;
- tpr = vlapic_get_reg(vlapic, APIC_TASKPRI);
+ tpr = vlapic_get_reg(vlapic, APIC_TASKPRI);
+ isr = vlapic_find_highest_isr(vlapic);
+ isrv = (isr != -1) ? isr : 0;
- isr = vlapic_find_highest_isr(vlapic);
-
- if ( isr != -1 )
- isrv = (isr >> 4) & 0xf; /* ditto */
- else
- isrv = 0;
-
- if ( (tpr >> 4) >= isrv )
+ if ( (tpr & 0xf0) >= (isrv & 0xf0) )
ppr = tpr & 0xff;
else
- ppr = isrv << 4; /* low 4 bits of PPR have to be cleared */
-
- vlapic_set_reg(vlapic, APIC_PROCPRI, ppr);
+ ppr = isrv & 0xf0;
HVM_DBG_LOG(DBG_LEVEL_VLAPIC_INTERRUPT,
"vlapic %p, ppr 0x%x, isr 0x%x, isrv 0x%x.",
return ;
vlapic_clear_vector(vector, vlapic->regs + APIC_ISR);
- vlapic_update_ppr(vlapic);
if ( vlapic_test_and_clear_vector(vector, vlapic->regs + APIC_TMR) )
ioapic_update_EOI(vlapic->domain, vector);
switch ( offset ) {
case APIC_PROCPRI:
- vlapic_update_ppr(vlapic);
- *result = vlapic_get_reg(vlapic, offset);
+ *result = vlapic_get_ppr(vlapic);
break;
case APIC_ARBPRI:
case APIC_TASKPRI:
vlapic_set_reg(vlapic, APIC_TASKPRI, val & 0xff);
- vlapic_update_ppr(vlapic);
vlapic->flush_tpr_threshold = 1;
break;
highest_irr = vlapic_find_highest_irr(vlapic);
if ( (highest_irr == -1) ||
- ((highest_irr & 0xF0) <= vlapic_get_reg(vlapic, APIC_PROCPRI)) )
+ ((highest_irr & 0xF0) <= vlapic_get_ppr(vlapic)) )
return -1;
*mode = APIC_DM_FIXED;
case APIC_DM_LOWEST:
vlapic_set_vector(vector, vlapic->regs + APIC_ISR);
vlapic_clear_irr(vector, vlapic);
- vlapic_update_ppr(vlapic);
if ( (vector == vlapic_lvt_vector(vlapic, APIC_LVTT)) &&
(vlapic->timer_pending_count != 0) )
{
#include <asm/hvm/vlapic.h>
#include <asm/x86_emulate.h>
-extern uint32_t vlapic_update_ppr(struct vlapic *vlapic);
-
static DEFINE_PER_CPU(unsigned long, trace_values[5]);
#define TRACE_VMEXIT(index,value) this_cpu(trace_values)[index]=value
if ( vlapic == NULL )
break;
vlapic_set_reg(vlapic, APIC_TASKPRI, ((value & 0x0F) << 4));
- vlapic_update_ppr(vlapic);
break;
}
default:
break;
case EXIT_REASON_TPR_BELOW_THRESHOLD:
- vlapic_update_ppr(VLAPIC(v));
VLAPIC(v)->flush_tpr_threshold = 1;
break;