Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp1950553imm; Thu, 24 May 2018 03:29:11 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpLOd8C5Mi+hq41m4k6W7zsAeuu7lLrlggRujDl6+QQ3vQiFC7FLxgJCFdmrKtRwO5nWUHp X-Received: by 2002:a65:4204:: with SMTP id c4-v6mr5273641pgq.26.1527157751320; Thu, 24 May 2018 03:29:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527157751; cv=none; d=google.com; s=arc-20160816; b=rrK/29DUSPpFTJiN37UMD4Op6z8o0DnYshn2xgCxkkyCOOI1epcDmHJ73rIVhC3sOT BPNQqHVl12agbZtJRMF8tDw3O3DPU5W+dtDPdIpHzUHI44Xyhe6aIH5x92GnZTockPMV OKwKlw/pCI3iAlVMRUXvXpetit/rbu6dWhszSJtg2xIjrU3jf8Z7Qqm6v/+qI6wvUaTI uX1838MonIxACq8SKHQIFm9vPMQBO1Idr5kle0AxZb4aU9wKqAULMQVjnulFMNqTLKP+ DarYXyodpBgIAIvhbyYLmF6BObAyOAr8nNrXyR4BqAQNliJ2VF667Rlzdt/8Sifu+HxL O3TA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=rUChubLUzqqRAVqrzfnacIzAz65zjCWbAqQVngomVrM=; b=dA5AVHKh1zUtQDEP6Oaz+izICXiDNaCaEElQhMP34OQFwVVoAcT7RS9RlDfMR/Ownz 2HhMxTmWjH5dJp93WKeVXYNdFhko0UqWcEJ3CH4oxDm65+HUTUX+h58jVq5y1nmU7NAX l9PjaUv0cEpfmVMcy2VYNjju9HPW+GTU4Y61QinU6+b4k7d2SJOk9I0lMlVbFTQ60yZx MPbDJC7kYwEon5fGoHM5fNEkhGEznFCZRAVaRQ7G5PRX6aNj5SGv9MHTd9VVDnCXoMEO hJSfgYan683WCby+gWNsCM6/x3fEiQ0H77kaoXopOb6ghttbEYm/KeRz1HGTZWvYSCM1 11Fg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=vOFyS/g8; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i73-v6si21866152pfe.27.2018.05.24.03.28.56; Thu, 24 May 2018 03:29:11 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=vOFyS/g8; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030947AbeEXKB2 (ORCPT + 99 others); Thu, 24 May 2018 06:01:28 -0400 Received: from mail.kernel.org ([198.145.29.99]:46282 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030914AbeEXKBP (ORCPT ); Thu, 24 May 2018 06:01:15 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id E91AC20890; Thu, 24 May 2018 10:01:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527156074; bh=EUDLvUGvVvU6QWrT3Euia3kwcsQVHurDUEBFE1VNc50=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vOFyS/g8GoRLpHVqIRk2rVFuf97+5/D1hY6yUTwtpd8vIigSyuBQ3Iq7+WQH6jMf0 C059ABGsk6rnQHbYlHzutveqeFBFBGDwPc8r/Zbxh146sXp67jNIZiru8QxOR1Aq/m ouccgvvTrGjwFBMpk4JSyCWr3Fk897bcAqFO4JUc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Greg Kroah-Hartman , Martin Schwidefsky , Vasily Gorbik Subject: [PATCH 4.16 053/161] s390: add assembler macros for CPU alternatives Date: Thu, 24 May 2018 11:37:58 +0200 Message-Id: <20180524093024.812635901@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180524093018.331893860@linuxfoundation.org> References: <20180524093018.331893860@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.16-stable review patch. If anyone has any objections, please let me know. ------------------ From: Martin Schwidefsky [ Upstream commit fba9eb7946251d6e420df3bdf7bc45195be7be9a ] Add a header with macros usable in assembler files to emit alternative code sequences. It works analog to the alternatives for inline assmeblies in C files, with the same restrictions and capabilities. The syntax is ALTERNATIVE "", \ "", \ "" and ALTERNATIVE_2 "", \ "", \ "", "", \ "" Reviewed-by: Vasily Gorbik Signed-off-by: Martin Schwidefsky Signed-off-by: Greg Kroah-Hartman --- arch/s390/include/asm/alternative-asm.h | 108 ++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 arch/s390/include/asm/alternative-asm.h --- /dev/null +++ b/arch/s390/include/asm/alternative-asm.h @@ -0,0 +1,108 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _ASM_S390_ALTERNATIVE_ASM_H +#define _ASM_S390_ALTERNATIVE_ASM_H + +#ifdef __ASSEMBLY__ + +/* + * Check the length of an instruction sequence. The length may not be larger + * than 254 bytes and it has to be divisible by 2. + */ +.macro alt_len_check start,end + .if ( \end - \start ) > 254 + .error "cpu alternatives does not support instructions blocks > 254 bytes\n" + .endif + .if ( \end - \start ) % 2 + .error "cpu alternatives instructions length is odd\n" + .endif +.endm + +/* + * Issue one struct alt_instr descriptor entry (need to put it into + * the section .altinstructions, see below). This entry contains + * enough information for the alternatives patching code to patch an + * instruction. See apply_alternatives(). + */ +.macro alt_entry orig_start, orig_end, alt_start, alt_end, feature + .long \orig_start - . + .long \alt_start - . + .word \feature + .byte \orig_end - \orig_start + .byte \alt_end - \alt_start +.endm + +/* + * Fill up @bytes with nops. The macro emits 6-byte nop instructions + * for the bulk of the area, possibly followed by a 4-byte and/or + * a 2-byte nop if the size of the area is not divisible by 6. + */ +.macro alt_pad_fill bytes + .fill ( \bytes ) / 6, 6, 0xc0040000 + .fill ( \bytes ) % 6 / 4, 4, 0x47000000 + .fill ( \bytes ) % 6 % 4 / 2, 2, 0x0700 +.endm + +/* + * Fill up @bytes with nops. If the number of bytes is larger + * than 6, emit a jg instruction to branch over all nops, then + * fill an area of size (@bytes - 6) with nop instructions. + */ +.macro alt_pad bytes + .if ( \bytes > 0 ) + .if ( \bytes > 6 ) + jg . + \bytes + alt_pad_fill \bytes - 6 + .else + alt_pad_fill \bytes + .endif + .endif +.endm + +/* + * Define an alternative between two instructions. If @feature is + * present, early code in apply_alternatives() replaces @oldinstr with + * @newinstr. ".skip" directive takes care of proper instruction padding + * in case @newinstr is longer than @oldinstr. + */ +.macro ALTERNATIVE oldinstr, newinstr, feature + .pushsection .altinstr_replacement,"ax" +770: \newinstr +771: .popsection +772: \oldinstr +773: alt_len_check 770b, 771b + alt_len_check 772b, 773b + alt_pad ( ( 771b - 770b ) - ( 773b - 772b ) ) +774: .pushsection .altinstructions,"a" + alt_entry 772b, 774b, 770b, 771b, \feature + .popsection +.endm + +/* + * Define an alternative between two instructions. If @feature is + * present, early code in apply_alternatives() replaces @oldinstr with + * @newinstr. ".skip" directive takes care of proper instruction padding + * in case @newinstr is longer than @oldinstr. + */ +.macro ALTERNATIVE_2 oldinstr, newinstr1, feature1, newinstr2, feature2 + .pushsection .altinstr_replacement,"ax" +770: \newinstr1 +771: \newinstr2 +772: .popsection +773: \oldinstr +774: alt_len_check 770b, 771b + alt_len_check 771b, 772b + alt_len_check 773b, 774b + .if ( 771b - 770b > 772b - 771b ) + alt_pad ( ( 771b - 770b ) - ( 774b - 773b ) ) + .else + alt_pad ( ( 772b - 771b ) - ( 774b - 773b ) ) + .endif +775: .pushsection .altinstructions,"a" + alt_entry 773b, 775b, 770b, 771b,\feature1 + alt_entry 773b, 775b, 771b, 772b,\feature2 + .popsection +.endm + +#endif /* __ASSEMBLY__ */ + +#endif /* _ASM_S390_ALTERNATIVE_ASM_H */