@@ -227,7 +227,7 @@ static inline void apic_set_spiv(struct kvm_lapic *apic, u32 val)
227
227
}
228
228
}
229
229
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 )
231
231
{
232
232
kvm_lapic_set_reg (apic , APIC_ID , id << 24 );
233
233
recalculate_apic_map (apic -> vcpu -> kvm );
@@ -239,11 +239,11 @@ static inline void kvm_apic_set_ldr(struct kvm_lapic *apic, u32 id)
239
239
recalculate_apic_map (apic -> vcpu -> kvm );
240
240
}
241
241
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 )
243
243
{
244
244
u32 ldr = ((id >> 4 ) << 16 ) | (1 << (id & 0xf ));
245
245
246
- kvm_lapic_set_reg (apic , APIC_ID , id << 24 );
246
+ kvm_lapic_set_reg (apic , APIC_ID , id );
247
247
kvm_lapic_set_reg (apic , APIC_LDR , ldr );
248
248
recalculate_apic_map (apic -> vcpu -> kvm );
249
249
}
@@ -1102,12 +1102,6 @@ static u32 __apic_read(struct kvm_lapic *apic, unsigned int offset)
1102
1102
return 0 ;
1103
1103
1104
1104
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 ;
1111
1105
case APIC_ARBPRI :
1112
1106
apic_debug ("Access APIC ARBPRI register which is for P6\n" );
1113
1107
break ;
@@ -1465,7 +1459,7 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
1465
1459
switch (reg ) {
1466
1460
case APIC_ID : /* Local APIC ID */
1467
1461
if (!apic_x2apic_mode (apic ))
1468
- kvm_apic_set_id (apic , val >> 24 );
1462
+ kvm_apic_set_xapic_id (apic , val >> 24 );
1469
1463
else
1470
1464
ret = 1 ;
1471
1465
break ;
@@ -1769,7 +1763,7 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event)
1769
1763
hrtimer_cancel (& apic -> lapic_timer .timer );
1770
1764
1771
1765
if (!init_event )
1772
- kvm_apic_set_id (apic , vcpu -> vcpu_id );
1766
+ kvm_apic_set_xapic_id (apic , vcpu -> vcpu_id );
1773
1767
kvm_apic_set_version (apic -> vcpu );
1774
1768
1775
1769
for (i = 0 ; i < KVM_APIC_LVT_NUM ; i ++ )
@@ -1990,17 +1984,43 @@ int kvm_get_apic_interrupt(struct kvm_vcpu *vcpu)
1990
1984
return vector ;
1991
1985
}
1992
1986
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 )
1995
2009
{
1996
2010
struct kvm_lapic * apic = vcpu -> arch .apic ;
2011
+ int r ;
2012
+
1997
2013
1998
2014
kvm_lapic_set_base (vcpu , vcpu -> arch .apic_base );
1999
2015
/* set SPIV separately to get count of SW disabled APICs right */
2000
2016
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 ;
2001
2021
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 );
2004
2024
kvm_apic_set_version (vcpu );
2005
2025
2006
2026
apic_update_ppr (apic );
@@ -2026,6 +2046,8 @@ void kvm_apic_post_state_restore(struct kvm_vcpu *vcpu,
2026
2046
kvm_rtc_eoi_tracking_restore_one (vcpu );
2027
2047
2028
2048
vcpu -> arch .apic_arb_prio = 0 ;
2049
+
2050
+ return 0 ;
2029
2051
}
2030
2052
2031
2053
void __kvm_migrate_apic_timer (struct kvm_vcpu * vcpu )
0 commit comments