From patchwork Fri Feb 12 13:59:26 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Suthikulpanit, Suravee" X-Patchwork-Id: 61844 Delivered-To: patch@linaro.org Received: by 10.112.43.199 with SMTP id y7csp839882lbl; Fri, 12 Feb 2016 06:00:35 -0800 (PST) X-Received: by 10.98.43.194 with SMTP id r185mr2375226pfr.24.1455285635111; Fri, 12 Feb 2016 06:00:35 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c74si20248545pfj.65.2016.02.12.06.00.34; Fri, 12 Feb 2016 06:00:35 -0800 (PST) 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752843AbcBLOA3 (ORCPT + 30 others); Fri, 12 Feb 2016 09:00:29 -0500 Received: from mail-bn1bon0099.outbound.protection.outlook.com ([157.56.111.99]:10624 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752490AbcBLOAZ (ORCPT ); Fri, 12 Feb 2016 09:00:25 -0500 Authentication-Results: 8bytes.org; dkim=none (message not signed) header.d=none; 8bytes.org; dmarc=none action=none header.from=amd.com; Received: from localhost.localdomain (124.121.8.20) by BY1PR12MB0440.namprd12.prod.outlook.com (10.162.147.141) with Microsoft SMTP Server (TLS) id 15.1.403.16; Fri, 12 Feb 2016 14:00:13 +0000 From: Suravee Suthikulpanit To: , , , CC: , , , , Suravee Suthikulpanit , Suravee Suthikulpanit Subject: [PART1 RFC 1/9] KVM: x86: Misc LAPIC changes to exposes helper functions Date: Fri, 12 Feb 2016 20:59:26 +0700 Message-ID: <1455285574-27892-2-git-send-email-suravee.suthikulpanit@amd.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1455285574-27892-1-git-send-email-suravee.suthikulpanit@amd.com> References: <1455285574-27892-1-git-send-email-suravee.suthikulpanit@amd.com> MIME-Version: 1.0 X-Originating-IP: [124.121.8.20] X-ClientProxiedBy: SG2PR03CA0036.apcprd03.prod.outlook.com (25.160.233.46) To BY1PR12MB0440.namprd12.prod.outlook.com (25.162.147.141) X-MS-Office365-Filtering-Correlation-Id: e9d3842e-9ca7-47f1-1abb-08d333b4d98d X-Microsoft-Exchange-Diagnostics: 1; BY1PR12MB0440; 2:kkElVEEydIrPuZNRuBiIVOG/fOS957hvA4QVtPZ7Er3D2jZWybdHm1i2AW4efYUtnBrjheG/I3EBjMnGY/FJQnOmKix2iv+Ofa0hsf40Cj1s9BsH1gxAfe7sZZMAC4F+QTGf40Z77beKa9f3fDf34NiP6MBxcUbOCNa184gt0fDVwzA6/LiB40wizU+QW+jd; 3:0WbaUl5rlrnBxHtKHZWJDZ9yUoK+Er50y6d8WJC0+WhiDdqRqFB+1cFKvIy8vVpdGlGgTToNy9tcDFRmDsIrmqc8ZnNvoVARG2oo/10QaeM+TZhLdWcRO7kavHue2raz; 25:tV1t5SAdv6qzvoNI9z714GHE5e1o/nTjgyvPaFd8Cm1/f4IuEbe1wRtH+2JGXgqtkpqUasDfBGbo6ca8YlvK0SQW09s/1ZD3P16PwByfuwsuzyD7BpEsgw3gDn+rEqjDfLAbi2pCVlDNnSMirJ+8e8slPVHzX99segnCPKDV9gqMW3f20PqCXwEdRyjC0ol3wCwMnQXWqMffsXdzrOB58XgLSeabvYIgITCFV49aoyUGGTTAGHI/C5BsXKmX+Fj0ljm86c3V5P0WjLlKpFo3PMEUUi7DWoeZomAWRGTLafpUWud0TkJ/G/HEndA/KNUr X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR12MB0440; X-Microsoft-Exchange-Diagnostics: 1; BY1PR12MB0440; 20:3pkt9K62nNSltlpygWtfdlMBcoGtNi0HDJIWeLYhyhmg9xI1o+qpLyUuFwMlOMlEvFko4ejJqJwry7bi6yUiKTM88Kns327qA/EeJw84POldpchEsOF2irV//D0V6wPaA/dI8c5jTdLsUdzRpswJ60CjxensrfO/sBmGsnZiohR5PTPCFvo3P0nkNxrlnZgh1xef+Zig6Epsi2kKNhKiBu6ZDnEBWNpQM2/1DPtBUsbk0AFibjw8Z9hh1adby4mukbRZf36zSpWrnIKPRm9XIMAeg9xvIXcsnzvA9TqhQpsU8wa8w7tgP9dVcHJuL9IVKVzj8gX+aWnoBXmCoAiigDFadMGBaXX5CclQ46Pp9nabhzqm6LGxrGrs+JAKvprIjBNCNP7CAmB4M/3RjU4ytRkM4EyIWFXO3CrcVQQEH/TPxC4R2XywaPV9hvlbeFbSdtOFsaqd/12Psr7h6aOe0zgtfwSTZKZzjfR7C+lEq2pvRWijXCnQHnEayNN7eWJy; 4:EZl/I9RsMmT7ewa8YqlL++ArLrfv9YozEa9bIzZGWpDaXx6D+bcVq7X1vITNUorjhJ46ZypnpEwwDwcDacZKBJJjUYlxoav+MdAPVL3TibdpFHM8FwOdFlzu4fFWBpICHujEvwK6bg4JH7zm5rWgVZstS5y3E0x0+Dss7lAuQ7s9Py2k0d+Cm2Ob9MSsYSOsQo1p1AdPnBtmz8B5suXzntRrpNXPZcMxFJVUoJnqpXnkuBCSfEFoAv1m3Ki5amXK37c7E80r6D5Ig1qK6e0E7dBzPTFhCkHX40OhF0Gd0dlEvyfnge2So/nuU6NsTo4uX71e0o4NokCyie92H9gjPwK81B9gZyb7Xzzw43RqHz42OhBBoo0Jel5yNYqEUgOaCtSz/JuBg9Sg4PPNXJ7zNg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(767451399110); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046); SRVR:BY1PR12MB0440; BCL:0; PCL:0; RULEID:; SRVR:BY1PR12MB0440; X-Forefront-PRVS: 0850800A29 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6009001)(6069001)(2201001)(36756003)(48376002)(586003)(40100003)(92566002)(3846002)(5003940100001)(77096005)(229853001)(2950100001)(19580395003)(19580405001)(6116002)(5004730100002)(189998001)(4326007)(42186005)(66066001)(50226001)(87976001)(5008740100001)(5001770100001)(122386002)(33646002)(50466002)(76176999)(50986999)(86362001)(5001960100002)(47776003)(1096002)(2906002); DIR:OUT; SFP:1101; SCL:1; SRVR:BY1PR12MB0440; H:localhost.localdomain; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY1PR12MB0440; 23:oOhthxAzgmbhoW9CVFp7HcLULr46fyPsE3r/QvPaG?= =?us-ascii?Q?GoLjfmDDUfjntv5TCHpN01XJnJjjbAmtwzQ0bTw/CLADmfQZDzOn01ve68cl?= =?us-ascii?Q?Uh4tJEBCrJeO/43jk06EDzWEYuEuMrPUvHPQTDgtlFOURuOWjGrFiTcOY4BM?= =?us-ascii?Q?je2Ut+3Y7p4CRflLRM0mF8yooL+ZLG0lXhajphjti5Af9q4Tl28tXyb2hyeP?= =?us-ascii?Q?pjyrBD5kVkUFJBKlr7uT6dlu4EZfj5t2ac0ZOLzMfdv3qeD7XLOvZo+Su7ds?= =?us-ascii?Q?04cpVxJDuVnjvVh7rHs79DcCI9kTFBJKPeV/1oEMO7l78WQeD3oLizhk/X/G?= =?us-ascii?Q?uVhYIMFqwyuMVEoDyfECdt0ughbV2psyA/mtzv/ZmOGjU5vPuk8eqCDc68Zx?= =?us-ascii?Q?k2wPAsrNQN5ljJsNhtHtHtZoL3emfSZjpQayEt4rCii1ofhdwy70zei3RriB?= =?us-ascii?Q?DbR0OqQnFVTMJSJ24PFVQ7/Vf5NZM0QxOFPlcSoV7BbjFo0N1bR0mN1Zm6XM?= =?us-ascii?Q?DjQqW09O2vei/3zjn2udVKO9kquTJye9Cc/rBahgUTxZEVtEfyzPgycGgl7z?= =?us-ascii?Q?BAwhYZ9jLXOzqJKA8lIM88plNf2Expcw7SMEuyCRV86boGtrR30kK3fxjy7F?= =?us-ascii?Q?zoIXnqkS1xF8sjx1qGqT9By7wU71Q7/Mq8cr+INMDA0J6+8Ta8+qWh1ThUmz?= =?us-ascii?Q?JrzxpBGygc68mqQkdN0+Wu0koAhGv9dzFsKfiTYnq50t85qYAlZbog94lzT1?= =?us-ascii?Q?K+DlCzawS9q36OlvbvMKJPv9rammJbim5LcxJfjG0te1vQcfzTmgPkRVnK06?= =?us-ascii?Q?p0FbV4sPQbGR16irRvvdZHGZo9CtukJ4hKJBDYfeHQujdUNwEbC5J2obDYne?= =?us-ascii?Q?628+X4VjRYCqQWmUOLw1sTfB61OcmKmD9fV3Dlmi1uwCGhGExo9CGbFYp75n?= =?us-ascii?Q?72eF36f3hqG+PXT8QKft0UomjiCGbCiz6tUI0Dcdw=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY1PR12MB0440; 5:jci5dGpgyZiFf02VX1NAP83OyqsctKmKQ2BpSCxm8QvH2zv/9wKgJBqIwWeTPA8Gz8XsY2fE++AJMzhxlj9oF6W/+rK/LdKy5X2Ks/wMPLIA859ePJQuzlk9t1cU0ZUVhh/e9e3P4Pj5zZObAqEwkg==; 24:ki1a0oDKIt4o1pROkZ/jx072Ud8yZI4nfEYu6cl7RDJE/uCKEFTUz2qlrTyBKT9o+r1qruY27bnxADEEg4Qg1Lp+4+OHn4upYjJu+Q1KZzc=; 20:zEooENTGQphtpK2MrumZkttY4winn+mW5nX2+jUzxPYrEOC9x0KMNl8IwfI+sIEci70KOC/2vDcmwYvomBS1VQ63fLxcuwSnjruNBCMmxzAVlUEzIIIkLBTMBu7lybI9PBB0kuDX2cUTUAz5Qe+geuHUCy0U2LcLIkc4RuGmLeLD5nx3DfiPcIe2MtasYhruV+Ld1aHmJWiXCPYK7vzuFyAaSPXXfgPe7zK6+4N1tbXj5Tl4UThwRBu5HdDfehEB X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 12 Feb 2016 14:00:13.9370 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR12MB0440 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Exporting LAPIC utility functions and macros to reuse. Signed-off-by: Suravee Suthikulpanit --- arch/x86/kvm/lapic.c | 50 ++++++++++++++++++++++++++------------------------ arch/x86/kvm/lapic.h | 5 +++++ 2 files changed, 31 insertions(+), 24 deletions(-) -- 1.9.1 diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 36591fa..fc313a0 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -59,9 +59,8 @@ /* #define apic_debug(fmt,arg...) printk(KERN_WARNING fmt,##arg) */ #define apic_debug(fmt, arg...) -#define APIC_LVT_NUM 6 /* 14 is the version for Xeon and Pentium 8.4.8*/ -#define APIC_VERSION (0x14UL | ((APIC_LVT_NUM - 1) << 16)) +#define APIC_VERSION (0x14UL | ((KVM_APIC_LVT_NUM - 1) << 16)) #define LAPIC_MMIO_LENGTH (1 << 12) /* followed define is not in apicdef.h */ #define APIC_SHORT_MASK 0xc0000 @@ -94,10 +93,11 @@ bool kvm_apic_pending_eoi(struct kvm_vcpu *vcpu, int vector) apic_test_vector(vector, apic->regs + APIC_IRR); } -static inline void apic_set_vector(int vec, void *bitmap) +void kvm_lapic_set_vector(int vec, void *bitmap) { set_bit(VEC_POS(vec), (bitmap) + REG_POS(vec)); } +EXPORT_SYMBOL_GPL(kvm_lapic_set_vector); static inline void apic_clear_vector(int vec, void *bitmap) { @@ -290,7 +290,7 @@ void kvm_apic_set_version(struct kvm_vcpu *vcpu) apic_set_reg(apic, APIC_LVR, v); } -static const unsigned int apic_lvt_mask[APIC_LVT_NUM] = { +static const unsigned int apic_lvt_mask[KVM_APIC_LVT_NUM] = { LVT_MASK , /* part LVTT mask, timer mode mask added at runtime */ LVT_MASK | APIC_MODE_MASK, /* LVTTHMR */ LVT_MASK | APIC_MODE_MASK, /* LVTPC */ @@ -351,7 +351,7 @@ EXPORT_SYMBOL_GPL(kvm_apic_update_irr); static inline void apic_set_irr(int vec, struct kvm_lapic *apic) { - apic_set_vector(vec, apic->regs + APIC_IRR); + kvm_lapic_set_vector(vec, apic->regs + APIC_IRR); /* * irr_pending must be true if any interrupt is pending; set it after * APIC_IRR to avoid race with apic_clear_irr @@ -844,7 +844,7 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode, if (apic_test_vector(vector, apic->regs + APIC_TMR) != !!trig_mode) { if (trig_mode) - apic_set_vector(vector, apic->regs + APIC_TMR); + kvm_lapic_set_vector(vector, apic->regs + APIC_TMR); else apic_clear_vector(vector, apic->regs + APIC_TMR); } @@ -1109,7 +1109,7 @@ static inline struct kvm_lapic *to_lapic(struct kvm_io_device *dev) return container_of(dev, struct kvm_lapic, dev); } -static int apic_reg_read(struct kvm_lapic *apic, u32 offset, int len, +int kvm_lapic_reg_read(struct kvm_lapic *apic, u32 offset, int len, void *data) { unsigned char alignment = offset & 0xf; @@ -1146,6 +1146,7 @@ static int apic_reg_read(struct kvm_lapic *apic, u32 offset, int len, } return 0; } +EXPORT_SYMBOL_GPL(kvm_lapic_reg_read); static int apic_mmio_in_range(struct kvm_lapic *apic, gpa_t addr) { @@ -1163,7 +1164,7 @@ static int apic_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *this, if (!apic_mmio_in_range(apic, address)) return -EOPNOTSUPP; - apic_reg_read(apic, offset, len, data); + kvm_lapic_reg_read(apic, offset, len, data); return 0; } @@ -1348,7 +1349,7 @@ static void apic_manage_nmi_watchdog(struct kvm_lapic *apic, u32 lvt0_val) } } -static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) +int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) { int ret = 0; @@ -1395,7 +1396,7 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) int i; u32 lvt_val; - for (i = 0; i < APIC_LVT_NUM; i++) { + for (i = 0; i < KVM_APIC_LVT_NUM; i++) { lvt_val = kvm_apic_get_reg(apic, APIC_LVTT + 0x10 * i); apic_set_reg(apic, APIC_LVTT + 0x10 * i, @@ -1467,7 +1468,7 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) case APIC_SELF_IPI: if (apic_x2apic_mode(apic)) { - apic_reg_write(apic, APIC_ICR, 0x40000 | (val & 0xff)); + kvm_lapic_reg_write(apic, APIC_ICR, 0x40000 | (val & 0xff)); } else ret = 1; break; @@ -1479,6 +1480,7 @@ static int apic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val) apic_debug("Local APIC Write to read-only register %x\n", reg); return ret; } +EXPORT_SYMBOL_GPL(kvm_lapic_reg_write); static int apic_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this, gpa_t address, int len, const void *data) @@ -1508,7 +1510,7 @@ static int apic_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this, apic_debug("%s: offset 0x%x with length 0x%x, and value is " "0x%x\n", __func__, offset, len, val); - apic_reg_write(apic, offset & 0xff0, val); + kvm_lapic_reg_write(apic, offset & 0xff0, val); return 0; } @@ -1516,7 +1518,7 @@ static int apic_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *this, void kvm_lapic_set_eoi(struct kvm_vcpu *vcpu) { if (kvm_vcpu_has_lapic(vcpu)) - apic_reg_write(vcpu->arch.apic, APIC_EOI, 0); + kvm_lapic_reg_write(vcpu->arch.apic, APIC_EOI, 0); } EXPORT_SYMBOL_GPL(kvm_lapic_set_eoi); @@ -1528,10 +1530,10 @@ void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset) /* hw has done the conditional check and inst decode */ offset &= 0xff0; - apic_reg_read(vcpu->arch.apic, offset, 4, &val); + kvm_lapic_reg_read(vcpu->arch.apic, offset, 4, &val); /* TODO: optimize to just emulate side effect w/o one more write */ - apic_reg_write(vcpu->arch.apic, offset, val); + kvm_lapic_reg_write(vcpu->arch.apic, offset, val); } EXPORT_SYMBOL_GPL(kvm_apic_write_nodecode); @@ -1670,7 +1672,7 @@ void kvm_lapic_reset(struct kvm_vcpu *vcpu, bool init_event) kvm_apic_set_id(apic, vcpu->vcpu_id); kvm_apic_set_version(apic->vcpu); - for (i = 0; i < APIC_LVT_NUM; i++) + for (i = 0; i < KVM_APIC_LVT_NUM; i++) apic_set_reg(apic, APIC_LVTT + 0x10 * i, APIC_LVT_MASKED); apic_update_lvtt(apic); if (kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_LINT0_REENABLED)) @@ -2073,8 +2075,8 @@ int kvm_x2apic_msr_write(struct kvm_vcpu *vcpu, u32 msr, u64 data) /* if this is ICR write vector before command */ if (reg == APIC_ICR) - apic_reg_write(apic, APIC_ICR2, (u32)(data >> 32)); - return apic_reg_write(apic, reg, (u32)data); + kvm_lapic_reg_write(apic, APIC_ICR2, (u32)(data >> 32)); + return kvm_lapic_reg_write(apic, reg, (u32)data); } int kvm_x2apic_msr_read(struct kvm_vcpu *vcpu, u32 msr, u64 *data) @@ -2091,10 +2093,10 @@ int kvm_x2apic_msr_read(struct kvm_vcpu *vcpu, u32 msr, u64 *data) return 1; } - if (apic_reg_read(apic, reg, 4, &low)) + if (kvm_lapic_reg_read(apic, reg, 4, &low)) return 1; if (reg == APIC_ICR) - apic_reg_read(apic, APIC_ICR2, 4, &high); + kvm_lapic_reg_read(apic, APIC_ICR2, 4, &high); *data = (((u64)high) << 32) | low; @@ -2110,8 +2112,8 @@ int kvm_hv_vapic_msr_write(struct kvm_vcpu *vcpu, u32 reg, u64 data) /* if this is ICR write vector before command */ if (reg == APIC_ICR) - apic_reg_write(apic, APIC_ICR2, (u32)(data >> 32)); - return apic_reg_write(apic, reg, (u32)data); + kvm_lapic_reg_write(apic, APIC_ICR2, (u32)(data >> 32)); + return kvm_lapic_reg_write(apic, reg, (u32)data); } int kvm_hv_vapic_msr_read(struct kvm_vcpu *vcpu, u32 reg, u64 *data) @@ -2122,10 +2124,10 @@ int kvm_hv_vapic_msr_read(struct kvm_vcpu *vcpu, u32 reg, u64 *data) if (!kvm_vcpu_has_lapic(vcpu)) return 1; - if (apic_reg_read(apic, reg, 4, &low)) + if (kvm_lapic_reg_read(apic, reg, 4, &low)) return 1; if (reg == APIC_ICR) - apic_reg_read(apic, APIC_ICR2, 4, &high); + kvm_lapic_reg_read(apic, APIC_ICR2, 4, &high); *data = (((u64)high) << 32) | low; diff --git a/arch/x86/kvm/lapic.h b/arch/x86/kvm/lapic.h index 41bdb35..0b68f5a 100644 --- a/arch/x86/kvm/lapic.h +++ b/arch/x86/kvm/lapic.h @@ -7,6 +7,7 @@ #define KVM_APIC_INIT 0 #define KVM_APIC_SIPI 1 +#define KVM_APIC_LVT_NUM 6 struct kvm_timer { struct hrtimer timer; @@ -56,6 +57,10 @@ void kvm_lapic_set_eoi(struct kvm_vcpu *vcpu); void kvm_lapic_set_base(struct kvm_vcpu *vcpu, u64 value); u64 kvm_lapic_get_base(struct kvm_vcpu *vcpu); void kvm_apic_set_version(struct kvm_vcpu *vcpu); +void kvm_lapic_set_vector(int vec, void *bitmap); +int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val); +int kvm_lapic_reg_read(struct kvm_lapic *apic, u32 offset, int len, + void *data); void __kvm_apic_update_irr(u32 *pir, void *regs); void kvm_apic_update_irr(struct kvm_vcpu *vcpu, u32 *pir);