From patchwork Fri Apr 22 16:08:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: sergey.fedorov@linaro.org X-Patchwork-Id: 613774 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org 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 ozlabs.org (Postfix) with ESMTPS id 3qs0zG6kvSz9t5T for ; Sat, 23 Apr 2016 02:13:30 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=linaro.org header.i=@linaro.org header.b=h7pJR27m; dkim-atps=neutral Received: from localhost ([::1]:35545 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1atdhw-00086m-Ps for incoming@patchwork.ozlabs.org; Fri, 22 Apr 2016 12:13:29 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47087) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1atddu-00083X-Mi for qemu-devel@nongnu.org; Fri, 22 Apr 2016 12:09:21 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1atddt-0008GR-Lx for qemu-devel@nongnu.org; Fri, 22 Apr 2016 12:09:18 -0400 Received: from mail-lf0-x22c.google.com ([2a00:1450:4010:c07::22c]:36304) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1atddt-0008GH-B3 for qemu-devel@nongnu.org; Fri, 22 Apr 2016 12:09:17 -0400 Received: by mail-lf0-x22c.google.com with SMTP id g184so82090861lfb.3 for ; Fri, 22 Apr 2016 09:09:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xaGH2ZwDXe9URIKBq5iNCH0QR+TDSJTJThEO5Zo+CUs=; b=h7pJR27mC3Qud1oBBcS99uCb2wbuw250f3JVqmE1KInUtfJHGzDyFTM1RonNpADE/c 6zSzqylK8z3TXpiE2XqZQ6kiuLYwfskEZxVlSDjcffzMsGhZlVN4Ek27N8uRu/4e8d11 dfogRNU9R4nJEo5NwNO5d1+E2lqGkXytXnTEA= 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=xaGH2ZwDXe9URIKBq5iNCH0QR+TDSJTJThEO5Zo+CUs=; b=PUpbFALJrAkl8Th+8Pk1GdYdLbNALa66obcJCg+szYdPwSW3tzNz+yf4xxGfCUefaZ gVQzF0/+TaHyyWtUe1DACaJFjBta9ant86J1Fp/f0mrxcCq1wFNr67PEN32Jzvr2RVU5 HCQA6MhRLQ6O1exAf5tX6tIbcAJd7iDCP8cIrBRpVCL25iZiA19LGCHN1H+aIv3QnDu6 i5OQhY5l/+Kp7xZog4JdjSQWGIOJRcF2ilPtcUxuXk/VC/oTzW1UX7PUF6XrJpp5DCwv X/9asLNme/LuvxNMG/Bu9UIBgljjMdQk27MHTdX8WFqOK9OHWgREjhkB+OmN6t4UrEUB zcWw== X-Gm-Message-State: AOPr4FVOBWwwNrg8Lcac1wdixCwEK0Wv25fVO7/zZkylrjexX6vDpbbl0F7KaBum81FKQeXz X-Received: by 10.25.156.133 with SMTP id f127mr9287417lfe.102.1461341356282; Fri, 22 Apr 2016 09:09:16 -0700 (PDT) Received: from sergey-laptop.Dlink (broadband-46-188-121-115.2com.net. [46.188.121.115]) by smtp.gmail.com with ESMTPSA id hw7sm1645709lbb.40.2016.04.22.09.09.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 22 Apr 2016 09:09:15 -0700 (PDT) From: Sergey Fedorov To: qemu-devel@nongnu.org Date: Fri, 22 Apr 2016 19:08:48 +0300 Message-Id: <1461341333-19646-7-git-send-email-sergey.fedorov@linaro.org> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1461341333-19646-1-git-send-email-sergey.fedorov@linaro.org> References: <1461341333-19646-1-git-send-email-sergey.fedorov@linaro.org> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:4010:c07::22c Subject: [Qemu-devel] [PATCH v2 06/11] tcg/s390: Make direct jump patching thread-safe 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: Sergey Fedorov , Peter Crosthwaite , Alexander Graf , Paolo Bonzini , Sergey Fedorov , =?UTF-8?q?Alex=20Benn=C3=A9e?= , Richard Henderson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Sergey Fedorov Ensure direct jump patching in s390 is atomic by: * naturally aligning a location of direct jump address; * using atomic_read()/atomic_set() for code patching. Signed-off-by: Sergey Fedorov Signed-off-by: Sergey Fedorov --- Changes in v2: * Use QEMU_PTR_IS_ALIGNED() include/exec/exec-all.h | 2 +- tcg/s390/tcg-target.inc.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index 82399175fe80..e18cc24e50f0 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -320,7 +320,7 @@ static inline void tb_set_jmp_target1(uintptr_t jmp_addr, uintptr_t addr) { /* patch the branch destination */ intptr_t disp = addr - (jmp_addr - 2); - stl_be_p((void*)jmp_addr, disp / 2); + atomic_set((int32_t *)jmp_addr, disp / 2); /* no need to flush icache explicitly */ } #elif defined(__aarch64__) diff --git a/tcg/s390/tcg-target.inc.c b/tcg/s390/tcg-target.inc.c index fbf97bb2e15d..339df41cd300 100644 --- a/tcg/s390/tcg-target.inc.c +++ b/tcg/s390/tcg-target.inc.c @@ -219,6 +219,8 @@ typedef enum S390Opcode { RX_ST = 0x50, RX_STC = 0x42, RX_STH = 0x40, + + NOP = 0x0707, } S390Opcode; #ifndef NDEBUG @@ -1716,6 +1718,12 @@ static inline void tcg_out_op(TCGContext *s, TCGOpcode opc, case INDEX_op_goto_tb: if (s->tb_jmp_offset) { + /* branch displacement must be aligned for atomic patching; + * see if we need to add extra nop before branch + */ + if (!QEMU_PTR_IS_ALIGNED(s->code_ptr + 1, 4)) { + tcg_out16(s, NOP); + } tcg_out16(s, RIL_BRCL | (S390_CC_ALWAYS << 4)); s->tb_jmp_offset[args[0]] = tcg_current_code_size(s); s->code_ptr += 2;