@@ -227,7 +227,7 @@ static inline void apic_set_spiv(struct kvm_lapic *apic, u32 val)
227227 }
228228}
229229
230- static inline void kvm_apic_set_id (struct kvm_lapic * apic , u8 id )
230+ static inline void kvm_apic_set_xapic_id (struct kvm_lapic * apic , u8 id )
231231{
232232 kvm_lapic_set_reg (apic , APIC_ID , id << 24 );
233233 recalculate_apic_map (apic -> vcpu -> kvm );
@@ -239,11 +239,11 @@ static inline void kvm_apic_set_ldr(struct kvm_lapic *apic, u32 id)
239239 recalculate_apic_map (apic -> vcpu -> kvm );
240240}
241241
242- static inline void kvm_apic_set_x2apic_id (struct kvm_lapic * apic , u8 id )
242+ static inline void kvm_apic_set_x2apic_id (struct kvm_lapic * apic , u32 id )
243243{
244244 u32 ldr = ((id >> 4 ) << 16 ) | (1 << (id & 0xf ));
245245
246- kvm_lapic_set_reg (apic , APIC_ID , id << 24 );
246+ kvm_lapic_set_reg (apic , APIC_ID , id );
247247 kvm_lapic_set_reg (apic , APIC_LDR , ldr );
248248 recalculate_apic_map (apic -> vcpu -> kvm );
249249}
@@ -1102,12 +1102,6 @@ static u32 __apic_read(struct kvm_lapic *apic, unsigned int offset)
11021102 return 0 ;
11031103
11041104 switch (offset ) {
1105- case APIC_ID :
1106- if (apic_x2apic_mode (apic ))
1107- val = kvm_apic_id (apic );
1108- else
1109- val = kvm_apic_id (apic ) << 24 ;
1110- break ;
11111105 case APIC_ARBPRI :
11121106 apic_debug ("Access APIC ARBPRI register which is for P6\n" );
11131107 break ;
@@ -1465,7 +1459,7 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
14651459 switch (reg ) {
14661460 case APIC_ID : /* Local APIC ID */
14671461 if (!apic_x2apic_mode (apic ))
1468- kvm_apic_set_id (apic , val >> 24 );
1462+ kvm_apic_set_xapic_id (apic , val >> 24 );
14691463 else
14701464 ret = 1 ;
14711465 break ;
@@ -1769,7 +1763,7 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
17691763 hrtimer_cancel (& apic -> lapic_timer .timer );
17701764
17711765 if (!init_event )
1772- kvm_apic_set_id (apic , vcpu -> vcpu_id );
1766+ kvm_apic_set_xapic_id (apic , vcpu -> vcpu_id );
17731767 kvm_apic_set_version (apic -> vcpu );
17741768
17751769 for (i = 0 ; i < KVM_APIC_LVT_NUM ; i ++ )
@@ -1990,17 +1984,43 @@ int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu)
19901984 return vector ;
19911985}
19921986
1993- void kvm_apic_post_state_restore (struct kvm_vcpu * vcpu ,
1994- struct kvm_lapic_state * s )
1987+ static int kvm_apic_state_fixup (struct kvm_vcpu * vcpu ,
1988+ struct kvm_lapic_state * s , bool set )
1989+ {
1990+ if (apic_x2apic_mode (vcpu -> arch .apic )) {
1991+ u32 * id = (u32 * )(s -> regs + APIC_ID );
1992+
1993+ if (set )
1994+ * id >>= 24 ;
1995+ else
1996+ * id <<= 24 ;
1997+ }
1998+
1999+ return 0 ;
2000+ }
2001+
2002+ int kvm_apic_get_state (struct kvm_vcpu * vcpu , struct kvm_lapic_state * s )
2003+ {
2004+ memcpy (s -> regs , vcpu -> arch .apic -> regs , sizeof (* s ));
2005+ return kvm_apic_state_fixup (vcpu , s , false);
2006+ }
2007+
2008+ int kvm_apic_set_state (struct kvm_vcpu * vcpu , struct kvm_lapic_state * s )
19952009{
19962010 struct kvm_lapic * apic = vcpu -> arch .apic ;
2011+ int r ;
2012+
19972013
19982014 kvm_lapic_set_base (vcpu , vcpu -> arch .apic_base );
19992015 /* set SPIV separately to get count of SW disabled APICs right */
20002016 apic_set_spiv (apic , * ((u32 * )(s -> regs + APIC_SPIV )));
2017+
2018+ r = kvm_apic_state_fixup (vcpu , s , true);
2019+ if (r )
2020+ return r ;
20012021 memcpy (vcpu -> arch .apic -> regs , s -> regs , sizeof * s );
2002- /* call kvm_apic_set_id() to put apic into apic_map */
2003- kvm_apic_set_id ( apic , kvm_apic_id ( apic ) );
2022+
2023+ recalculate_apic_map ( vcpu -> kvm );
20042024 kvm_apic_set_version (vcpu );
20052025
20062026 apic_update_ppr (apic );
@@ -2026,6 +2046,8 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu,
20262046 kvm_rtc_eoi_tracking_restore_one (vcpu );
20272047
20282048 vcpu -> arch .apic_arb_prio = 0 ;
2049+
2050+ return 0 ;
20292051}
20302052
20312053void __kvm_migrate_apic_timer (struct kvm_vcpu * vcpu )
0 commit comments