Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp3865817pxk; Tue, 22 Sep 2020 04:52:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy6SrI2ueUG/OftcH3R/AxSD6spl14qdJDgJh2QPVZdFuSOlBVWEJrYTCFHhgAIo1kefiIF X-Received: by 2002:a17:906:4a07:: with SMTP id w7mr4464420eju.366.1600775541134; Tue, 22 Sep 2020 04:52:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1600775541; cv=none; d=google.com; s=arc-20160816; b=u7YIVmnqHdUaZdwENSo2NZ6ZWX+nglRhs7EUT3cA9jORLKmTP7XZkOAYXAlWMBc5YZ +DQJ1L7klU+BOVFBOxe/pT6JN50VS2A+LJ4Y/tvgoGmCGzgJOnyN09Tdmmro0X9sohWR FSGJnkeEcEB+Gjk+DUT5jAqf3gNUQ8IbjDiWoaY3UdGCNmRHYgov0dqd7vmd2q5Q2VTf Lla35zLXKhTrHk0TlLVdVhPbMe4yREUWW3L+foI4MzP6gQ77Fuo1nFoGeRGC63Gsma1F nR6XTCPPV4LEQYua0QIG2foojW3WeuP611fgE0eUglTklMemSM6+yI4pmRkxTE+Z1joc qZhg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=W64i1qkZfzPKjtm9qLSeR6tyKPIYAGkxyjXevWJnfKA=; b=SgbXM1V0aUOBcuML3khjYNTaf2eMb3zXGMcYWDoGXC2D1w7wWTyGFvFQ32pu+TXEwz 4HpU1HQURnwhkAewE+gzlVsC/U5qv/eR6dfhVYQ6dGScqx3ri3nL5VbNIdFsw2Vyxu+q N2wGSs5MBmAaRFxgxNjk1vtdzmwn4MchQa4noo5BDV53TqjEiA4E2W4WtqSnsl8Ia86e aIHIKeDuN1SKtgY1mJYQZfNvZataAV4hgR4fK3R05s4FYARPrl5rlAIDSzFM8TRfQocG 9bED8cZw90xyzu2NMbU+V7hiPAkOhrE2aaNGVO3NfH1XFq1MhPpAcf6wPw98WqioH25R LCFA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id wn19si10240719ejb.625.2020.09.22.04.51.58; Tue, 22 Sep 2020 04:52:21 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726853AbgIVLsV (ORCPT + 99 others); Tue, 22 Sep 2020 07:48:21 -0400 Received: from mga17.intel.com ([192.55.52.151]:53406 "EHLO mga17.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726583AbgIVLnr (ORCPT ); Tue, 22 Sep 2020 07:43:47 -0400 IronPort-SDR: 0h1oZ85tBZ1IMrUyNdEy7UiTGWninkoITZWzphoCEg1K8E8Rza70K7Tljh7twTfsmROVtPtUdm WG53frzVB+4Q== X-IronPort-AV: E=McAfee;i="6000,8403,9751"; a="140590893" X-IronPort-AV: E=Sophos;i="5.77,290,1596524400"; d="scan'208";a="140590893" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Sep 2020 04:43:46 -0700 IronPort-SDR: lWhewy3yTdKOhlkicmwpOkiQ98oy6r8xsS8+82/Y9shNMC4mTsa/bhq+NqFVsd4dIHj/B5h7XN XS1Dv2sfF73A== X-IronPort-AV: E=Sophos;i="5.77,290,1596524400"; d="scan'208";a="334973272" Received: from shsi6026.sh.intel.com (HELO localhost) ([10.239.147.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Sep 2020 04:43:43 -0700 From: shuo.a.liu@intel.com To: linux-kernel@vger.kernel.org, x86@kernel.org Cc: Greg Kroah-Hartman , "H . Peter Anvin" , Thomas Gleixner , Ingo Molnar , Borislav Petkov , Sean Christopherson , Yu Wang , Reinette Chatre , Yin Fengwei , Shuo Liu , Dave Hansen , Dan Williams , Zhi Wang , Zhenyu Wang Subject: [PATCH v4 03/17] x86/acrn: Introduce an API to check if a VM is privileged Date: Tue, 22 Sep 2020 19:42:57 +0800 Message-Id: <20200922114311.38804-4-shuo.a.liu@intel.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20200922114311.38804-1-shuo.a.liu@intel.com> References: <20200922114311.38804-1-shuo.a.liu@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yin Fengwei ACRN Hypervisor reports hypervisor features via CPUID leaf 0x40000001 which is similar to KVM. A VM can check if it's the privileged VM using the feature bits. The Service VM is the only privileged VM by design. Signed-off-by: Yin Fengwei Signed-off-by: Shuo Liu Reviewed-by: Reinette Chatre Cc: Dave Hansen Cc: Sean Christopherson Cc: Dan Williams Cc: Fengwei Yin Cc: Zhi Wang Cc: Zhenyu Wang Cc: Yu Wang Cc: Reinette Chatre Cc: Greg Kroah-Hartman --- arch/x86/include/asm/acrn.h | 9 +++++++++ arch/x86/kernel/cpu/acrn.c | 19 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/arch/x86/include/asm/acrn.h b/arch/x86/include/asm/acrn.h index ff259b69cde7..a2d4aea3a80d 100644 --- a/arch/x86/include/asm/acrn.h +++ b/arch/x86/include/asm/acrn.h @@ -2,7 +2,16 @@ #ifndef _ASM_X86_ACRN_H #define _ASM_X86_ACRN_H +/* + * This CPUID returns feature bitmaps in EAX. + * Guest VM uses this to detect the appropriate feature bit. + */ +#define ACRN_CPUID_FEATURES 0x40000001 +/* Bit 0 indicates whether guest VM is privileged */ +#define ACRN_FEATURE_PRIVILEGED_VM BIT(0) + void acrn_setup_intr_handler(void (*handler)(void)); void acrn_remove_intr_handler(void); +bool acrn_is_privileged_vm(void); #endif /* _ASM_X86_ACRN_H */ diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c index 42e88d01ccf9..b04fef8bd50b 100644 --- a/arch/x86/kernel/cpu/acrn.c +++ b/arch/x86/kernel/cpu/acrn.c @@ -21,9 +21,26 @@ #include #include +static u32 acrn_cpuid_base(void) +{ + static u32 acrn_cpuid_base; + + if (!acrn_cpuid_base && boot_cpu_has(X86_FEATURE_HYPERVISOR)) + acrn_cpuid_base = hypervisor_cpuid_base("ACRNACRNACRN", 0); + + return acrn_cpuid_base; +} + +bool acrn_is_privileged_vm(void) +{ + return cpuid_eax(acrn_cpuid_base() | ACRN_CPUID_FEATURES) & + ACRN_FEATURE_PRIVILEGED_VM; +} +EXPORT_SYMBOL_GPL(acrn_is_privileged_vm); + static u32 __init acrn_detect(void) { - return hypervisor_cpuid_base("ACRNACRNACRN", 0); + return acrn_cpuid_base(); } static void __init acrn_init_platform(void) -- 2.28.0