From d13e44fe048159d48891887169f756ac974d07fb Mon Sep 17 00:00:00 2001 From: Jason Zeng Date: Mon, 26 May 2025 16:49:00 +0800 Subject: [PATCH 1/4] hw/arm/virt: decouple migrate_hdbss_buffer_size() with kvm_update_hdbss_cap() So that we can move kvm_update_hdbss_cap() to accel/kvm/kvm-all.c Signed-of-by: Jason Zeng --- migration/ram.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/migration/ram.c b/migration/ram.c index a8308eb005..ee57da62f6 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -2813,7 +2813,7 @@ static void xbzrle_cleanup(void) } #ifdef TARGET_AARCH64 -static void kvm_update_hdbss_cap(bool enable) +static void kvm_update_hdbss_cap(bool enable, int hdbss_buffer_size) { KVMState *s = kvm_state; int size, ret; @@ -2822,7 +2822,7 @@ static void kvm_update_hdbss_cap(bool enable) return; } - size = migrate_hdbss_buffer_size(); + size = hdbss_buffer_size; if (size < 0 || size > MAX_HDBSS_BUFFER_SIZE) { fprintf(stderr, "Invalid hdbss buffer size: %d\n", size); return; @@ -2856,7 +2856,7 @@ static void ram_save_cleanup(void *opaque) * memory_global_dirty_log_start/stop used in pairs */ #ifdef TARGET_AARCH64 - kvm_update_hdbss_cap(false); + kvm_update_hdbss_cap(false, 0); #endif memory_global_dirty_log_stop(GLOBAL_DIRTY_MIGRATION); } @@ -3262,7 +3262,7 @@ static void ram_init_bitmaps(RAMState *rs) /* We don't use dirty log with background snapshots */ if (!migrate_background_snapshot()) { #ifdef TARGET_AARCH64 - kvm_update_hdbss_cap(true); + kvm_update_hdbss_cap(true, migrate_hdbss_buffer_size()); #endif memory_global_dirty_log_start(GLOBAL_DIRTY_MIGRATION); migration_bitmap_sync_precopy(rs, false); -- Gitee From ff64aed3c87427dfa65fa85aef93b44372aefe7d Mon Sep 17 00:00:00 2001 From: Jason Zeng Date: Mon, 26 May 2025 16:59:20 +0800 Subject: [PATCH 2/4] hw/arm/virt: HDBSS: fix arm-softmmu build on x86 platform Move kvm_update_hdbss_cap() to accel/kvm/kvm-stub.c, check kvm_enabled() and add stub function Fixes: e549f32b1a88 ("hw/arm/virt: support the HDBSS feature") Signed-off-by: Jason Zeng --- accel/kvm/kvm-all.c | 25 +++++++++++++++++++++++++ accel/stubs/kvm-stub.c | 5 +++++ include/sysemu/kvm.h | 8 ++++++++ migration/migration.h | 7 ------- migration/ram.c | 35 ++++++----------------------------- 5 files changed, 44 insertions(+), 36 deletions(-) diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index f96afb1230..7d175d3262 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -3251,6 +3251,31 @@ bool kvm_arm_supports_user_irq(void) return kvm_check_extension(kvm_state, KVM_CAP_ARM_USER_IRQ); } +void kvm_update_hdbss_cap(bool enable, int hdbss_buffer_size) +{ + KVMState *s = kvm_state; + int size, ret; + + if (s == NULL || !kvm_check_extension(s, KVM_CAP_ARM_HW_DIRTY_STATE_TRACK)) { + return; + } + + size = hdbss_buffer_size; + if (size < 0 || size > MAX_HDBSS_BUFFER_SIZE) { + fprintf(stderr, "Invalid hdbss buffer size: %d\n", size); + return; + } + + ret = kvm_vm_enable_cap(s, KVM_CAP_ARM_HW_DIRTY_STATE_TRACK, 0, + enable ? size : 0); + if (ret) { + fprintf(stderr, "Could not %s KVM_CAP_ARM_HW_DIRTY_STATE_TRACK: %d\n", + enable ? "enable" : "disable", ret); + } + + return; +} + #ifdef KVM_CAP_SET_GUEST_DEBUG struct kvm_sw_breakpoint *kvm_find_sw_breakpoint(CPUState *cpu, vaddr pc) { diff --git a/accel/stubs/kvm-stub.c b/accel/stubs/kvm-stub.c index 1fffdc0ea2..2625175b99 100644 --- a/accel/stubs/kvm-stub.c +++ b/accel/stubs/kvm-stub.c @@ -119,6 +119,11 @@ bool kvm_arm_supports_user_irq(void) return false; } +void kvm_update_hdbss_cap(bool enable, int hdbss_buffer_size) +{ + g_assert_not_reached(); +} + bool kvm_dirty_ring_enabled(void) { return false; diff --git a/include/sysemu/kvm.h b/include/sysemu/kvm.h index 16cccc881e..098257e72f 100644 --- a/include/sysemu/kvm.h +++ b/include/sysemu/kvm.h @@ -229,6 +229,14 @@ int kvm_has_gsi_routing(void); */ bool kvm_arm_supports_user_irq(void); +/* + * The default HDBSS size. The value ranges [0, 9]. + * Set to 0 to disable the HDBSS feature. + */ +#define DEFAULT_HDBSS_BUFFER_SIZE 0 +#define MAX_HDBSS_BUFFER_SIZE 9 + +void kvm_update_hdbss_cap(bool enable, int hdbss_buffer_size); int kvm_on_sigbus_vcpu(CPUState *cpu, int code, void *addr); int kvm_on_sigbus(int code, void *addr); diff --git a/migration/migration.h b/migration/migration.h index 4a95f00157..eeddb7c0bd 100644 --- a/migration/migration.h +++ b/migration/migration.h @@ -48,13 +48,6 @@ struct PostcopyBlocktimeContext; */ #define CLEAR_BITMAP_SHIFT_MAX 31 -/* - * The default HDBSS size. The value ranges [0, 9]. - * Set to 0 to disable the HDBSS feature. - */ -#define DEFAULT_HDBSS_BUFFER_SIZE 0 -#define MAX_HDBSS_BUFFER_SIZE 9 - /* This is an abstraction of a "temp huge page" for postcopy's purpose */ typedef struct { /* diff --git a/migration/ram.c b/migration/ram.c index ee57da62f6..91bec89a6e 100644 --- a/migration/ram.c +++ b/migration/ram.c @@ -2812,33 +2812,6 @@ static void xbzrle_cleanup(void) XBZRLE_cache_unlock(); } -#ifdef TARGET_AARCH64 -static void kvm_update_hdbss_cap(bool enable, int hdbss_buffer_size) -{ - KVMState *s = kvm_state; - int size, ret; - - if (s == NULL || !kvm_check_extension(s, KVM_CAP_ARM_HW_DIRTY_STATE_TRACK)) { - return; - } - - size = hdbss_buffer_size; - if (size < 0 || size > MAX_HDBSS_BUFFER_SIZE) { - fprintf(stderr, "Invalid hdbss buffer size: %d\n", size); - return; - } - - ret = kvm_vm_enable_cap(s, KVM_CAP_ARM_HW_DIRTY_STATE_TRACK, 0, - enable ? size : 0); - if (ret) { - fprintf(stderr, "Could not %s KVM_CAP_ARM_HW_DIRTY_STATE_TRACK: %d\n", - enable ? "enable" : "disable", ret); - } - - return; -} -#endif - static void ram_save_cleanup(void *opaque) { RAMState **rsp = opaque; @@ -2856,7 +2829,9 @@ static void ram_save_cleanup(void *opaque) * memory_global_dirty_log_start/stop used in pairs */ #ifdef TARGET_AARCH64 - kvm_update_hdbss_cap(false, 0); + if (kvm_enabled()) { + kvm_update_hdbss_cap(false, 0); + } #endif memory_global_dirty_log_stop(GLOBAL_DIRTY_MIGRATION); } @@ -3262,7 +3237,9 @@ static void ram_init_bitmaps(RAMState *rs) /* We don't use dirty log with background snapshots */ if (!migrate_background_snapshot()) { #ifdef TARGET_AARCH64 - kvm_update_hdbss_cap(true, migrate_hdbss_buffer_size()); + if (kvm_enabled()) { + kvm_update_hdbss_cap(true, migrate_hdbss_buffer_size()); + } #endif memory_global_dirty_log_start(GLOBAL_DIRTY_MIGRATION); migration_bitmap_sync_precopy(rs, false); -- Gitee From 3f2e953c7faf3043396a649d4891d3d95441e70f Mon Sep 17 00:00:00 2001 From: Jason Zeng Date: Mon, 26 May 2025 17:06:57 +0800 Subject: [PATCH 3/4] arm: VirtCCA: fix arm-softmmu build on x86 platform Add stub function for kvm_load_user_data(). Fixes: 9eacd1a6df68 ("arm: VirtCCA: CVM support UEFI boot") Signed-off-by: Jason Zeng --- accel/stubs/kvm-stub.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/accel/stubs/kvm-stub.c b/accel/stubs/kvm-stub.c index 2625175b99..e68f3433ad 100644 --- a/accel/stubs/kvm-stub.c +++ b/accel/stubs/kvm-stub.c @@ -133,3 +133,9 @@ uint32_t kvm_dirty_ring_size(void) { return 0; } + +int kvm_load_user_data(hwaddr loader_start, hwaddr image_end, hwaddr initrd_start, hwaddr dtb_end, hwaddr ram_size, + struct kvm_numa_info *numa_info) +{ + return -ENOSYS; +} -- Gitee From e97171b8b362b0122754a936053c9793a6ad2f57 Mon Sep 17 00:00:00 2001 From: Jason Zeng Date: Mon, 26 May 2025 17:08:49 +0800 Subject: [PATCH 4/4] arm: cvm: fix arm-softmmu build on x86 platform Add stub function for tmm_set_sec_addr() and tmm_set_hpre_addr() Fixes: dffc0f55d93e ("cvm : Add support for TEE-based national encryption acceleration.") Signed-off-by: Jason Zeng --- target/arm/kvm_arm.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/target/arm/kvm_arm.h b/target/arm/kvm_arm.h index 62fbb713f4..76137289df 100644 --- a/target/arm/kvm_arm.h +++ b/target/arm/kvm_arm.h @@ -497,6 +497,16 @@ static inline void tmm_add_ram_region(hwaddr base1, hwaddr len1, hwaddr base2, { g_assert_not_reached(); } + +static inline void tmm_set_sec_addr(hwaddr base, int num) +{ + g_assert_not_reached(); +} + +static inline void tmm_set_hpre_addr(hwaddr base, int num) +{ + g_assert_not_reached(); +} #endif /** -- Gitee