Received: by 2002:a25:ab43:0:0:0:0:0 with SMTP id u61csp5890990ybi; Tue, 28 May 2019 22:41:09 -0700 (PDT) X-Google-Smtp-Source: APXvYqxxRvncqlYvW38LZjRLmQ7DfH9fod2sHf0F1yKmgBUhEqC4m7Ytbmq7Xy5LXpJcP/AEzJQ+ X-Received: by 2002:a17:902:2924:: with SMTP id g33mr113480127plb.57.1559108469762; Tue, 28 May 2019 22:41:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1559108469; cv=none; d=google.com; s=arc-20160816; b=O/onbaYugr4i0Br3Ffhsr5WFC8ehhihJFQSif4+RRTKpX22mTfDIrCiyfV7IlXcTZs too7RbpC7sWYysQIjvDQ4Ct6mBEaN5clFLjfSQBus6ZOJB9v4jWOdHEgdofiA9JRSS3y xaeT2MqTInNJtHPMv9MppfP3CWK3lE/kanMNrKuPoCz+TsdQrkz5xzw4OBmy84F459Sp pf9Ga+aateBN7NevPKO2M96yQV0xEjYK/qgnOroczcbgF2a1cbmswTxl+6S7wvDQJ2v5 pFyGstavfWpu+HjnJ884/DVxuIg+5CCGjyd/ukzirVx7tZ2x4wg+WGbbL69Qm94GQdnr +plA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=v0iScxUlrHFkPlFet62+uXMQeAVDyyhCnjfwWfV1c/0=; b=G7wCk6kKRnUsGUUjM9daAFE1nRFzdWz+Gq4fwxQN3b6VK1FrKrGEJ5PiSq0lVyjFV1 pGsIGHfNSPM70ScgU+nBc8hCVGXB3PPsY+ip/YDyxb1cb7YWFjZeCE81vrgnkp4x0B1b qDr+9Bt/c3QsUqe3kQnnQT/Jd6IbaT+H1+q/jdpW5IheEmnj9NgPGwFzsWkrsbh5PSm1 jMIcRr+LFmrNKVwNRDYXeUb9goPk910jLMp2olrGKv7aVOVRpToD8PzXyrsWWOg6o+6x rP5KO4c1N0X+K4ozH6593YE3h4wmmLzYtLwzBnOP3ctDoUP3lttAF0ra4AKj1opD/qCJ oViw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id h19si24659082pgg.125.2019.05.28.22.40.52; Tue, 28 May 2019 22:41:09 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S1726121AbfE2FiG (ORCPT + 99 others); Wed, 29 May 2019 01:38:06 -0400 Received: from mga06.intel.com ([134.134.136.31]:52068 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726054AbfE2FiA (ORCPT ); Wed, 29 May 2019 01:38:00 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 May 2019 22:37:59 -0700 X-ExtLoop1: 1 Received: from genxtest-ykzhao.sh.intel.com ([10.239.143.71]) by fmsmga007.fm.intel.com with ESMTP; 28 May 2019 22:37:58 -0700 From: Zhao Yakui To: x86@kernel.org, linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, bp@alien8.de, Zhao Yakui , Jason Chen CJ Subject: [PATCH v7 3/3] x86/acrn: Use HYPERVISOR_CALLBACK_VECTOR for ACRN guest upcall vector Date: Wed, 29 May 2019 13:33:57 +0800 Message-Id: <1559108037-18813-4-git-send-email-yakui.zhao@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1559108037-18813-1-git-send-email-yakui.zhao@intel.com> References: <1559108037-18813-1-git-send-email-yakui.zhao@intel.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Linux kernel uses the HYPERVISOR_CALLBACK_VECTOR for hypervisor upcall vector. It is already used for Xen and HyperV. After the ACRN hypervisor is detected, it will also use this defined vector to notify the ACRN guest. Co-developed-by: Jason Chen CJ Signed-off-by: Jason Chen CJ Signed-off-by: Zhao Yakui Reviewed-by: Thomas Gleixner --- V1->V2: Remove the unused API definition of acrn_setup_intr_handler and acrn_remove_intr_handler. Adjust the order of header file Add the declaration of acrn_hv_vector_handler and tracing definition of acrn_hv_callback_vector. v2->v3: No change v3->v4: Refine the file name of acrnhyper.h to acrn.h v5->v6: Add the "extern" for the function declarations in header file Add some comments for calling entering_ack_irq Some other minor changes(unnecessary spliting two lines. and minor change in commit log) v6->v7: Include the header file of asm/apic.h to fix the buidling error when enabling cflags="-Werror=implict-function-declaration". --- arch/x86/Kconfig | 1 + arch/x86/entry/entry_64.S | 5 +++++ arch/x86/include/asm/acrn.h | 11 +++++++++++ arch/x86/kernel/cpu/acrn.c | 30 ++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 arch/x86/include/asm/acrn.h diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 3020bc7..170d5cf 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig @@ -838,6 +838,7 @@ config JAILHOUSE_GUEST config ACRN_GUEST bool "ACRN Guest support" depends on X86_64 + select X86_HV_CALLBACK_VECTOR help This option allows to run Linux as guest in ACRN hypervisor. Enabling this will allow the kernel to boot in virtualized environment under diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S index 11aa3b2..2fe6289 100644 --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S @@ -1142,6 +1142,11 @@ apicinterrupt3 HYPERV_STIMER0_VECTOR \ hv_stimer0_callback_vector hv_stimer0_vector_handler #endif /* CONFIG_HYPERV */ +#if IS_ENABLED(CONFIG_ACRN_GUEST) +apicinterrupt3 HYPERVISOR_CALLBACK_VECTOR \ + acrn_hv_callback_vector acrn_hv_vector_handler +#endif + idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=IST_INDEX_DB ist_offset=DB_STACK_OFFSET idtentry int3 do_int3 has_error_code=0 create_gap=1 idtentry stack_segment do_stack_segment has_error_code=1 diff --git a/arch/x86/include/asm/acrn.h b/arch/x86/include/asm/acrn.h new file mode 100644 index 0000000..4adb13f --- /dev/null +++ b/arch/x86/include/asm/acrn.h @@ -0,0 +1,11 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_X86_ACRN_H +#define _ASM_X86_ACRN_H + +extern void acrn_hv_callback_vector(void); +#ifdef CONFIG_TRACING +#define trace_acrn_hv_callback_vector acrn_hv_callback_vector +#endif + +extern void acrn_hv_vector_handler(struct pt_regs *regs); +#endif /* _ASM_X86_ACRN_H */ diff --git a/arch/x86/kernel/cpu/acrn.c b/arch/x86/kernel/cpu/acrn.c index f556640..a110c8b 100644 --- a/arch/x86/kernel/cpu/acrn.c +++ b/arch/x86/kernel/cpu/acrn.c @@ -9,7 +9,12 @@ * */ +#include +#include +#include +#include #include +#include static uint32_t __init acrn_detect(void) { @@ -18,6 +23,8 @@ static uint32_t __init acrn_detect(void) static void __init acrn_init_platform(void) { + /* Setup the IDT for ACRN hypervisor callback */ + alloc_intr_gate(HYPERVISOR_CALLBACK_VECTOR, acrn_hv_callback_vector); } static bool acrn_x2apic_available(void) @@ -30,6 +37,29 @@ static bool acrn_x2apic_available(void) return false; } +static void (*acrn_intr_handler)(void); + +__visible void __irq_entry acrn_hv_vector_handler(struct pt_regs *regs) +{ + struct pt_regs *old_regs = set_irq_regs(regs); + + /* + * The hypervisor requires that the APIC EOI should be acked. + * If the APIC EOI is not acked, the APIC ISR bit for the + * HYPERVISOR_CALLBACK_VECTOR will not be cleared and then it + * will block the interrupt whose vector is lower than + * HYPERVISOR_CALLBACK_VECTOR. + */ + entering_ack_irq(); + inc_irq_stat(irq_hv_callback_count); + + if (acrn_intr_handler) + acrn_intr_handler(); + + exiting_irq(); + set_irq_regs(old_regs); +} + const __initconst struct hypervisor_x86 x86_hyper_acrn = { .name = "ACRN", .detect = acrn_detect, -- 2.7.4