From patchwork Fri Jan 29 09:32:35 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: alvise rigo X-Patchwork-Id: 8160941 Return-Path: X-Original-To: patchwork-qemu-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id ABA739F9A0 for ; Fri, 29 Jan 2016 09:35:26 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E0CD520361 for ; Fri, 29 Jan 2016 09:35:25 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 19B772035D for ; Fri, 29 Jan 2016 09:35:25 +0000 (UTC) Received: from localhost ([::1]:60720 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aP5Se-0003rI-EF for patchwork-qemu-devel@patchwork.kernel.org; Fri, 29 Jan 2016 04:35:24 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33637) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aP5QT-0007TR-GX for qemu-devel@nongnu.org; Fri, 29 Jan 2016 04:33:10 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aP5QS-0000RH-80 for qemu-devel@nongnu.org; Fri, 29 Jan 2016 04:33:09 -0500 Received: from mail-wm0-x22e.google.com ([2a00:1450:400c:c09::22e]:38645) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aP5QR-0000QE-Ul for qemu-devel@nongnu.org; Fri, 29 Jan 2016 04:33:08 -0500 Received: by mail-wm0-x22e.google.com with SMTP id p63so59735606wmp.1 for ; Fri, 29 Jan 2016 01:33:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtualopensystems-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sNnsFsd8JO2FYoWfMOXmW0sLrITcN+EClZxXXAlsDTs=; b=fbq2te63WJbX8vz2Ysw1LZcvUaQyJE+qvscYJufyXJ+Uu+GDNSacSEUldlh5SUtXQS UbK+f2yY2jsKYn/6r8Dc3MFOBQv415IjIW5dZJNaDLcPHYb1uYSakSytqiokYK5TgkOF SgO6ge1x5nRKPXilZR1E2HNFoTX/RoIewcUnW2NJ6gNsbnh3O23oXlZ4dVusu2Yc38mk ZpGyisjjSmNpFfJSZARl8um+I5RiRBE6lVPh+K6vFsazVQwJJTv7pmdfcB8eldNmLpO9 eC9gRsJDTh4AW42xHhJZcAD6/tEAnB1gY024sxzVJdx1WlV788tMJtRUKmBtFFCftXZ7 eSvA== 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:in-reply-to :references; bh=sNnsFsd8JO2FYoWfMOXmW0sLrITcN+EClZxXXAlsDTs=; b=QqNMluXv1gHOrZIbbd4igUJoiVx/78yr9Ts9yOfV+nZx3/RYp65H8D5sHuvUg7iQD+ ZDXIsWz3jh6CX53dlrK7WROkW9SRcHmxgtRUgfs7KmZiToFIpiZD3Z0cTEXqCrgPb8M8 yoXtKITcVlj7tTv08BzWIIjIRcs6DWTHDIsMIqSfAS4usaBKGekMDXLyGA1mYYtxwBhN HNol/GPfWydO/Ij0Y84O4QzipNTypPo6mSi/zfswIg08Um4CKuqatSsNldkh2dAF+dA6 nX20eSIOHprTaq6n5jwIDJUUSu+UiaBRE4U92imtU+nUpgtemKod9y94X67wzxjhZl8B JaAg== X-Gm-Message-State: AG10YOQ6R1ZttAm7nsFRlAotyG3eXR9eNLvEceBLfZJ+fTb9WWQ/8nKpBIijJRJsMX/q/g== X-Received: by 10.194.205.103 with SMTP id lf7mr7492276wjc.147.1454059987294; Fri, 29 Jan 2016 01:33:07 -0800 (PST) Received: from localhost.localdomain (LPuteaux-656-1-278-113.w80-15.abo.wanadoo.fr. [80.15.154.113]) by smtp.googlemail.com with ESMTPSA id o7sm14765451wjf.45.2016.01.29.01.33.06 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 29 Jan 2016 01:33:06 -0800 (PST) From: Alvise Rigo To: qemu-devel@nongnu.org, mttcg@listserver.greensocs.com Date: Fri, 29 Jan 2016 10:32:35 +0100 Message-Id: <1454059965-23402-7-git-send-email-a.rigo@virtualopensystems.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1454059965-23402-1-git-send-email-a.rigo@virtualopensystems.com> References: <1454059965-23402-1-git-send-email-a.rigo@virtualopensystems.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::22e Cc: claudio.fontana@huawei.com, pbonzini@redhat.com, jani.kokkonen@huawei.com, tech@virtualopensystems.com, alex.bennee@linaro.org, rth@twiddle.net Subject: [Qemu-devel] [RFC v7 06/16] qom: cpu: Add CPUClass hooks for exclusive range X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The excl_protected_range is a hwaddr range set by the VCPU at the execution of a LoadLink instruction. If a normal access writes to this range, the corresponding StoreCond will fail. Each architecture can set the exclusive range when issuing the LoadLink operation through a CPUClass hook. This comes in handy to emulate, for instance, the exclusive monitor implemented in some ARM architectures (more precisely, the Exclusive Reservation Granule). In addition, add another CPUClass hook called to decide whether a StoreCond has to fail or not. Suggested-by: Jani Kokkonen Suggested-by: Claudio Fontana Signed-off-by: Alvise Rigo --- include/qom/cpu.h | 15 +++++++++++++++ qom/cpu.c | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 2e5229d..682c81d 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -29,6 +29,7 @@ #include "qemu/queue.h" #include "qemu/thread.h" #include "qemu/typedefs.h" +#include "qemu/range.h" typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size, void *opaque); @@ -183,6 +184,12 @@ typedef struct CPUClass { void (*cpu_exec_exit)(CPUState *cpu); bool (*cpu_exec_interrupt)(CPUState *cpu, int interrupt_request); + /* Atomic instruction handling */ + void (*cpu_set_excl_protected_range)(CPUState *cpu, hwaddr addr, + hwaddr size); + int (*cpu_valid_excl_access)(CPUState *cpu, hwaddr addr, + hwaddr size); + void (*disas_set_info)(CPUState *cpu, disassemble_info *info); } CPUClass; @@ -219,6 +226,9 @@ struct kvm_run; #define TB_JMP_CACHE_BITS 12 #define TB_JMP_CACHE_SIZE (1 << TB_JMP_CACHE_BITS) +/* Atomic insn translation TLB support. */ +#define EXCLUSIVE_RESET_ADDR ULLONG_MAX + /** * CPUState: * @cpu_index: CPU index (informative). @@ -341,6 +351,11 @@ struct CPUState { */ bool throttle_thread_scheduled; + /* vCPU's exclusive addresses range. + * The address is set to EXCLUSIVE_RESET_ADDR if the vCPU is not + * in the middle of a LL/SC. */ + struct Range excl_protected_range; + /* Note that this is accessed at the start of every TB via a negative offset from AREG0. Leave this field at the end so as to make the (absolute value) offset as small as possible. This reduces code diff --git a/qom/cpu.c b/qom/cpu.c index 8f537a4..a5d360c 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -203,6 +203,24 @@ static bool cpu_common_exec_interrupt(CPUState *cpu, int int_req) return false; } +static void cpu_common_set_excl_range(CPUState *cpu, hwaddr addr, hwaddr size) +{ + cpu->excl_protected_range.begin = addr; + cpu->excl_protected_range.end = addr + size; +} + +static int cpu_common_valid_excl_access(CPUState *cpu, hwaddr addr, hwaddr size) +{ + /* Check if the excl range completely covers the access */ + if (cpu->excl_protected_range.begin <= addr && + cpu->excl_protected_range.end >= addr + size) { + + return 1; + } + + return 0; +} + void cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf, int flags) { @@ -355,6 +373,8 @@ static void cpu_class_init(ObjectClass *klass, void *data) k->cpu_exec_enter = cpu_common_noop; k->cpu_exec_exit = cpu_common_noop; k->cpu_exec_interrupt = cpu_common_exec_interrupt; + k->cpu_set_excl_protected_range = cpu_common_set_excl_range; + k->cpu_valid_excl_access = cpu_common_valid_excl_access; dc->realize = cpu_common_realizefn; /* * Reason: CPUs still need special care by board code: wiring up