mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
x86/hvm: Add get_shadow_gs_base() wrapper function
Add a wrapper function to the HVM function table that returns the shadow GS base. Signed-off-by: Aravindh Puthiyaparambil <aravindh@virtuata.com> Committed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
99169e3037
commit
7febbdae3b
3 files changed
+22
No files matched your search
@@ -645,6 +645,11 @@ static void svm_set_segment_register(struct vcpu *v, enum x86_segment seg,
|
||||
svm_vmload(vmcb);
|
||||
}
|
||||
|
||||
static unsigned long svm_get_shadow_gs_base(struct vcpu *v)
|
||||
{
|
||||
return v->arch.hvm_svm.vmcb->kerngsbase;
|
||||
}
|
||||
|
||||
static int svm_set_guest_pat(struct vcpu *v, u64 gpat)
|
||||
{
|
||||
struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
|
||||
@@ -1990,6 +1995,7 @@ static struct hvm_function_table __read_mostly svm_function_table = {
|
||||
.guest_x86_mode = svm_guest_x86_mode,
|
||||
.get_segment_register = svm_get_segment_register,
|
||||
.set_segment_register = svm_set_segment_register,
|
||||
.get_shadow_gs_base = svm_get_shadow_gs_base,
|
||||
.update_host_cr3 = svm_update_host_cr3,
|
||||
.update_guest_cr = svm_update_guest_cr,
|
||||
.update_guest_efer = svm_update_guest_efer,
|
||||
|
||||
@@ -942,6 +942,15 @@ static void vmx_set_segment_register(struct vcpu *v, enum x86_segment seg,
|
||||
vmx_vmcs_exit(v);
|
||||
}
|
||||
|
||||
static unsigned long vmx_get_shadow_gs_base(struct vcpu *v)
|
||||
{
|
||||
#ifdef __x86_64__
|
||||
return v->arch.hvm_vmx.shadow_gs;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
static int vmx_set_guest_pat(struct vcpu *v, u64 gpat)
|
||||
{
|
||||
if ( !cpu_has_vmx_pat || !paging_mode_hap(v->domain) )
|
||||
@@ -1522,6 +1531,7 @@ static struct hvm_function_table __read_mostly vmx_function_table = {
|
||||
.guest_x86_mode = vmx_guest_x86_mode,
|
||||
.get_segment_register = vmx_get_segment_register,
|
||||
.set_segment_register = vmx_set_segment_register,
|
||||
.get_shadow_gs_base = vmx_get_shadow_gs_base,
|
||||
.update_host_cr3 = vmx_update_host_cr3,
|
||||
.update_guest_cr = vmx_update_guest_cr,
|
||||
.update_guest_efer = vmx_update_guest_efer,
|
||||
|
||||
@@ -106,6 +106,7 @@ struct hvm_function_table {
|
||||
struct segment_register *reg);
|
||||
void (*set_segment_register)(struct vcpu *v, enum x86_segment seg,
|
||||
struct segment_register *reg);
|
||||
unsigned long (*get_shadow_gs_base)(struct vcpu *v);
|
||||
|
||||
/*
|
||||
* Re-set the value of CR3 that Xen runs on when handling VM exits.
|
||||
@@ -305,6 +306,11 @@ hvm_set_segment_register(struct vcpu *v, enum x86_segment seg,
|
||||
hvm_funcs.set_segment_register(v, seg, reg);
|
||||
}
|
||||
|
||||
static inline unsigned long hvm_get_shadow_gs_base(struct vcpu *v)
|
||||
{
|
||||
return hvm_funcs.get_shadow_gs_base(v);
|
||||
}
|
||||
|
||||
#define is_viridian_domain(_d) \
|
||||
(is_hvm_domain(_d) && ((_d)->arch.hvm_domain.params[HVM_PARAM_VIRIDIAN]))
|
||||
|
||||
|
||||