Revision e5ad936b hw/kvm/apic.c
b/hw/kvm/apic.c | ||
---|---|---|
92 | 92 |
s->tpr = (val & 0x0f) << 4; |
93 | 93 |
} |
94 | 94 |
|
95 |
static uint8_t kvm_apic_get_tpr(APICCommonState *s) |
|
96 |
{ |
|
97 |
return s->tpr >> 4; |
|
98 |
} |
|
99 |
|
|
100 |
static void kvm_apic_enable_tpr_reporting(APICCommonState *s, bool enable) |
|
101 |
{ |
|
102 |
struct kvm_tpr_access_ctl ctl = { |
|
103 |
.enabled = enable |
|
104 |
}; |
|
105 |
|
|
106 |
kvm_vcpu_ioctl(s->cpu_env, KVM_TPR_ACCESS_REPORTING, &ctl); |
|
107 |
} |
|
108 |
|
|
109 |
static void kvm_apic_vapic_base_update(APICCommonState *s) |
|
110 |
{ |
|
111 |
struct kvm_vapic_addr vapid_addr = { |
|
112 |
.vapic_addr = s->vapic_paddr, |
|
113 |
}; |
|
114 |
int ret; |
|
115 |
|
|
116 |
ret = kvm_vcpu_ioctl(s->cpu_env, KVM_SET_VAPIC_ADDR, &vapid_addr); |
|
117 |
if (ret < 0) { |
|
118 |
fprintf(stderr, "KVM: setting VAPIC address failed (%s)\n", |
|
119 |
strerror(-ret)); |
|
120 |
abort(); |
|
121 |
} |
|
122 |
} |
|
123 |
|
|
95 | 124 |
static void do_inject_external_nmi(void *data) |
96 | 125 |
{ |
97 | 126 |
APICCommonState *s = data; |
... | ... | |
129 | 158 |
k->init = kvm_apic_init; |
130 | 159 |
k->set_base = kvm_apic_set_base; |
131 | 160 |
k->set_tpr = kvm_apic_set_tpr; |
161 |
k->get_tpr = kvm_apic_get_tpr; |
|
162 |
k->enable_tpr_reporting = kvm_apic_enable_tpr_reporting; |
|
163 |
k->vapic_base_update = kvm_apic_vapic_base_update; |
|
132 | 164 |
k->external_nmi = kvm_apic_external_nmi; |
133 | 165 |
} |
134 | 166 |
|
Also available in: Unified diff