{"id":2231444,"url":"http://patchwork.ozlabs.org/api/patches/2231444/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260430172204.1006673-38-pbonzini@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260430172204.1006673-38-pbonzini@redhat.com>","list_archive_url":null,"date":"2026-04-30T17:21:43","name":"[PULL,37/58] whpx: i386: fix CPUID[1:EDX].APIC reporting","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"d74f1a39346ba8c0ce97fec82b0b73bd803b8120","submitter":{"id":2701,"url":"http://patchwork.ozlabs.org/api/people/2701/?format=json","name":"Paolo Bonzini","email":"pbonzini@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20260430172204.1006673-38-pbonzini@redhat.com/mbox/","series":[{"id":502347,"url":"http://patchwork.ozlabs.org/api/series/502347/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=502347","date":"2026-04-30T17:21:16","name":"[PULL,01/58] pythondeps: bump to meson 1.11.1","version":1,"mbox":"http://patchwork.ozlabs.org/series/502347/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2231444/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2231444/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=REt/EHqG;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=google header.b=DqQTGeNE;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists1p.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists1p.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g61Nr2bqkz1yHZ\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 01 May 2026 03:28:44 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists1p.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wIV7g-00073R-RO; Thu, 30 Apr 2026 13:24:24 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <pbonzini@redhat.com>)\n id 1wIV7R-0005qF-0q\n for qemu-devel@nongnu.org; Thu, 30 Apr 2026 13:24:09 -0400","from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <pbonzini@redhat.com>)\n id 1wIV7P-0004nN-4b\n for qemu-devel@nongnu.org; Thu, 30 Apr 2026 13:24:08 -0400","from mail-qt1-f200.google.com (mail-qt1-f200.google.com\n [209.85.160.200]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-179-9I07aE_SM_-_SKCMAYLP-A-1; Thu, 30 Apr 2026 13:24:05 -0400","by mail-qt1-f200.google.com with SMTP id\n d75a77b69052e-50e575a50bcso14866391cf.0\n for <qemu-devel@nongnu.org>; Thu, 30 Apr 2026 10:24:05 -0700 (PDT)","from [192.168.10.48] ([151.49.85.67])\n by smtp.gmail.com with ESMTPSA id\n d75a77b69052e-5103d31247asm254421cf.21.2026.04.30.10.24.01\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 30 Apr 2026 10:24:02 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777569846;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=UtYPUP+zX5XFauzLUam2kOgdCIkSyTwZpZcAHKldk2A=;\n b=REt/EHqGLAiFyyfhd8RBduZTeGU0+4MZDQtIs4o2kq5csmvSJEemQxLFM8IfjWVput5hV+\n 9Bg5/bWqDaNMCOjQ/3K/ZaDrslkWRFfvtGX1RGI5Lu2ibcrT8TjjeQCLWcUBFczOzgRWuE\n 6/v+YvcGoT5LWt9aIweIl52+0QPsnDQ=","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=redhat.com; s=google; t=1777569844; x=1778174644; darn=nongnu.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=UtYPUP+zX5XFauzLUam2kOgdCIkSyTwZpZcAHKldk2A=;\n b=DqQTGeNE2+1Sm9Kfs8v/zT9ugGXzpoTQDE0eE4ANEtUshIVR2bV3Vr/PWT/UoSlU0U\n RfCSX9cx3vNuzoW9zj4EvmQTlfV9d5zmTFHkUIQxC5RHUr28p1MtV8hF9AgY+7aKe77l\n +VaACi0cLxU74SEH6pbes9KzPV3zAxuqerZNSf+KCkfdwOk83Iu++lA15NKh9C9sxTX4\n J/qu4TQ0de1Os2GpJqoxP8+At+t7LisQbgm3Q/Jvkg343zvo/oStuPVe/0Th8tlTJI6G\n irbUrrOGq+/7/s3jN97X5Mh7J08pFol182DGZtWe+ihSIwOsKsess4fl/wr48fxayIoW\n 8BQQ=="],"X-MC-Unique":"9I07aE_SM_-_SKCMAYLP-A-1","X-Mimecast-MFC-AGG-ID":"9I07aE_SM_-_SKCMAYLP-A_1777569845","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777569844; x=1778174644;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=UtYPUP+zX5XFauzLUam2kOgdCIkSyTwZpZcAHKldk2A=;\n b=mOwTLBNvNKNZr49XAvANQbxz+r/9Q5w6UJVjwf5Mm46wZQmanG2YObi/z/LiozEzES\n Z1JN4EzV75PrOwGnIItcc3xXeFQxHrvITti3r4Wna6ZHVl+1X1GWqEzfgK1hDkKSfgvc\n rV+NoRoDjdrllF4fVYddZo+NwKY4dYvg3aqJh7oKsOloaqQ/jrn94TRhTKM29z7RIXmp\n W/WX+w+zdwu7bHrhZZ8mY+fbUFSyHSM7w++xuVpSyt4FmyCPnPjRmD8sOJAasK3lOyT5\n 2yfwv+2mv+wHJJhyn+QYWCFSmQ6RNPlYJ8bzlyPHdk8K80tEaG6kjAk4kJZjjt9HDfnO\n yqcQ==","X-Gm-Message-State":"AOJu0Yz27JwAjirVbvzt9LQTUfKENnPJMozwIS6lm43MhfQVo+5LXv8K\n CozZp+Qtfdcsha+RSYk4dZ5OfXgON4jpB8O93PCGwwRpNsVCvbGYDjfohaEu+iFzn8GcfQHkw0l\n 8HCM2Ummg/u5mx6sgVowXpqRgMFulXWi8i/CKO5KsbT0RhN6eIeolxgKgVSiSKbPXk7Nrjl81jX\n PFHqwQHg1eNXvBssw0J8RmmJ/smlIFgYZVUVM7HTGk","X-Gm-Gg":"AeBDievMKlEpxrSCb59AbpK7cMO8kV2DRwQAxwy5MUszCsRPcPdkGU6nA8VdSwetbm9\n XluP0ZNxxQMCci+3WLP3GUX6OMR/3suBl1ciMuS+YH29j7BiczKresAwWzfmmDOUSaYulsck6LJ\n UMsfRre7FWeEP4KMzCZok8RXyZkG3GTteLA0u54YvNNJGuHSxaQ0nh2rCpxinLbAEiY0tuWiqZt\n mC503BCNzptqHHJ8814i3sn/CKcJS6Yj1lnvlU/FhMS2/5I5RGvMw4vronhCVDS6jDfe3DN/Ddk\n T3IQp98+Z3q24gcG+TpL02DLl1jnUgCQJR+1L5AYcnuKs84pEZ0KX6KLSNLPDGF5k/I3Ma4EARb\n j/Wn26fpTZUsf6ZAsrL62EQ3IA/PlUT0pXdO6D33s9PEYFqmi3vJa31NfvT2M29rpeEJnSHWevz\n TnS0NrrJb3KH3+SPZPHpNPbjfXwjDtAqKvTzg=","X-Received":["by 2002:a05:622a:199d:b0:50f:ae60:25ab with SMTP id\n d75a77b69052e-5102ab1c0abmr56558881cf.12.1777569843696;\n Thu, 30 Apr 2026 10:24:03 -0700 (PDT)","by 2002:a05:622a:199d:b0:50f:ae60:25ab with SMTP id\n d75a77b69052e-5102ab1c0abmr56558101cf.12.1777569843084;\n Thu, 30 Apr 2026 10:24:03 -0700 (PDT)"],"From":"Paolo Bonzini <pbonzini@redhat.com>","To":"qemu-devel@nongnu.org","Cc":"Mohamed Mediouni <mohamed@unpredictable.fr>","Subject":"[PULL 37/58] whpx: i386: fix CPUID[1:EDX].APIC reporting","Date":"Thu, 30 Apr 2026 19:21:43 +0200","Message-ID":"<20260430172204.1006673-38-pbonzini@redhat.com>","X-Mailer":"git-send-email 2.54.0","In-Reply-To":"<20260430172204.1006673-1-pbonzini@redhat.com>","References":"<20260430172204.1006673-1-pbonzini@redhat.com>","MIME-Version":"1.0","Content-Transfer-Encoding":"8bit","Received-SPF":"pass client-ip=170.10.129.124;\n envelope-from=pbonzini@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com","X-Spam_score_int":"-20","X-Spam_score":"-2.1","X-Spam_bar":"--","X-Spam_report":"(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"},"content":"From: Mohamed Mediouni <mohamed@unpredictable.fr>\n\nHyper-V always has CPUID[1:EDX].APIC set, even when the APIC isn't enabled yet.\n\nWork around this by also using the APICBASE trap for kernel-irqchip=on.\n\nSigned-off-by: Mohamed Mediouni <mohamed@unpredictable.fr>\nLink: https://lore.kernel.org/r/20260422214225.2242-16-mohamed@unpredictable.fr\nSigned-off-by: Paolo Bonzini <pbonzini@redhat.com>\n---\n include/system/whpx-common.h |  1 -\n target/i386/whpx/whpx-all.c  | 34 ++++++++---------\n target/i386/whpx/whpx-apic.c | 71 ++++++++++++++++++++++++++++++++++--\n 3 files changed, 84 insertions(+), 22 deletions(-)","diff":"diff --git a/include/system/whpx-common.h b/include/system/whpx-common.h\nindex 3406c20fec0..79710e2fb3c 100644\n--- a/include/system/whpx-common.h\n+++ b/include/system/whpx-common.h\n@@ -8,7 +8,6 @@ struct AccelCPUState {\n     bool interruptable;\n     bool ready_for_pic_interrupt;\n     uint64_t tpr;\n-    uint64_t apic_base;\n     bool interruption_pending;\n     /* Must be the last field as it may have a tail */\n     WHV_RUN_VP_EXIT_CONTEXT exit_ctx;\ndiff --git a/target/i386/whpx/whpx-all.c b/target/i386/whpx/whpx-all.c\nindex 012fa6d0216..b0556445801 100644\n--- a/target/i386/whpx/whpx-all.c\n+++ b/target/i386/whpx/whpx-all.c\n@@ -139,7 +139,6 @@ static const WHV_REGISTER_NAME whpx_register_names[] = {\n #ifdef TARGET_X86_64\n     WHvX64RegisterKernelGsBase,\n #endif\n-    WHvX64RegisterApicBase,\n     /* WHvX64RegisterPat, */\n     WHvX64RegisterSysenterCs,\n     WHvX64RegisterSysenterEip,\n@@ -420,7 +419,6 @@ void whpx_set_registers(CPUState *cpu, WHPXStateLevel level)\n     r86 = !(env->cr[0] & CR0_PE_MASK);\n \n     vcpu->tpr = cpu_get_apic_tpr(x86_cpu->apic_state);\n-    vcpu->apic_base = cpu_get_apic_base(x86_cpu->apic_state);\n \n     idx = 0;\n \n@@ -538,9 +536,6 @@ void whpx_set_registers(CPUState *cpu, WHPXStateLevel level)\n         vcxt.values[idx++].Reg64 = env->kernelgsbase;\n #endif\n \n-        assert(whpx_register_names[idx] == WHvX64RegisterApicBase);\n-        vcxt.values[idx++].Reg64 = vcpu->apic_base;\n-\n         /* WHvX64RegisterPat - Skipped */\n \n         assert(whpx_register_names[idx] == WHvX64RegisterSysenterCs);\n@@ -575,6 +570,12 @@ void whpx_set_registers(CPUState *cpu, WHPXStateLevel level)\n         error_report(\"WHPX: Failed to set virtual processor context, hr=%08lx\",\n                      hr);\n     }\n+\n+    if (level >= WHPX_LEVEL_FULL_STATE) {\n+        WHV_REGISTER_VALUE apic_base = {};\n+        apic_base.Reg64 = cpu_get_apic_base(X86_CPU(cpu)->apic_state);\n+        whpx_set_reg(cpu, WHvX64RegisterApicBase, apic_base);\n+    }\n }\n \n static int whpx_get_tsc(CPUState *cpu)\n@@ -666,7 +667,7 @@ void whpx_get_registers(CPUState *cpu, WHPXStateLevel level)\n     X86CPU *x86_cpu = X86_CPU(cpu);\n     CPUX86State *env = &x86_cpu->env;\n     struct whpx_register_set vcxt;\n-    uint64_t tpr, apic_base;\n+    uint64_t tpr;\n     HRESULT hr;\n     int idx;\n     int idx_next;\n@@ -798,13 +799,6 @@ void whpx_get_registers(CPUState *cpu, WHPXStateLevel level)\n     env->kernelgsbase = vcxt.values[idx++].Reg64;\n #endif\n \n-    assert(whpx_register_names[idx] == WHvX64RegisterApicBase);\n-    apic_base = vcxt.values[idx++].Reg64;\n-    if (apic_base != vcpu->apic_base) {\n-        vcpu->apic_base = apic_base;\n-        cpu_set_apic_base(x86_cpu->apic_state, vcpu->apic_base);\n-    }\n-\n     /* WHvX64RegisterPat - Skipped */\n \n     assert(whpx_register_names[idx] == WHvX64RegisterSysenterCs);\n@@ -2082,8 +2076,7 @@ int whpx_vcpu_run(CPUState *cpu)\n                 val = X86_CPU(cpu)->env.apic_bus_freq;\n             }\n \n-            if (!whpx_irqchip_in_kernel() &&\n-                vcpu->exit_ctx.MsrAccess.MsrNumber == MSR_IA32_APICBASE) {\n+            if (vcpu->exit_ctx.MsrAccess.MsrNumber == MSR_IA32_APICBASE) {\n                 is_known_msr = 1;\n                 if (!vcpu->exit_ctx.MsrAccess.AccessInfo.IsWrite) {\n                     /* Read path unreachable on Hyper-V */\n@@ -2233,6 +2226,13 @@ int whpx_vcpu_run(CPUState *cpu)\n                 } else {\n                     reg_values[2].Reg32 &= ~CPUID_EXT_X2APIC;\n                 }\n+\n+                /* CPUID[1:EDX].APIC is dynamic */\n+                if (env->features[FEAT_1_EDX] & CPUID_APIC) {\n+                    reg_values[3].Reg32 |= CPUID_APIC;\n+                } else {\n+                    reg_values[3].Reg32 &= ~CPUID_APIC;\n+                }\n             }\n \n             /* Dynamic depending on XCR0 and XSS, so query DefaultResult */\n@@ -2804,9 +2804,7 @@ int whpx_accel_init(AccelState *as, MachineState *ms)\n \n     memset(&prop, 0, sizeof(WHV_PARTITION_PROPERTY));\n     prop.X64MsrExitBitmap.UnhandledMsrs = 1;\n-    if (!whpx_irqchip_in_kernel()) {\n-        prop.X64MsrExitBitmap.ApicBaseMsrWrite = 1;\n-    }\n+    prop.X64MsrExitBitmap.ApicBaseMsrWrite = 1;\n \n     hr = whp_dispatch.WHvSetPartitionProperty(\n             whpx->partition,\ndiff --git a/target/i386/whpx/whpx-apic.c b/target/i386/whpx/whpx-apic.c\nindex f26ecaf6e83..65629ca45f9 100644\n--- a/target/i386/whpx/whpx-apic.c\n+++ b/target/i386/whpx/whpx-apic.c\n@@ -90,9 +90,70 @@ static void whpx_get_apic_state(APICCommonState *s,\n     apic_next_timer(s, s->initial_count_load_time);\n }\n \n-static int whpx_apic_set_base(APICCommonState *s, uint64_t val)\n+static int apic_set_base_check(APICCommonState *s, uint64_t val)\n {\n-    s->apicbase = val;\n+    /* Enable x2apic when x2apic is not supported by CPU */\n+    if (!cpu_has_x2apic_feature(&s->cpu->env) &&\n+        val & MSR_IA32_APICBASE_EXTD) {\n+        return -1;\n+    }\n+\n+    /*\n+     * Transition into invalid state\n+     * (s->apicbase & MSR_IA32_APICBASE_ENABLE == 0) &&\n+     * (s->apicbase & MSR_IA32_APICBASE_EXTD) == 1\n+     */\n+    if (!(val & MSR_IA32_APICBASE_ENABLE) &&\n+        (val & MSR_IA32_APICBASE_EXTD)) {\n+        return -1;\n+    }\n+\n+    /* Invalid transition from disabled mode to x2APIC */\n+    if (!(s->apicbase & MSR_IA32_APICBASE_ENABLE) &&\n+        !(s->apicbase & MSR_IA32_APICBASE_EXTD) &&\n+        (val & MSR_IA32_APICBASE_ENABLE) &&\n+        (val & MSR_IA32_APICBASE_EXTD)) {\n+        return -1;\n+    }\n+\n+    /* Invalid transition from x2APIC to xAPIC */\n+    if ((s->apicbase & MSR_IA32_APICBASE_ENABLE) &&\n+        (s->apicbase & MSR_IA32_APICBASE_EXTD) &&\n+        (val & MSR_IA32_APICBASE_ENABLE) &&\n+        !(val & MSR_IA32_APICBASE_EXTD)) {\n+        return -1;\n+    }\n+\n+    return 0;\n+}\n+\n+static int apic_set_base(APICCommonState *s, uint64_t val)\n+{\n+    if (apic_set_base_check(s, val) < 0) {\n+        return -1;\n+    }\n+\n+    s->apicbase = (val & MSR_IA32_APICBASE_BASE) |\n+        (s->apicbase & (MSR_IA32_APICBASE_BSP | MSR_IA32_APICBASE_ENABLE));\n+    if (!(val & MSR_IA32_APICBASE_ENABLE)) {\n+        s->apicbase &= ~MSR_IA32_APICBASE_ENABLE;\n+        cpu_clear_apic_feature(&s->cpu->env);\n+    }\n+\n+    /* Transition from disabled mode to xAPIC */\n+    if (!(s->apicbase & MSR_IA32_APICBASE_ENABLE) &&\n+        (val & MSR_IA32_APICBASE_ENABLE)) {\n+        s->apicbase |= MSR_IA32_APICBASE_ENABLE;\n+        cpu_set_apic_feature(&s->cpu->env);\n+    }\n+\n+    /* Transition from xAPIC to x2APIC */\n+    if (cpu_has_x2apic_feature(&s->cpu->env) &&\n+        !(s->apicbase & MSR_IA32_APICBASE_EXTD) &&\n+        (val & MSR_IA32_APICBASE_EXTD)) {\n+        s->apicbase |= MSR_IA32_APICBASE_EXTD;\n+    }\n+\n     return 0;\n }\n \n@@ -235,6 +296,10 @@ static void whpx_apic_mem_write(void *opaque, hwaddr addr,\n static const MemoryRegionOps whpx_apic_io_ops = {\n     .read = whpx_apic_mem_read,\n     .write = whpx_apic_mem_write,\n+    .impl.min_access_size = 1,\n+    .impl.max_access_size = 4,\n+    .valid.min_access_size = 1,\n+    .valid.max_access_size = 4,\n     .endianness = DEVICE_LITTLE_ENDIAN,\n };\n \n@@ -262,7 +327,7 @@ static void whpx_apic_class_init(ObjectClass *klass, const void *data)\n \n     k->realize = whpx_apic_realize;\n     k->reset = whpx_apic_reset;\n-    k->set_base = whpx_apic_set_base;\n+    k->set_base = apic_set_base;\n     k->set_tpr = whpx_apic_set_tpr;\n     k->get_tpr = whpx_apic_get_tpr;\n     k->post_load = whpx_apic_post_load;\n","prefixes":["PULL","37/58"]}