On 12/28/25 3:54 PM, Mohamed Mediouni wrote:
> This allows edk2 to work on Arm, although u-boot is still not functional.
>
> Signed-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>
> ---
> accel/whpx/whpx-common.c | 97 +++++++++++++++-------------------------
> 1 file changed, 36 insertions(+), 61 deletions(-)
>
> diff --git a/accel/whpx/whpx-common.c b/accel/whpx/whpx-common.c
> index 0d20b1d24c..e0db8ace4a 100644
> --- a/accel/whpx/whpx-common.c
> +++ b/accel/whpx/whpx-common.c
> @@ -259,89 +259,64 @@ void whpx_vcpu_kick(CPUState *cpu)
> * Memory support.
> */
>
> -static void whpx_update_mapping(hwaddr start_pa, ram_addr_t size,
> - void *host_va, int add, int rom,
> - const char *name)
> +static void whpx_set_phys_mem(MemoryRegionSection *section, bool add)
> {
> struct whpx_state *whpx = &whpx_global;
> + MemoryRegion *area = section->mr;
> + bool writable = !area->readonly && !area->rom_device;
> + WHV_MAP_GPA_RANGE_FLAGS flags;
> + uint64_t page_size = qemu_real_host_page_size();
> + uint64_t gva = section->offset_within_address_space;
> + uint64_t size = int128_get64(section->size);
> HRESULT hr;
> + void *mem;
>
> - /*
> - if (add) {
> - printf("WHPX: ADD PA:%p Size:%p, Host:%p, %s, '%s'\n",
> - (void*)start_pa, (void*)size, host_va,
> - (rom ? "ROM" : "RAM"), name);
> - } else {
> - printf("WHPX: DEL PA:%p Size:%p, Host:%p, '%s'\n",
> - (void*)start_pa, (void*)size, host_va, name);
> - }
> - */
> -
> - if (add) {
> - hr = whp_dispatch.WHvMapGpaRange(whpx->partition,
> - host_va,
> - start_pa,
> - size,
> - (WHvMapGpaRangeFlagRead |
> - WHvMapGpaRangeFlagExecute |
> - (rom ? 0 : WHvMapGpaRangeFlagWrite)));
> - } else {
> - hr = whp_dispatch.WHvUnmapGpaRange(whpx->partition,
> - start_pa,
> - size);
> - }
> -
> - if (FAILED(hr)) {
> - error_report("WHPX: Failed to %s GPA range '%s' PA:%p, Size:%p bytes,"
> - " Host:%p, hr=%08lx",
> - (add ? "MAP" : "UNMAP"), name,
> - (void *)(uintptr_t)start_pa, (void *)size, host_va, hr);
> + if (!memory_region_is_ram(area)) {
> + if (writable) {
> + return;
> + } else if (!memory_region_is_romd(area)) {
> + add = false;
> + }
ERROR: suspect code indent for conditional statements (8, 13)
#48: FILE: accel/whpx/whpx-common.c:277:
+ } else if (!memory_region_is_romd(area)) {
+ add = false;
Seems like a false positive from checkpatch, easier to write a second if
to workaround this.
> }
> -}
> -
> -static void whpx_process_section(MemoryRegionSection *section, int add)
> -{
> - MemoryRegion *mr = section->mr;
> - hwaddr start_pa = section->offset_within_address_space;
> - ram_addr_t size = int128_get64(section->size);
> - unsigned int delta;
> - uint64_t host_va;
>
> - if (!memory_region_is_ram(mr)) {
> - return;
> + if (!QEMU_IS_ALIGNED(size, page_size) ||
> + !QEMU_IS_ALIGNED(gva, page_size)) {
> + /* Not page aligned, so we can not map as RAM */
> + add = false;
> }
>
> - delta = qemu_real_host_page_size() - (start_pa & ~qemu_real_host_page_mask());
> - delta &= ~qemu_real_host_page_mask();
> - if (delta > size) {
> - return;
> - }
> - start_pa += delta;
> - size -= delta;
> - size &= qemu_real_host_page_mask();
> - if (!size || (start_pa & ~qemu_real_host_page_mask())) {
> + if (!add) {
> + hr = whp_dispatch.WHvUnmapGpaRange(whpx->partition,
> + gva, size);
> + if (FAILED(hr)) {
> + error_report("WHPX: failed to unmap GPA range");
> + abort();
> + }
> return;
> }
>
> - host_va = (uintptr_t)memory_region_get_ram_ptr(mr)
> - + section->offset_within_region + delta;
> + flags = WHvMapGpaRangeFlagRead | WHvMapGpaRangeFlagExecute
> + | (writable ? WHvMapGpaRangeFlagWrite : 0);
> + mem = memory_region_get_ram_ptr(area) + section->offset_within_region;
>
> - whpx_update_mapping(start_pa, size, (void *)(uintptr_t)host_va, add,
> - memory_region_is_rom(mr), mr->name);
> + hr = whp_dispatch.WHvMapGpaRange(whpx->partition,
> + mem, gva, size, flags);
> + if (FAILED(hr)) {
> + error_report("WHPX: failed to map GPA range");
> + abort();
> + }
> }
>
> static void whpx_region_add(MemoryListener *listener,
> MemoryRegionSection *section)
> {
> - memory_region_ref(section->mr);
> - whpx_process_section(section, 1);
> + whpx_set_phys_mem(section, true);
> }
>
> static void whpx_region_del(MemoryListener *listener,
> MemoryRegionSection *section)
> {
> - whpx_process_section(section, 0);
> - memory_region_unref(section->mr);
> + whpx_set_phys_mem(section, false);
> }
>
> static void whpx_transaction_begin(MemoryListener *listener)