* 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)
{
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;
}
/*
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
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 */