From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.9 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7567CC433E0 for ; Fri, 12 Feb 2021 11:57:40 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3023764E01 for ; Fri, 12 Feb 2021 11:57:40 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 3023764E01 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=11zDqyriYN2clDmLR/WecxH4hiSBj4X02+3jbezPMRk=; b=exFEEOCEMEUFrlxHer+IDYPk+ 582ujkTndKxcTa8aOkuZM1q+/gL3xk3LdvDcS5Y99dUPSoSIuio+q73rrn23PbIiQc+LUSxfGKjFp El3kK9M/yDarFRQKmAw/sT3ZhdMCAyVr5z1zUo8msEMlJ+a+Rd+mrv3tieeTCrVrPvzG1TuVO89dO 74atmSWigzQ5S52ShF33P518DUPwNbYYthJ+O3vUXaaiA9OYyJg/BI8OOki1c6yKJAz0KTKpzD//X oXkCqz3NoINS2DmopIna6Ev/m+o5+WH3aHb6wSPbYh6fRUh7uqjgOdeZyhaAFTWabZbgBkHZyq3lE iyMa6g52g==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1lAX3Z-0004CF-Oe; Fri, 12 Feb 2021 11:56:17 +0000 Received: from foss.arm.com ([217.140.110.172]) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1lAX3X-0004Bp-Eg for linux-arm-kernel@lists.infradead.org; Fri, 12 Feb 2021 11:56:16 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 6401B113E; Fri, 12 Feb 2021 03:56:07 -0800 (PST) Received: from [192.168.0.110] (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 6A3203F719; Fri, 12 Feb 2021 03:56:06 -0800 (PST) Subject: Re: [PATCH kvmtool 10/21] hw/rtc: Refactor trap handlers To: Andre Przywara , Will Deacon , Julien Thierry References: <20201210142908.169597-1-andre.przywara@arm.com> <20201210142908.169597-11-andre.przywara@arm.com> From: Alexandru Elisei Message-ID: Date: Fri, 12 Feb 2021 11:56:19 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: <20201210142908.169597-11-andre.przywara@arm.com> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210212_065615_623108_0C1AC212 X-CRM114-Status: GOOD ( 22.41 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arm-kernel@lists.infradead.org, Marc Zyngier , kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Andre, On 12/10/20 2:28 PM, Andre Przywara wrote: > With the planned retirement of the special ioport emulation code, we > need to provide emulation functions compatible with the MMIO prototype. > > Merge the two different trap handlers into one function, checking for > read/write and data/index register inside. > Adjust the trap handlers to use that new function, and provide shims to > implement the old ioport interface, for now. > > Signed-off-by: Andre Przywara > --- > hw/rtc.c | 70 ++++++++++++++++++++++++++++---------------------------- > 1 file changed, 35 insertions(+), 35 deletions(-) > > diff --git a/hw/rtc.c b/hw/rtc.c > index 5483879f..664d4cb0 100644 > --- a/hw/rtc.c > +++ b/hw/rtc.c > @@ -42,11 +42,37 @@ static inline unsigned char bin2bcd(unsigned val) > return ((val / 10) << 4) + val % 10; > } > > -static bool cmos_ram_data_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size) > +static void cmos_ram_io(struct kvm_cpu *vcpu, u64 addr, u8 *data, > + u32 len, u8 is_write, void *ptr) > { > struct tm *tm; > time_t ti; > > + if (is_write) { > + if (addr == 0x70) { /* index register */ > + u8 value = ioport__read8(data); > + > + vcpu->kvm->nmi_disabled = value & (1UL << 7); > + rtc.cmos_idx = value & ~(1UL << 7); > + > + return; > + } > + > + switch (rtc.cmos_idx) { > + case RTC_REG_C: > + case RTC_REG_D: > + /* Read-only */ > + break; > + default: > + rtc.cmos_data[rtc.cmos_idx] = ioport__read8(data); > + break; > + } > + return; > + } > + > + if (addr == 0x70) > + return; > + > time(&ti); > > tm = gmtime(&ti); > @@ -92,42 +118,23 @@ static bool cmos_ram_data_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 po > ioport__write8(data, rtc.cmos_data[rtc.cmos_idx]); > break; > } > - > - return true; > } > > -static bool cmos_ram_data_out(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size) > +static bool cmos_ram_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size) > { > - switch (rtc.cmos_idx) { > - case RTC_REG_C: > - case RTC_REG_D: > - /* Read-only */ > - break; > - default: > - rtc.cmos_data[rtc.cmos_idx] = ioport__read8(data); > - break; > - } > - > + cmos_ram_io(vcpu, port, data, size, false, NULL); > return true; > } > > -static struct ioport_operations cmos_ram_data_ioport_ops = { > - .io_out = cmos_ram_data_out, > - .io_in = cmos_ram_data_in, > -}; > - > -static bool cmos_ram_index_out(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size) > +static bool cmos_ram_out(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size) > { > - u8 value = ioport__read8(data); > - > - vcpu->kvm->nmi_disabled = value & (1UL << 7); > - rtc.cmos_idx = value & ~(1UL << 7); > - > + cmos_ram_io(vcpu, port, data, size, true, NULL); > return true; > } > > -static struct ioport_operations cmos_ram_index_ioport_ops = { > - .io_out = cmos_ram_index_out, > +static struct ioport_operations cmos_ram_ioport_ops = { > + .io_out = cmos_ram_out, > + .io_in = cmos_ram_in, > }; > > #ifdef CONFIG_HAS_LIBFDT > @@ -162,21 +169,15 @@ int rtc__init(struct kvm *kvm) > return r; > > /* PORT 0070-007F - CMOS RAM/RTC (REAL TIME CLOCK) */ > - r = ioport__register(kvm, 0x0070, &cmos_ram_index_ioport_ops, 1, NULL); > + r = ioport__register(kvm, 0x0070, &cmos_ram_ioport_ops, 2, NULL); > if (r < 0) > goto out_device; > > - r = ioport__register(kvm, 0x0071, &cmos_ram_data_ioport_ops, 1, NULL); > - if (r < 0) > - goto out_ioport; > - > /* Set the VRT bit in Register D to indicate valid RAM and time */ > rtc.cmos_data[RTC_REG_D] = RTC_REG_D_VRT; > > return r; > > -out_ioport: > - ioport__unregister(kvm, 0x0070); > out_device: > device__unregister(&rtc_dev_hdr); > > @@ -188,7 +189,6 @@ int rtc__exit(struct kvm *kvm) > { > /* PORT 0070-007F - CMOS RAM/RTC (REAL TIME CLOCK) */ > ioport__unregister(kvm, 0x0070); > - ioport__unregister(kvm, 0x0071); > > return 0; > } The behaviour is preserved with this patch, and it compiles, so: Reviewed-by: Alexandru Elisei Thanks, Alex _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel