On 30/06/2016 22:54, Radim Krčmář wrote: > +static void __kvm_apic_state_fixup(struct kvm_vcpu *vcpu, > + struct kvm_lapic_state *s, bool set) > +{ > + if (apic_x2apic_mode(vcpu->arch.apic)) { > + u32 *id = (u32 *)(s->regs + APIC_ID); > + if (set) > + *id >>= 24; > + else > + *id <<= 24; > + }
When setting, this should read from the apic_base being set. So I think you cannot use apic_x2apic_mode. With this change, you don't need the struct kvm_vcpu argument now; add a struct kvm argument instead in patch 10. > @@ -2780,6 +2780,7 @@ static int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu > *vcpu, > kvm_x86_ops->sync_pir_to_irr(vcpu); > > memcpy(s->regs, vcpu->arch.apic->regs, sizeof *s); > + kvm_apic_state_get_fixup(vcpu, s); Instead of kvm_apic_state_get/set_fixup, group the memcpy and __kvm_apic_state_fixup in a new function kvm_apic_get_state(struct kvm_lapic *apic, char *regs). > return 0; > } > @@ -2787,6 +2788,7 @@ static int kvm_vcpu_ioctl_get_lapic(struct kvm_vcpu > *vcpu, > static int kvm_vcpu_ioctl_set_lapic(struct kvm_vcpu *vcpu, > struct kvm_lapic_state *s) > { > + kvm_apic_state_set_fixup(vcpu, s); > kvm_apic_post_state_restore(vcpu, s); ... and likewise merge these two in a refactored kvm_apic_post_state_restore called kvm_apic_set_state(struct kvm_lapic *apic, char *regs), by calling __kvm_apic_state_fixup before kvm_apic_post_state_restore's memcpy. With these changes I guess there's no need for the underscores in __kvm_apic_state_fixup. And you can also change the struct kvm_lapic_state pointer in the function to a char *. Thanks, Paolo