NetBSD Problem Report #55778

From www@netbsd.org  Mon Nov  2 13:35:29 2020
Return-Path: <www@netbsd.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(Client CN "mail.NetBSD.org", Issuer "mail.NetBSD.org CA" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id 74CC91A9239
	for <gnats-bugs@gnats.NetBSD.org>; Mon,  2 Nov 2020 13:35:29 +0000 (UTC)
Message-Id: <20201102133528.5C16B1A9243@mollari.NetBSD.org>
Date: Mon,  2 Nov 2020 13:35:28 +0000 (UTC)
From: tworaz@tworaz.net
Reply-To: tworaz@tworaz.net
To: gnats-bugs@NetBSD.org
Subject: evbarm64 GENERIC64 kernel fails to build with clang
X-Send-Pr-Version: www-1.0

>Number:         55778
>Category:       port-evbarm
>Synopsis:       evbarm64 GENERIC64 kernel fails to build with clang
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    port-evbarm-maintainer
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Nov 02 13:40:00 +0000 2020
>Closed-Date:    Tue Nov 03 20:39:47 +0000 2020
>Last-Modified:  Tue Nov 03 20:40:01 +0000 2020
>Originator:     Piotr Tworek
>Release:        trunk
>Organization:
>Environment:
Linux hawk 5.9.2 #1 SMP Thu Oct 29 12:35:39 CET 2020 x86_64 AMD Ryzen 5 3600 6-Core Processor AuthenticAMD GNU/Linux
>Description:
Trying to build evbarm64 GENERIC64 kernel with clang I see the following error message:

/home/tworaz/devel/netbsd/sys/arch/aarch64/aarch64/aarch64_machdep.c:174:2: error: value size does not match register size specified by the constraint and modifier [-Werror,-Wasm-operand-widths]
        isb();
        ^
./arm/cpufunc.h:72:55: note: expanded from macro 'isb'
        __asm __volatile("mcr p15, 0, %0, c7, c5, 4" :: "r" (0) : "memory")
                                                             ^
/home/tworaz/devel/netbsd/sys/arch/aarch64/aarch64/aarch64_machdep.c:174:2: note: use constraint modifier "w"
./arm/cpufunc.h:72:32: note: expanded from macro 'isb'
        __asm __volatile("mcr p15, 0, %0, c7, c5, 4" :: "r" (0) : "memory")
                                      ^
1 error generated.

This is a regression caused by: https://github.com/NetBSD/src/commit/b9c6da0c271a71cae0483685361bcd0edd8db6a3

The problem happens because wrong version of dsb/dmb/isb macros from sys/arch/arm/include/cpufunc.h are used. It happens because when using clang on aarch64 _ARM_ARCH_7 is not being defined. This should happen in sys/arch/arm/include/cdefs.h, due to following code:

#if defined (__ARM_ARCH_8A__) || defined (__ARM_ARCH_8A)
	/* __ARM_ARCH_8A__ is a typo */
#define _ARM_ARCH_8
#endif

#if defined (_ARM_ARCH_8) || defined (__ARM_ARCH_7__) || \
    defined (__ARM_ARCH_7A__) || defined (__ARM_ARCH_7R__) || \
    defined (__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__)
	/* 7R, 7M, 7EM are for non MMU arms */
#define _ARM_ARCH_7
#endif

The problem is aarch64 clang port does not device __ARM_ARCH_8A__ as it does on arm. It does however define _ARM_ARCH=8.

__ARM_ARCH_8A__ is defined by clang/arm here:
https://github.com/llvm-mirror/clang/blob/master/lib/Basic/Targets/ARM.cpp#L603

_ARM_ARCH=8 is defined bt clang/aarch64 here:
https://github.com/llvm-mirror/clang/blob/master/lib/Basic/Targets/AArch64.cpp#L170
>How-To-Repeat:
Try building evbarm64 GENERIC64 kernel with clang using later trunk version of NetBSD.
>Fix:
Apply the following patch:

--- a/sys/arch/arm/include/cdefs.h
+++ b/sys/arch/arm/include/cdefs.h
@@ -10,7 +10,8 @@
 #endif


-#if defined (__ARM_ARCH_8A__) || defined (__ARM_ARCH_8A)
+#if defined (__ARM_ARCH_8A__) || defined (__ARM_ARCH_8A) || \
+    (defined (__ARM_ARCH) && __ARM_ARCH == 8)
        /* __ARM_ARCH_8A__ is a typo */
 #define _ARM_ARCH_8
 #endif

>Release-Note:

>Audit-Trail:
From: "Nick Hudson" <skrll@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/55778 CVS commit: src/sys/arch/arm/include
Date: Tue, 3 Nov 2020 08:34:17 +0000

 Module Name:	src
 Committed By:	skrll
 Date:		Tue Nov  3 08:34:17 UTC 2020

 Modified Files:
 	src/sys/arch/arm/include: cdefs.h

 Log Message:
 The ARM C Language Extenstion document defines __ARCH_ARM as the integer
 macro indicating the current ARM instruction set.  Let's use it.

 PR/55778: evbarm64 GENERIC64 kernel fails to build with clang

 XXX Handle the fact that for an ARM architecture ARMvX.Y then,
 XXX __ARM_ARCH= X * 100 + Y. E.g. for ARMv8.1 __ARM_ARCH = 801.


 To generate a diff of this commit:
 cvs rdiff -u -r1.17 -r1.18 src/sys/arch/arm/include/cdefs.h

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

State-Changed-From-To: open->feedback
State-Changed-By: skrll@NetBSD.org
State-Changed-When: Tue, 03 Nov 2020 08:40:31 +0000
State-Changed-Why:
I commited a similar, but smaller change.  OK to close?


State-Changed-From-To: feedback->closed
State-Changed-By: skrll@NetBSD.org
State-Changed-When: Tue, 03 Nov 2020 20:39:47 +0000
State-Changed-Why:
Confirmed fixed. Thanks for the report.


From: Piotr Tworek <tworaz@tworaz.net>
To: gnats-bugs@netbsd.org, port-evbarm-maintainer@netbsd.org, 
	netbsd-bugs@netbsd.org, gnats-admin@netbsd.org, skrll@NetBSD.org
Cc: 
Subject: Re: port-evbarm/55778 (evbarm64 GENERIC64 kernel fails to build
 with clang)
Date: Tue, 03 Nov 2020 21:36:06 +0100

 Yes, the comitted fix does the trick. Thanks!

>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.46 2020/01/03 16:35:01 leot Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2020 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.