From patchwork Mon Aug 1 17:59:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamas Lengyel X-Patchwork-Id: 9254785 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id C359A6048B for ; Mon, 1 Aug 2016 18:02:36 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id BA35B2837F for ; Mon, 1 Aug 2016 18:02:36 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id AE7BF284BD; Mon, 1 Aug 2016 18:02:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id E1B9A2837F for ; Mon, 1 Aug 2016 18:02:35 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bUHUp-0004u3-0p; Mon, 01 Aug 2016 17:59:23 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bUHUn-0004tx-T1 for xen-devel@lists.xenproject.org; Mon, 01 Aug 2016 17:59:21 +0000 Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id 7F/CD-10431-9FD8F975; Mon, 01 Aug 2016 17:59:21 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprCIsWRWlGSWpSXmKPExsVyMfSas+6P3vn hBs+WiVp83zKZyYHR4/CHKywBjFGsmXlJ+RUJrBl73u9lKTirV7Hq71TWBsap6l2MXBxCAjMY JY41vWUHcVgE3rBIzHj3G8yREHjHItFwYxFjFyMnkBMj8WjzOiYIu0Li59K5YLaQgKbEwQ1nm CFGTWCS6FzUzgqSYBMwkrh6tYcNxBYRUJK4t2oyE0gRs8AVRonZbQeBVnBwCAsYSyxaoQ9Swy KgKvF28R9WkDCvgJfEuqkSELvkJC5Pf8A2gZFvASPDKkaN4tSistQiXSMLvaSizPSMktzEzBx dQ0MTvdzU4uLE9NScxKRiveT83E2MwFCpZ2Bg3MG47rjfIUZJDiYlUV7PpvnhQnxJ+SmVGYnF GfFFpTmpxYcYZTg4lCR4A3uAcoJFqempFWmZOcCghUlLcPAoifD2gaR5iwsSc4sz0yFSpxgtO bb8vraWiePY3BtActvUe2uZhFjy8vNSpcR5Y0EaBEAaMkrz4MbBIusSo6yUMC8jAwODEE9Bal FuZgmq/CtGcQ5GJWHejSBTeDLzSuC2vgI6iAnooET7OSAHlSQipKQaGNV5kw4KGXJHXpCTsVN 0il3CGVreecC31CZE9U5j7gah5WkSX/0+PFxw7Gz5jKcXlyy6Pe9vjtFpkzy71oMTxRcY7ZrD 2HHp9iSBVTv+qd1de/F2whwRxRXhWasivbJff/iYfe9Wc3FSYtnuP0zsgruVpOu1dX/sjAhh9 lk+NefEdta677JKF5RYijMSDbWYi4oTAbC5M46nAgAA X-Env-Sender: tamas.lengyel@zentific.com X-Msg-Ref: server-5.tower-27.messagelabs.com!1470074359!57175642!1 X-Originating-IP: [209.85.214.67] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 8.77; banners=-,-,- X-VirusChecked: Checked Received: (qmail 61811 invoked from network); 1 Aug 2016 17:59:19 -0000 Received: from mail-it0-f67.google.com (HELO mail-it0-f67.google.com) (209.85.214.67) by server-5.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 1 Aug 2016 17:59:19 -0000 Received: by mail-it0-f67.google.com with SMTP id d65so12399178ith.0 for ; Mon, 01 Aug 2016 10:59:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zentific-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=4XEhfzoBgrSBeoZ+EvwkHM0+F6hgetZ2RpJOPO6c8uE=; b=q+QKYjAsCUi19bVDw6nlqBEZ2WA88Vr0P47NiFj+ecAm5Bvhhif/BH0FnAK75IKMGP XeFHu4+VvxY4uRE2kvt4Ui7BUmVpqEFtQwx1UEvaNMD/wOoJA7ubh2BPDrr5slo4my81 HyBKpIhx9kdU1uDMpP5R5Wd0VaW3pSc9ZcejnWw02r/dBGnuF6kKwQCiNhLBfULYVK7H yssHvSYKtTChHmVNOrzhbCrxhIo87h87K9a2ALg9IlHyFVkkEOG5BE9vlZcqa7mpmoB5 DLO7NWopnwLQTGYChzoq4n0JHW+EVRO1V7qMyR/ku2LzkjFteZ4JOCUAuihoONElb/Dv 82hg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=4XEhfzoBgrSBeoZ+EvwkHM0+F6hgetZ2RpJOPO6c8uE=; b=hQh9j0KhGSX7Lhr0CJw2Nu2vx4VJxBYWmd759NTVcL+RzBwRr5hqbPOs/qG2AuxuEu Y+IjgJNQY2rEGQ9imX9diN6zgX6By/56KbVxKwWEoNxOeU/yM13RGs6EQ5WHqO1Yd++C 5BfrKGw0aqJ26aQ6DDUQjlTVP3z8d4et9U3Mosf0/RV4+ZCwbIFcgUv8FUhYaJox02Vo pNl5Ob0/j8/9ZKgqprhLe6yRRE/HnpFet9flivneKqq9hD7/a/hKAvAFZ9l9EAbHtIWR 2aOyHeH1y5GdOnHKo3bwWumEnEoUcy1hkBkSiMfiufuLoRwvogW73z4avQlgRbYbAzeC 868w== X-Gm-Message-State: AEkoousCw2qZ+SvATqxqgTyP3VNTafoBZ4eoGhINkewRC1LTRH8TsaHCsiP7LCRZNkwKXA== X-Received: by 10.36.94.16 with SMTP id h16mr15547617itb.45.1470074358579; Mon, 01 Aug 2016 10:59:18 -0700 (PDT) Received: from l1.lan (c-73-14-35-59.hsd1.co.comcast.net. [73.14.35.59]) by smtp.gmail.com with ESMTPSA id y42sm8267786ita.9.2016.08.01.10.59.17 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 01 Aug 2016 10:59:17 -0700 (PDT) From: Tamas K Lengyel To: xen-devel@lists.xenproject.org Date: Mon, 1 Aug 2016 11:59:14 -0600 Message-Id: <1470074354-13799-1-git-send-email-tamas.lengyel@zentific.com> X-Mailer: git-send-email 2.8.1 Cc: Tamas K Lengyel , Julien Grall , Stefano Stabellini , Jan Beulich , Razvan Cojocaru Subject: [Xen-devel] [PATCH v2] arm/vm_event: get/set registers X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Add support for getting/setting registers through vm_event on ARM. Only TTB/CR/R0/R1, PC and CPSR are sent as part of a request and only PC is set as part of a response. The set of registers can be expanded in the future to include other registers as well if necessary. Signed-off-by: Tamas K Lengyel Reviewed-by: Andrew Cooper Acked-by: Razvan Cojocaru Acked-by: Stefano Stabellini --- Cc: Stefano Stabellini Cc: Julien Grall Cc: Razvan Cojocaru Cc: Jan Beulich v2: Add assert for vCPU pause check Use correct regs pointer on setting registers Only set the register 'pc' --- xen/arch/arm/Makefile | 1 + xen/arch/arm/vm_event.c | 52 ++++++++++++++++++++++++++++++++++++++++++ xen/include/asm-arm/vm_event.h | 11 --------- xen/include/asm-x86/vm_event.h | 4 ---- xen/include/public/vm_event.h | 18 +++++++++++++-- xen/include/xen/vm_event.h | 3 +++ 6 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 xen/arch/arm/vm_event.c diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile index b264ed4..5752830 100644 --- a/xen/arch/arm/Makefile +++ b/xen/arch/arm/Makefile @@ -41,6 +41,7 @@ obj-y += traps.o obj-y += vgic.o obj-y += vgic-v2.o obj-$(CONFIG_ARM_64) += vgic-v3.o +obj-y += vm_event.o obj-y += vtimer.o obj-y += vpsci.o obj-y += vuart.o diff --git a/xen/arch/arm/vm_event.c b/xen/arch/arm/vm_event.c new file mode 100644 index 0000000..47312e9 --- /dev/null +++ b/xen/arch/arm/vm_event.c @@ -0,0 +1,52 @@ +/* + * arch/arm/vm_event.c + * + * Architecture-specific vm_event handling routines + * + * Copyright (c) 2016 Tamas K Lengyel (tamas.lengyel@zentific.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; If not, see . + */ + +#include +#include + +void vm_event_fill_regs(vm_event_request_t *req) +{ + const struct cpu_user_regs *regs = guest_cpu_user_regs(); + + req->data.regs.arm.cpsr = regs->cpsr; + req->data.regs.arm.pc = regs->pc; + req->data.regs.arm.ttbcr = READ_SYSREG(TCR_EL1); + req->data.regs.arm.ttbr0 = READ_SYSREG64(TTBR0_EL1); + req->data.regs.arm.ttbr1 = READ_SYSREG64(TTBR1_EL1); +} + +void vm_event_set_registers(struct vcpu *v, vm_event_response_t *rsp) +{ + struct cpu_user_regs *regs = &v->arch.cpu_info->guest_cpu_user_regs; + + /* vCPU should be paused */ + ASSERT(atomic_read(&v->vm_event_pause_count)); + + regs->pc = rsp->data.regs.arm.pc; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/asm-arm/vm_event.h b/xen/include/asm-arm/vm_event.h index ccc4b60..9482636 100644 --- a/xen/include/asm-arm/vm_event.h +++ b/xen/include/asm-arm/vm_event.h @@ -45,15 +45,4 @@ void vm_event_register_write_resume(struct vcpu *v, vm_event_response_t *rsp) /* Not supported on ARM. */ } -static inline -void vm_event_set_registers(struct vcpu *v, vm_event_response_t *rsp) -{ - /* Not supported on ARM. */ -} - -static inline void vm_event_fill_regs(vm_event_request_t *req) -{ - /* Not supported on ARM. */ -} - #endif /* __ASM_ARM_VM_EVENT_H__ */ diff --git a/xen/include/asm-x86/vm_event.h b/xen/include/asm-x86/vm_event.h index 7e6adff..294def6 100644 --- a/xen/include/asm-x86/vm_event.h +++ b/xen/include/asm-x86/vm_event.h @@ -39,8 +39,4 @@ void vm_event_toggle_singlestep(struct domain *d, struct vcpu *v); void vm_event_register_write_resume(struct vcpu *v, vm_event_response_t *rsp); -void vm_event_set_registers(struct vcpu *v, vm_event_response_t *rsp); - -void vm_event_fill_regs(vm_event_request_t *req); - #endif /* __ASM_X86_VM_EVENT_H__ */ diff --git a/xen/include/public/vm_event.h b/xen/include/public/vm_event.h index 64e6857..32cd4d7 100644 --- a/xen/include/public/vm_event.h +++ b/xen/include/public/vm_event.h @@ -132,8 +132,8 @@ #define VM_EVENT_X86_XCR0 3 /* - * Using a custom struct (not hvm_hw_cpu) so as to not fill - * the vm_event ring buffer too quickly. + * Using custom vCPU structs (i.e. not hvm_hw_cpu) for both x86 and ARM + * so as to not fill the vm_event ring buffer too quickly. */ struct vm_event_regs_x86 { uint64_t rax; @@ -172,6 +172,19 @@ struct vm_event_regs_x86 { }; /* + * Only the register 'pc' can be set on a vm_event response using the + * VM_EVENT_FLAG_SET_REGISTERS flag. + */ +struct vm_event_regs_arm { + uint64_t ttbr0; + uint64_t ttbr1; + uint64_t ttbcr; + uint64_t pc; + uint32_t cpsr; + uint32_t _pad; +}; + +/* * mem_access flag definitions * * These flags are set only as part of a mem_event request. @@ -273,6 +286,7 @@ typedef struct vm_event_st { union { union { struct vm_event_regs_x86 x86; + struct vm_event_regs_arm arm; } regs; struct vm_event_emul_read_data emul_read_data; diff --git a/xen/include/xen/vm_event.h b/xen/include/xen/vm_event.h index c09f723..4f088c8 100644 --- a/xen/include/xen/vm_event.h +++ b/xen/include/xen/vm_event.h @@ -75,6 +75,9 @@ int vm_event_domctl(struct domain *d, xen_domctl_vm_event_op_t *vec, void vm_event_vcpu_pause(struct vcpu *v); void vm_event_vcpu_unpause(struct vcpu *v); +void vm_event_fill_regs(vm_event_request_t *req); +void vm_event_set_registers(struct vcpu *v, vm_event_response_t *rsp); + #endif /* __VM_EVENT_H__ */ /*