Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/vmm/vmm_lapic.c
Show First 20 Lines • Show All 150 Lines • ▼ Show 20 Lines | |||||
bool | bool | ||||
lapic_msr(u_int msr) | lapic_msr(u_int msr) | ||||
{ | { | ||||
return (x2apic_msr(msr) || msr == MSR_APICBASE); | return (x2apic_msr(msr) || msr == MSR_APICBASE); | ||||
} | } | ||||
int | int | ||||
lapic_rdmsr(struct vm *vm, int cpu, u_int msr, uint64_t *rval, bool *retu) | lapic_rdmsr(struct vcpu *vcpu, u_int msr, uint64_t *rval, bool *retu) | ||||
{ | { | ||||
int error; | int error; | ||||
u_int offset; | u_int offset; | ||||
struct vlapic *vlapic; | struct vlapic *vlapic; | ||||
vlapic = vm_lapic(vm_vcpu(vm, cpu)); | vlapic = vm_lapic(vcpu); | ||||
if (msr == MSR_APICBASE) { | if (msr == MSR_APICBASE) { | ||||
*rval = vlapic_get_apicbase(vlapic); | *rval = vlapic_get_apicbase(vlapic); | ||||
error = 0; | error = 0; | ||||
} else { | } else { | ||||
offset = x2apic_msr_to_regoff(msr); | offset = x2apic_msr_to_regoff(msr); | ||||
error = vlapic_read(vlapic, 0, offset, rval, retu); | error = vlapic_read(vlapic, 0, offset, rval, retu); | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
int | int | ||||
lapic_wrmsr(struct vm *vm, int cpu, u_int msr, uint64_t val, bool *retu) | lapic_wrmsr(struct vcpu *vcpu, u_int msr, uint64_t val, bool *retu) | ||||
{ | { | ||||
int error; | int error; | ||||
u_int offset; | u_int offset; | ||||
struct vlapic *vlapic; | struct vlapic *vlapic; | ||||
vlapic = vm_lapic(vm_vcpu(vm, cpu)); | vlapic = vm_lapic(vcpu); | ||||
if (msr == MSR_APICBASE) { | if (msr == MSR_APICBASE) { | ||||
error = vlapic_set_apicbase(vlapic, val); | error = vlapic_set_apicbase(vlapic, val); | ||||
} else { | } else { | ||||
offset = x2apic_msr_to_regoff(msr); | offset = x2apic_msr_to_regoff(msr); | ||||
error = vlapic_write(vlapic, 0, offset, val, retu); | error = vlapic_write(vlapic, 0, offset, val, retu); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 48 Lines • Show Last 20 Lines |