From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-4.0 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id AE4081F45E for ; Mon, 10 Feb 2020 19:22:16 +0000 (UTC) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; q=dns; s=default; b=hAVVQcYMXr3csUjl8O4nB2f38kcw50p OUx1ts+UjH2s05JjT6kgIr6agGJdNbXnoiOXL01uWUDzy6LhlGlEDgIBMFmrrRRt rlrNhlwvkdw63c8pJteK+ephqd/gPWzacfkwI+glZJ0R1nPr2MvsH9t3j/NYZCps JRIIOsYjAbXc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:in-reply-to :references; s=default; bh=tDJrY8owYzwtY1MOTc7RnnEbL8A=; b=vwr5Y KBVxlpOjpzw8JY1Ubf+jp7068jCddfHewWaCI77AuMS5itO05qq2RTuIuVVrb2ad 2WMhUqI6TrAnuw8hvRQkcBO1iSJNdER9+6cZZkQljGaJ2qbq3/X/GjkG2nUFA2Ov pzJoESUH0RbwEKgV0Q+u+RW84o4Oo28kFy5yjw= Received: (qmail 100564 invoked by alias); 10 Feb 2020 19:20:59 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 100489 invoked by uid 89); 10 Feb 2020 19:20:58 -0000 Authentication-Results: sourceware.org; auth=none X-HELO: mail-qk1-f196.google.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references; bh=OxPe/gvmXUwBAz0kyif56UJkvk1vjT9jldofje5Hor8=; b=Zw9LQuF+QNG/zECrOa0O5BWSjABjGdGZcsql2bs7bc5hFL+nXIGh8X++A2XaA7hgcI ynJuV5ebbswH2Ry0IrED5esnh+X2VBU0sVxorJRHUdQYKaq6I1LChROzEDgqnE9hmd5a lgWIjtODqF9bnqUshJ0t++6pUFok9v+MyMvPCMCQbdM5HHPQ2Dh8k/PQUE82DRAfrNU0 GQIkc4KIVUqnqa0rFErcR+1mVLLbP44PwJCgfeK+NMQTGR0xiCZU9bzIneL5vFklYWAL bK2c/FRPciYXbgtje1kV0ZaxvdaD9I68W6xq7mz0TjZ9lcZL7Wl6gouKchNLyE2Cx6wK OVwg== From: Adhemerval Zanella To: libc-alpha@sourceware.org Subject: [PATCH 09/15] microblaze: Avoid clobbering register parameters in syscall Date: Mon, 10 Feb 2020 16:20:32 -0300 Message-Id: <20200210192038.23588-9-adhemerval.zanella@linaro.org> In-Reply-To: <20200210192038.23588-1-adhemerval.zanella@linaro.org> References: <20200210192038.23588-1-adhemerval.zanella@linaro.org> The microblaze INTERNAL_SYSCALL macro might clobber the register parameter if the argument itself might clobber any register (a function call for instance). This patch fixes it by using temporary variables for the expressions between the register assignments (as indicated by GCC documentation, 6.47.5.2 Specifying Registers for Local Variables). It is similar to the fix done for MIPS (BZ#25523). Checked with microblaze-linux-gnu and microblazeel-linux-gnu build. --- sysdeps/unix/sysv/linux/microblaze/sysdep.h | 63 ++++++++++++++------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/sysdeps/unix/sysv/linux/microblaze/sysdep.h b/sysdeps/unix/sysv/linux/microblaze/sysdep.h index ed873d9dd4..b4a6ee89f1 100644 --- a/sysdeps/unix/sysv/linux/microblaze/sysdep.h +++ b/sysdeps/unix/sysv/linux/microblaze/sysdep.h @@ -219,9 +219,10 @@ SYSCALL_ERROR_LABEL_DCL: \ # define inline_syscall1(name,arg1) \ ({ \ + long __arg1 = (long) (arg1); \ register long __ret __asm__("r3"); \ register long __r12 __asm__("r12") = name; \ - register long __r5 __asm__("r5") = (long)(arg1); \ + register long __r5 __asm__("r5") = __arg1; \ __asm__ __volatile__( "brki r14,8; nop;" \ : "=r"(__ret) \ : "r"(__r5), "r"(__r12) \ @@ -230,10 +231,12 @@ SYSCALL_ERROR_LABEL_DCL: \ # define inline_syscall2(name,arg1,arg2) \ ({ \ + long __arg1 = (long) (arg1); \ + long __arg2 = (long) (arg2); \ register long __ret __asm__("r3"); \ register long __r12 __asm__("r12") = name; \ - register long __r5 __asm__("r5") = (long)(arg1); \ - register long __r6 __asm__("r6") = (long)(arg2); \ + register long __r5 __asm__("r5") = __arg1; \ + register long __r6 __asm__("r6") = __arg2; \ __asm__ __volatile__( "brki r14,8; nop;" \ : "=r"(__ret) \ : "r"(__r5), "r"(__r6), "r"(__r12) \ @@ -243,11 +246,14 @@ SYSCALL_ERROR_LABEL_DCL: \ # define inline_syscall3(name,arg1,arg2,arg3) \ ({ \ + long __arg1 = (long) (arg1); \ + long __arg2 = (long) (arg2); \ + long __arg3 = (long) (arg3); \ register long __ret __asm__("r3"); \ register long __r12 __asm__("r12") = name; \ - register long __r5 __asm__("r5") = (long)(arg1); \ - register long __r6 __asm__("r6") = (long)(arg2); \ - register long __r7 __asm__("r7") = (long)(arg3); \ + register long __r5 __asm__("r5") = __arg1; \ + register long __r6 __asm__("r6") = __arg2; \ + register long __r7 __asm__("r7") = __arg3; \ __asm__ __volatile__( "brki r14,8; nop;" \ : "=r"(__ret) \ : "r"(__r5), "r"(__r6), "r"(__r7), "r"(__r12) \ @@ -257,12 +263,16 @@ SYSCALL_ERROR_LABEL_DCL: \ # define inline_syscall4(name,arg1,arg2,arg3,arg4) \ ({ \ + long __arg1 = (long) (arg1); \ + long __arg2 = (long) (arg2); \ + long __arg3 = (long) (arg3); \ + long __arg4 = (long) (arg4); \ register long __ret __asm__("r3"); \ register long __r12 __asm__("r12") = name; \ - register long __r5 __asm__("r5") = (long)(arg1); \ - register long __r6 __asm__("r6") = (long)(arg2); \ - register long __r7 __asm__("r7") = (long)(arg3); \ - register long __r8 __asm__("r8") = (long)(arg4); \ + register long __r5 __asm__("r5") = __arg1; \ + register long __r6 __asm__("r6") = __arg2; \ + register long __r7 __asm__("r7") = __arg3; \ + register long __r8 __asm__("r8") = __arg4; \ __asm__ __volatile__( "brki r14,8; nop;" \ : "=r"(__ret) \ : "r"(__r5), "r"(__r6), "r"(__r7), "r"(__r8),"r"(__r12) \ @@ -272,13 +282,18 @@ SYSCALL_ERROR_LABEL_DCL: \ # define inline_syscall5(name,arg1,arg2,arg3,arg4,arg5) \ ({ \ + long __arg1 = (long) (arg1); \ + long __arg2 = (long) (arg2); \ + long __arg3 = (long) (arg3); \ + long __arg4 = (long) (arg4); \ + long __arg5 = (long) (arg5); \ register long __ret __asm__("r3"); \ register long __r12 __asm__("r12") = name; \ - register long __r5 __asm__("r5") = (long)(arg1); \ - register long __r6 __asm__("r6") = (long)(arg2); \ - register long __r7 __asm__("r7") = (long)(arg3); \ - register long __r8 __asm__("r8") = (long)(arg4); \ - register long __r9 __asm__("r9") = (long)(arg5); \ + register long __r5 __asm__("r5") = __arg1; \ + register long __r6 __asm__("r6") = __arg2; \ + register long __r7 __asm__("r7") = __arg3; \ + register long __r8 __asm__("r8") = __arg4; \ + register long __r9 __asm__("r9") = __arg5; \ __asm__ __volatile__( "brki r14,8; nop;" \ : "=r"(__ret) \ : "r"(__r5), "r"(__r6), "r"(__r7), "r"(__r8),"r"(__r9), "r"(__r12) \ @@ -288,14 +303,20 @@ SYSCALL_ERROR_LABEL_DCL: \ # define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \ ({ \ + long __arg1 = (long) (arg1); \ + long __arg2 = (long) (arg2); \ + long __arg3 = (long) (arg3); \ + long __arg4 = (long) (arg4); \ + long __arg5 = (long) (arg5); \ + long __arg6 = (long) (arg6); \ register long __ret __asm__("r3"); \ register long __r12 __asm__("r12") = name; \ - register long __r5 __asm__("r5") = (long)(arg1); \ - register long __r6 __asm__("r6") = (long)(arg2); \ - register long __r7 __asm__("r7") = (long)(arg3); \ - register long __r8 __asm__("r8") = (long)(arg4); \ - register long __r9 __asm__("r9") = (long)(arg5); \ - register long __r10 __asm__("r10") = (long)(arg6); \ + register long __r5 __asm__("r5") = __arg1; \ + register long __r6 __asm__("r6") = __arg2; \ + register long __r7 __asm__("r7") = __arg3; \ + register long __r8 __asm__("r8") = __arg4; \ + register long __r9 __asm__("r9") = __arg5; \ + register long __r10 __asm__("r10") = __arg6; \ __asm__ __volatile__( "brki r14,8; nop;" \ : "=r"(__ret) \ : "r"(__r5), "r"(__r6), "r"(__r7), "r"(__r8),"r"(__r9), "r"(__r10), \ -- 2.17.1