Mailing List Archive

[xen staging] xen/hvm: Convert hap_capabilities into a bitfield
commit 5cd5e3070b50d4330cf116ec769b2169ccaccb6d
Author: George Dunlap <george.dunlap@cloud.com>
AuthorDate: Mon Jan 15 17:05:09 2024 +0000
Commit: George Dunlap <george.dunlap@cloud.com>
CommitDate: Mon Feb 26 15:57:56 2024 +0000

xen/hvm: Convert hap_capabilities into a bitfield

hvm_function_table is an internal structure; rather than manually
|-ing and &-ing bits, just make it a boolean bitfield and let the
compiler do all the work. This makes everything easier to read, and
presumably allows the compiler more flexibility in producing efficient
code.

No functional change intended.

Signed-off-by: George Dunlap <george.dunlap@cloud.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
---
xen/arch/x86/hvm/hvm.c | 8 ++++----
xen/arch/x86/hvm/svm/svm.c | 4 ++--
xen/arch/x86/hvm/vmx/vmcs.c | 4 ++--
xen/arch/x86/hvm/vmx/vmx.c | 8 ++------
xen/arch/x86/include/asm/hvm/hvm.h | 19 +++++++------------
5 files changed, 17 insertions(+), 26 deletions(-)

diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 87d33d116b..2965c62e94 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -174,17 +174,17 @@ static int __init cf_check hvm_enable(void)
{
printk("HVM: Hardware Assisted Paging (HAP) detected\n");
printk("HVM: HAP page sizes: 4kB");
- if ( fns->hap_capabilities & HVM_HAP_SUPERPAGE_2MB )
+ if ( fns->caps.hap_superpage_2mb )
{
printk(", 2MB%s", opt_hap_2mb ? "" : " [disabled]");
if ( !opt_hap_2mb )
- hvm_funcs.hap_capabilities &= ~HVM_HAP_SUPERPAGE_2MB;
+ hvm_funcs.caps.hap_superpage_2mb = false;
}
- if ( fns->hap_capabilities & HVM_HAP_SUPERPAGE_1GB )
+ if ( fns->caps.hap_superpage_1gb )
{
printk(", 1GB%s", opt_hap_1gb ? "" : " [disabled]");
if ( !opt_hap_1gb )
- hvm_funcs.hap_capabilities &= ~HVM_HAP_SUPERPAGE_1GB;
+ hvm_funcs.caps.hap_superpage_1gb = false;
}
printk("\n");
}
diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c
index 65f437e958..5741287355 100644
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -2581,8 +2581,8 @@ const struct hvm_function_table * __init start_svm(void)
printk(" - none\n");

svm_function_table.hap_supported = !!cpu_has_svm_npt;
- svm_function_table.hap_capabilities = HVM_HAP_SUPERPAGE_2MB |
- (cpu_has_page1gb ? HVM_HAP_SUPERPAGE_1GB : 0);
+ svm_function_table.caps.hap_superpage_2mb = true;
+ svm_function_table.caps.hap_superpage_1gb = cpu_has_page1gb;

return &svm_function_table;
}
diff --git a/xen/arch/x86/hvm/vmx/vmcs.c b/xen/arch/x86/hvm/vmx/vmcs.c
index 9e016634ab..0de2caab76 100644
--- a/xen/arch/x86/hvm/vmx/vmcs.c
+++ b/xen/arch/x86/hvm/vmx/vmcs.c
@@ -113,8 +113,8 @@ static int cf_check parse_ept_param_runtime(const char *s)
int val;

if ( !cpu_has_vmx_ept || !hvm_funcs.hap_supported ||
- !(hvm_funcs.hap_capabilities &
- (HVM_HAP_SUPERPAGE_2MB | HVM_HAP_SUPERPAGE_1GB)) )
+ !(hvm_funcs.caps.hap_superpage_2mb ||
+ hvm_funcs.caps.hap_superpage_1gb) )
{
printk("VMX: EPT not available, or not in use - ignoring\n");
return 0;
diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
index 9c803494c7..10376674b4 100644
--- a/xen/arch/x86/hvm/vmx/vmx.c
+++ b/xen/arch/x86/hvm/vmx/vmx.c
@@ -2995,12 +2995,8 @@ const struct hvm_function_table * __init start_vmx(void)
vmx_function_table.hap_supported = 1;
vmx_function_table.altp2m_supported = 1;

- vmx_function_table.hap_capabilities = 0;
-
- if ( cpu_has_vmx_ept_2mb )
- vmx_function_table.hap_capabilities |= HVM_HAP_SUPERPAGE_2MB;
- if ( cpu_has_vmx_ept_1gb )
- vmx_function_table.hap_capabilities |= HVM_HAP_SUPERPAGE_1GB;
+ vmx_function_table.caps.hap_superpage_2mb = cpu_has_vmx_ept_2mb;
+ vmx_function_table.caps.hap_superpage_1gb = cpu_has_vmx_ept_1gb;

setup_ept_dump();
}
diff --git a/xen/arch/x86/include/asm/hvm/hvm.h b/xen/arch/x86/include/asm/hvm/hvm.h
index 985c1c14c6..4e9bd0ba47 100644
--- a/xen/arch/x86/include/asm/hvm/hvm.h
+++ b/xen/arch/x86/include/asm/hvm/hvm.h
@@ -61,14 +61,6 @@ enum hvm_intblk {
#define HVM_INTR_SHADOW_SMI 0x00000004
#define HVM_INTR_SHADOW_NMI 0x00000008

-/*
- * HAP super page capabilities:
- * bit0: if 2MB super page is allowed?
- * bit1: if 1GB super page is allowed?
- */
-#define HVM_HAP_SUPERPAGE_2MB 0x00000001
-#define HVM_HAP_SUPERPAGE_1GB 0x00000002
-
#define HVM_EVENT_VECTOR_UNSET (-1)
#define HVM_EVENT_VECTOR_UPDATING (-2)

@@ -104,8 +96,11 @@ struct hvm_function_table {
/* Hardware virtual interrupt delivery enable? */
bool virtual_intr_delivery_enabled;

- /* Indicate HAP capabilities. */
- unsigned int hap_capabilities;
+ struct {
+ /* Indicate HAP capabilities. */
+ bool hap_superpage_1gb:1,
+ hap_superpage_2mb:1;
+ } caps;

/*
* Initialise/destroy HVM domain/vcpu resources
@@ -402,8 +397,8 @@ int hvm_get_param(struct domain *d, uint32_t index, uint64_t *value);
(hvm_paging_enabled(v) && ((v)->arch.hvm.guest_cr[4] & X86_CR4_PKS))

/* Can we use superpages in the HAP p2m table? */
-#define hap_has_1gb (!!(hvm_funcs.hap_capabilities & HVM_HAP_SUPERPAGE_1GB))
-#define hap_has_2mb (!!(hvm_funcs.hap_capabilities & HVM_HAP_SUPERPAGE_2MB))
+#define hap_has_1gb hvm_funcs.caps.hap_superpage_1gb
+#define hap_has_2mb hvm_funcs.caps.hap_superpage_2mb

#define hvm_long_mode_active(v) (!!((v)->arch.hvm.guest_efer & EFER_LMA))

--
generated by git-patchbot for /home/xen/git/xen.git#staging