From patchwork Wed Aug 31 12:50:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 12960679 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A606FECAAD1 for ; Wed, 31 Aug 2022 12:51:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229692AbiHaMvN (ORCPT ); Wed, 31 Aug 2022 08:51:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58884 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231483AbiHaMvG (ORCPT ); Wed, 31 Aug 2022 08:51:06 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7E06C2D1D2 for ; Wed, 31 Aug 2022 05:51:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1661950264; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CE4fA7BUGFAjvQkmvSK15esjX/ggaaSavOfVyHFuI1A=; b=bJvBMhzXbc5d9uKZB4szkuyex404e4N4BX03MX1YK0uU/GHuLVBw+KzFteDx4HXuJ/QPXB h5tqAiXPqXVUN9aS7nil4ZA767qyVLAtbv53XN7v4t1AsYVFJDxkNcVeJlb8JcJW1VajX+ M5bZVXHR/01TU5m4lFs6gm+XhJjZT6U= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-494-EiYwpVoVO_SVC0RJADLPsg-1; Wed, 31 Aug 2022 08:51:01 -0400 X-MC-Unique: EiYwpVoVO_SVC0RJADLPsg-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id AD5623825787; Wed, 31 Aug 2022 12:51:00 +0000 (UTC) Received: from sirius.home.kraxel.org (unknown [10.39.195.70]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6C8B44010D43; Wed, 31 Aug 2022 12:51:00 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 2F7D11800623; Wed, 31 Aug 2022 14:50:59 +0200 (CEST) From: Gerd Hoffmann To: qemu-devel@nongnu.org Cc: kvm@vger.kernel.org, Marcelo Tosatti , Marcel Apfelbaum , Eduardo Habkost , Paolo Bonzini , Richard Henderson , "Michael S. Tsirkin" , Sergio Lopez , Gerd Hoffmann Subject: [PATCH 1/2] [hack] reserve bit KVM_HINTS_HOST_PHYS_BITS Date: Wed, 31 Aug 2022 14:50:58 +0200 Message-Id: <20220831125059.170032-2-kraxel@redhat.com> In-Reply-To: <20220831125059.170032-1-kraxel@redhat.com> References: <20220831125059.170032-1-kraxel@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.84 on 10.11.54.2 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org The KVM_HINTS_HOST_PHYS_BITS bit indicates that qemu has host-phys-bits turned on. This implies the guest can actually work with the full available physical address space as advertised by CPUID(0x80000008). Temporary hack for RfC patch and testing. This change must actually be done in the linux kernel, then picked up by qemu via header file sync. Signed-off-by: Gerd Hoffmann --- include/standard-headers/asm-x86/kvm_para.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/standard-headers/asm-x86/kvm_para.h b/include/standard-headers/asm-x86/kvm_para.h index f0235e58a1d3..105b958c0f56 100644 --- a/include/standard-headers/asm-x86/kvm_para.h +++ b/include/standard-headers/asm-x86/kvm_para.h @@ -37,7 +37,8 @@ #define KVM_FEATURE_HC_MAP_GPA_RANGE 16 #define KVM_FEATURE_MIGRATION_CONTROL 17 -#define KVM_HINTS_REALTIME 0 +#define KVM_HINTS_REALTIME 0 +#define KVM_HINTS_HOST_PHYS_BITS 1 /* The last 8 bits are used to indicate how to interpret the flags field * in pvclock structure. If no bits are set, all flags are ignored. From patchwork Wed Aug 31 12:50:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 12960680 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id DC2F9ECAAD4 for ; Wed, 31 Aug 2022 12:51:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231419AbiHaMvO (ORCPT ); Wed, 31 Aug 2022 08:51:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54150 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231288AbiHaMvK (ORCPT ); Wed, 31 Aug 2022 08:51:10 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 91F1448EAC for ; Wed, 31 Aug 2022 05:51:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1661950268; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=PovtqEj9ucJq7HeueC0Jo2+ySASsIapiJpX248QDdWM=; b=G4kNWfD1hl76FGMJawKAAyKwTuln6H45hdMSC/NW/QEiJeF65jVSDl7sNPY9asoac8B0hF 5MuPd1ZvEyONh0SMQXTpt1rqfivCd1V3gfk/WvgFGx+QGAT2CkxR3wppbjlkvl6WRYqEuu TEknd0FNXOBKwq5yb2VblIHbKJzcEiQ= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-554-LHG0hWPEMhaeuh3nOodjCg-1; Wed, 31 Aug 2022 08:51:03 -0400 X-MC-Unique: LHG0hWPEMhaeuh3nOodjCg-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 3160F85A58B; Wed, 31 Aug 2022 12:51:03 +0000 (UTC) Received: from sirius.home.kraxel.org (unknown [10.39.195.70]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D5F09C15BB3; Wed, 31 Aug 2022 12:51:01 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 4D6931800795; Wed, 31 Aug 2022 14:50:59 +0200 (CEST) From: Gerd Hoffmann To: qemu-devel@nongnu.org Cc: kvm@vger.kernel.org, Marcelo Tosatti , Marcel Apfelbaum , Eduardo Habkost , Paolo Bonzini , Richard Henderson , "Michael S. Tsirkin" , Sergio Lopez , Gerd Hoffmann Subject: [PATCH 2/2] [RfC] expose host-phys-bits to guest Date: Wed, 31 Aug 2022 14:50:59 +0200 Message-Id: <20220831125059.170032-3-kraxel@redhat.com> In-Reply-To: <20220831125059.170032-1-kraxel@redhat.com> References: <20220831125059.170032-1-kraxel@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.85 on 10.11.54.8 Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Move "host-phys-bits" property from cpu->host_phys_bits to cpu->env.features[FEAT_KVM_HINTS] (KVM_HINTS_HOST_PHYS_BITS). This has the effect that the guest can see whenever host-phys-bits is turned on or not and act accordingly. Current mode of operation for firmware is to be conservative with address space usage because is impossible to figure how much is actually available. This patch allows the firmware to use the full physical address space available (with host-phys-bits=on). Signed-off-by: Gerd Hoffmann --- target/i386/cpu.h | 3 --- hw/i386/microvm.c | 6 +++++- target/i386/cpu.c | 3 +-- target/i386/host-cpu.c | 4 +++- target/i386/kvm/kvm.c | 1 + 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/target/i386/cpu.h b/target/i386/cpu.h index 82004b65b944..b9c6d3d9cac6 100644 --- a/target/i386/cpu.h +++ b/target/i386/cpu.h @@ -1898,9 +1898,6 @@ struct ArchCPU { /* if true fill the top bits of the MTRR_PHYSMASKn variable range */ bool fill_mtrr_mask; - /* if true override the phys_bits value with a value read from the host */ - bool host_phys_bits; - /* if set, limit maximum value for phys_bits when host_phys_bits is true */ uint8_t host_phys_bits_limit; diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c index 7fe8cce03e92..edb1d4cbcbc1 100644 --- a/hw/i386/microvm.c +++ b/hw/i386/microvm.c @@ -54,6 +54,8 @@ #include "kvm/kvm_i386.h" #include "hw/xen/start_info.h" +#include "standard-headers/asm-x86/kvm_para.h" + #define MICROVM_QBOOT_FILENAME "qboot.rom" #define MICROVM_BIOS_FILENAME "bios-microvm.bin" @@ -424,7 +426,9 @@ static void microvm_device_pre_plug_cb(HotplugHandler *hotplug_dev, { X86CPU *cpu = X86_CPU(dev); - cpu->host_phys_bits = true; /* need reliable phys-bits */ + /* need reliable phys-bits */ + cpu->env.features[FEAT_KVM_HINTS] |= (1 << KVM_HINTS_HOST_PHYS_BITS); + x86_cpu_pre_plug(hotplug_dev, dev, errp); } diff --git a/target/i386/cpu.c b/target/i386/cpu.c index 1db1278a599b..d60f4498a3c3 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -778,7 +778,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = { [FEAT_KVM_HINTS] = { .type = CPUID_FEATURE_WORD, .feat_names = { - "kvm-hint-dedicated", NULL, NULL, NULL, + "kvm-hint-dedicated", "host-phys-bits", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -7016,7 +7016,6 @@ static Property x86_cpu_properties[] = { DEFINE_PROP_BOOL("x-force-features", X86CPU, force_features, false), DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true), DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0), - DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false), DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0), DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true), DEFINE_PROP_UINT32("level-func7", X86CPU, env.cpuid_level_func7, diff --git a/target/i386/host-cpu.c b/target/i386/host-cpu.c index 10f8aba86e53..30e9dd9f66f1 100644 --- a/target/i386/host-cpu.c +++ b/target/i386/host-cpu.c @@ -13,6 +13,8 @@ #include "qapi/error.h" #include "sysemu/sysemu.h" +#include "standard-headers/asm-x86/kvm_para.h" + /* Note: Only safe for use on x86(-64) hosts */ static uint32_t host_cpu_phys_bits(void) { @@ -68,7 +70,7 @@ static uint32_t host_cpu_adjust_phys_bits(X86CPU *cpu) warned = true; } - if (cpu->host_phys_bits) { + if (cpu->env.features[FEAT_KVM_HINTS] & (1 << KVM_HINTS_HOST_PHYS_BITS)) { /* The user asked for us to use the host physical bits */ phys_bits = host_phys_bits; if (cpu->host_phys_bits_limit && diff --git a/target/i386/kvm/kvm.c b/target/i386/kvm/kvm.c index f148a6d52fa4..182a70c98d35 100644 --- a/target/i386/kvm/kvm.c +++ b/target/i386/kvm/kvm.c @@ -459,6 +459,7 @@ uint32_t kvm_arch_get_supported_cpuid(KVMState *s, uint32_t function, } } else if (function == KVM_CPUID_FEATURES && reg == R_EDX) { ret |= 1U << KVM_HINTS_REALTIME; + ret |= 1U << KVM_HINTS_HOST_PHYS_BITS; } return ret;