mirror of
https://github.com/xen-project/xen.git
synced 2026-10-30 03:00:05 +01:00
x86/svm: Don't use vmcb->tlb_control as if it is a boolean
svm_asid_handle_vmrun() treats tlb_control as if it were boolean, but this has been superseded by new additions to the SVM spec. Introduce an enum containing all legal values, and update svm_asid_handle_vmrun() to use appropriate constants. While adjusting this, take the opportunity to fix up two coding style issues, and trim the include list. No functional change. Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com> Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
d6f22d5d9e
commit
fcd06227f8
2 files changed
+19
-9
No files matched your search
@@ -15,12 +15,9 @@
|
||||
* this program; If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <xen/init.h>
|
||||
#include <xen/lib.h>
|
||||
#include <xen/perfc.h>
|
||||
#include <asm/hvm/svm/asid.h>
|
||||
#include <asm/amd.h>
|
||||
#include <asm/hvm/nestedhvm.h>
|
||||
#include <asm/hvm/svm/asid.h>
|
||||
|
||||
void svm_asid_init(const struct cpuinfo_x86 *c)
|
||||
{
|
||||
@@ -44,19 +41,21 @@ void svm_asid_handle_vmrun(void)
|
||||
struct hvm_vcpu_asid *p_asid =
|
||||
nestedhvm_vcpu_in_guestmode(curr)
|
||||
? &vcpu_nestedhvm(curr).nv_n2asid : &curr->arch.hvm.n1asid;
|
||||
bool_t need_flush = hvm_asid_handle_vmenter(p_asid);
|
||||
bool need_flush = hvm_asid_handle_vmenter(p_asid);
|
||||
|
||||
/* ASID 0 indicates that ASIDs are disabled. */
|
||||
if ( p_asid->asid == 0 )
|
||||
{
|
||||
vmcb_set_guest_asid(vmcb, 1);
|
||||
vmcb->tlb_control = 1;
|
||||
/* TODO: investigate using TLB_CTRL_FLUSH_ASID here instead. */
|
||||
vmcb->tlb_control = TLB_CTRL_FLUSH_ALL;
|
||||
return;
|
||||
}
|
||||
|
||||
if (vmcb_get_guest_asid(vmcb) != p_asid->asid)
|
||||
if ( vmcb_get_guest_asid(vmcb) != p_asid->asid )
|
||||
vmcb_set_guest_asid(vmcb, p_asid->asid);
|
||||
vmcb->tlb_control = need_flush;
|
||||
|
||||
vmcb->tlb_control = need_flush ? TLB_CTRL_FLUSH_ALL : TLB_CTRL_NO_FLUSH;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -302,6 +302,17 @@ enum VMEXIT_EXITCODE
|
||||
VMEXIT_INVALID = -1
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
/* Available on all SVM-capable hardware. */
|
||||
TLB_CTRL_NO_FLUSH = 0,
|
||||
TLB_CTRL_FLUSH_ALL = 1,
|
||||
|
||||
/* Available with the FlushByASID feature. */
|
||||
TLB_CTRL_FLUSH_ASID = 3,
|
||||
TLB_CTRL_FLUSH_ASID_NONGLOBAL = 7,
|
||||
};
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
@@ -419,7 +430,7 @@ struct vmcb_struct {
|
||||
u64 _msrpm_base_pa; /* offset 0x48 - cleanbit 1 */
|
||||
u64 _tsc_offset; /* offset 0x50 - cleanbit 0 */
|
||||
u32 _guest_asid; /* offset 0x58 - cleanbit 2 */
|
||||
u8 tlb_control; /* offset 0x5C */
|
||||
u8 tlb_control; /* offset 0x5C - TLB_CTRL_* */
|
||||
u8 res07[3];
|
||||
vintr_t _vintr; /* offset 0x60 - cleanbit 3 */
|
||||
intstat_t int_stat; /* offset 0x68 */
|
||||
|
||||