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:
(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.