From nobody Sat May 4 05:09:04 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1528734306813457.14750657890056; Mon, 11 Jun 2018 09:25:06 -0700 (PDT) Received: from localhost ([::1]:50069 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSPcw-0004Pd-38 for importer@patchew.org; Mon, 11 Jun 2018 12:25:06 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38532) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fSPbS-0003ee-K5 for qemu-devel@nongnu.org; Mon, 11 Jun 2018 12:23:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fSPbO-0006rc-LK for qemu-devel@nongnu.org; Mon, 11 Jun 2018 12:23:34 -0400 Received: from 2.mo6.mail-out.ovh.net ([46.105.76.65]:41628) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1fSPbO-0006me-BO for qemu-devel@nongnu.org; Mon, 11 Jun 2018 12:23:30 -0400 Received: from player762.ha.ovh.net (unknown [10.109.105.92]) by mo6.mail-out.ovh.net (Postfix) with ESMTP id 8D62916341D for ; Mon, 11 Jun 2018 18:23:20 +0200 (CEST) Received: from zorba.kaod.org.com (LFbn-TOU-1-49-10.w86-201.abo.wanadoo.fr [86.201.141.10]) (Authenticated sender: clg@kaod.org) by player762.ha.ovh.net (Postfix) with ESMTPSA id CB578E00B2; Mon, 11 Jun 2018 18:23:12 +0200 (CEST) From: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= To: qemu-ppc@nongnu.org Date: Mon, 11 Jun 2018 18:23:10 +0200 Message-Id: <20180611162310.19968-1-clg@kaod.org> X-Mailer: git-send-email 2.13.6 MIME-Version: 1.0 X-Ovh-Tracer-Id: 11671078436454370131 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedthedrkeehgddutddtucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuqfggjfdpvefjgfevmfevgfenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddm Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 46.105.76.65 Subject: [Qemu-devel] [PATCH] xics_kvm: use KVM helpers X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= , qemu-devel@nongnu.org, David Gibson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" The KVM helpers hide the low level interface used to communicate to the XICS KVM device and provide a good cleanup to the XICS KVM models. Signed-off-by: C=C3=A9dric Le Goater --- hw/intc/xics_kvm.c | 52 ++++++++++++++------------------------------------= -- 1 file changed, 14 insertions(+), 38 deletions(-) diff --git a/hw/intc/xics_kvm.c b/hw/intc/xics_kvm.c index 89fb20e2c55c..8bdf6afe82a0 100644 --- a/hw/intc/xics_kvm.c +++ b/hw/intc/xics_kvm.c @@ -56,10 +56,6 @@ static QLIST_HEAD(, KVMEnabledICP) static void icp_get_kvm_state(ICPState *icp) { uint64_t state; - struct kvm_one_reg reg =3D { - .id =3D KVM_REG_PPC_ICP_STATE, - .addr =3D (uintptr_t)&state, - }; int ret; =20 /* ICP for this CPU thread is not in use, exiting */ @@ -67,7 +63,7 @@ static void icp_get_kvm_state(ICPState *icp) return; } =20 - ret =3D kvm_vcpu_ioctl(icp->cs, KVM_GET_ONE_REG, ®); + ret =3D kvm_get_one_reg(icp->cs, KVM_REG_PPC_ICP_STATE, &state); if (ret !=3D 0) { error_report("Unable to retrieve KVM interrupt controller state" " for CPU %ld: %s", kvm_arch_vcpu_id(icp->cs), strerror(er= rno)); @@ -96,10 +92,6 @@ static void icp_synchronize_state(ICPState *icp) static int icp_set_kvm_state(ICPState *icp, int version_id) { uint64_t state; - struct kvm_one_reg reg =3D { - .id =3D KVM_REG_PPC_ICP_STATE, - .addr =3D (uintptr_t)&state, - }; int ret; =20 /* ICP for this CPU thread is not in use, exiting */ @@ -111,7 +103,7 @@ static int icp_set_kvm_state(ICPState *icp, int version= _id) | ((uint64_t)icp->mfrr << KVM_REG_PPC_ICP_MFRR_SHIFT) | ((uint64_t)icp->pending_priority << KVM_REG_PPC_ICP_PPRI_SHIFT); =20 - ret =3D kvm_vcpu_ioctl(icp->cs, KVM_SET_ONE_REG, ®); + ret =3D kvm_set_one_reg(icp->cs, KVM_REG_PPC_ICP_STATE, &state); if (ret !=3D 0) { error_report("Unable to restore KVM interrupt controller state (0x= %" PRIx64 ") for CPU %ld: %s", state, kvm_arch_vcpu_id(icp->c= s), @@ -185,21 +177,15 @@ static const TypeInfo icp_kvm_info =3D { static void ics_get_kvm_state(ICSState *ics) { uint64_t state; - struct kvm_device_attr attr =3D { - .flags =3D 0, - .group =3D KVM_DEV_XICS_GRP_SOURCES, - .addr =3D (uint64_t)(uintptr_t)&state, - }; int i; + Error *local_err =3D NULL; =20 for (i =3D 0; i < ics->nr_irqs; i++) { ICSIRQState *irq =3D &ics->irqs[i]; - int ret; - - attr.attr =3D i + ics->offset; =20 - ret =3D ioctl(kernel_xics_fd, KVM_GET_DEVICE_ATTR, &attr); - if (ret !=3D 0) { + kvm_device_access(kernel_xics_fd, KVM_DEV_XICS_GRP_SOURCES, + i + ics->offset, &state, false, &local_err); + if (local_err) { error_report("Unable to retrieve KVM interrupt controller stat= e" " for IRQ %d: %s", i + ics->offset, strerror(errno)); exit(1); @@ -255,19 +241,13 @@ static void ics_synchronize_state(ICSState *ics) static int ics_set_kvm_state(ICSState *ics, int version_id) { uint64_t state; - struct kvm_device_attr attr =3D { - .flags =3D 0, - .group =3D KVM_DEV_XICS_GRP_SOURCES, - .addr =3D (uint64_t)(uintptr_t)&state, - }; int i; + Error *local_err =3D NULL; =20 for (i =3D 0; i < ics->nr_irqs; i++) { ICSIRQState *irq =3D &ics->irqs[i]; int ret; =20 - attr.attr =3D i + ics->offset; - state =3D irq->server; state |=3D (uint64_t)(irq->saved_priority & KVM_XICS_PRIORITY_MASK) << KVM_XICS_PRIORITY_SHIFT; @@ -293,8 +273,9 @@ static int ics_set_kvm_state(ICSState *ics, int version= _id) state |=3D KVM_XICS_QUEUED; } =20 - ret =3D ioctl(kernel_xics_fd, KVM_SET_DEVICE_ATTR, &attr); - if (ret !=3D 0) { + kvm_device_access(kernel_xics_fd, KVM_DEV_XICS_GRP_SOURCES, + i + ics->offset, &state, true, &local_err); + if (local_err) { error_report("Unable to restore KVM interrupt controller state" " for IRQs %d: %s", i + ics->offset, strerror(errno)); return ret; @@ -391,10 +372,6 @@ static void rtas_dummy(PowerPCCPU *cpu, sPAPRMachineSt= ate *spapr, int xics_kvm_init(sPAPRMachineState *spapr, Error **errp) { int rc; - struct kvm_create_device xics_create_device =3D { - .type =3D KVM_DEV_TYPE_XICS, - .flags =3D 0, - }; =20 if (!kvm_enabled() || !kvm_check_extension(kvm_state, KVM_CAP_IRQ_XICS= )) { error_setg(errp, @@ -431,20 +408,19 @@ int xics_kvm_init(sPAPRMachineState *spapr, Error **e= rrp) goto fail; } =20 - /* Create the kernel ICP */ - rc =3D kvm_vm_ioctl(kvm_state, KVM_CREATE_DEVICE, &xics_create_device); + /* Create the KVM XICS device */ + rc =3D kvm_create_device(kvm_state, KVM_DEV_TYPE_XICS, false); if (rc < 0) { error_setg_errno(errp, -rc, "Error on KVM_CREATE_DEVICE for XICS"); goto fail; } =20 - kernel_xics_fd =3D xics_create_device.fd; - + kernel_xics_fd =3D rc; kvm_kernel_irqchip =3D true; kvm_msi_via_irqfd_allowed =3D true; kvm_gsi_direct_mapping =3D true; =20 - return rc; + return 0; =20 fail: kvmppc_define_rtas_kernel_token(0, "ibm,set-xive"); --=20 2.13.6