From owner-freebsd-arm@FreeBSD.ORG Fri Dec 28 16:42:07 2012 Return-Path: Delivered-To: freebsd-arm@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 89708F7C for ; Fri, 28 Dec 2012 16:42:07 +0000 (UTC) (envelope-from aoyama@peach.ne.jp) Received: from moon.peach.ne.jp (moon.peach.ne.jp [203.141.148.98]) by mx1.freebsd.org (Postfix) with ESMTP id 0B07A8FC0A for ; Fri, 28 Dec 2012 16:42:05 +0000 (UTC) Received: from moon.peach.ne.jp (localhost [127.0.0.1]) by moon.peach.ne.jp (Postfix) with ESMTP id 649A539FA3; Sat, 29 Dec 2012 01:41:58 +0900 (JST) Received: from artemis (unknown [172.18.0.20]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by moon.peach.ne.jp (Postfix) with ESMTPSA id 4F0C839D5E; Sat, 29 Dec 2012 01:41:58 +0900 (JST) Message-ID: <9ED42265200A41B1BD637682720E0E9D@ad.peach.ne.jp> From: "Daisuke Aoyama" To: "Daisuke Aoyama" References: <2BA73CBF02B04DD19D08CDFC556B8750@ad.peach.ne.jp> <1356624694.1144.67.camel@revolution.hippie.lan> <234E1E18AC1C4A3985D6C570F78698E6@ad.peach.ne.jp> In-Reply-To: <234E1E18AC1C4A3985D6C570F78698E6@ad.peach.ne.jp> Subject: Re: FreeBSD/armv6z/clang on Raspberry Pi 512MB (with U-Boot + ubldr) Date: Sat, 29 Dec 2012 01:41:53 +0900 MIME-Version: 1.0 Content-Type: text/plain; format=flowed; charset="iso-8859-1"; reply-type=response Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority: Normal Importance: Normal X-Mailer: Microsoft Windows Live Mail 14.0.8117.416 X-MimeOLE: Produced By Microsoft MimeOLE V14.0.8117.416 X-Virus-Scanned: ClamAV using ClamSMTP Cc: freebsd-arm@freebsd.org X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Porting FreeBSD to the StrongARM Processor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 28 Dec 2012 16:42:07 -0000 >>> This is complete version of systimer patch. >>> It should fix stopping interrupt and related things such as USB LAN is >>> unstable, >>> SSH is closed suddenly. >>> (I've not yet finished all test at this time, but at least portsnap >>> fetch is >>> success. >>> Now extracting the ports without any problems.) Finished without any problems. I'm checking the alignment of clang now. It seems no difference of location of data structure. However, access method is different. I learned clang will combine two loads into one op. This is a reason why the alignment seems difference between clang and gcc. Also, a reason why clang binary is smaller than gcc code. According to ARM manual, strd alignment is: "The address must be a multiple of eight for doubleword transfers." uboot/lib/api_public.h: ---------------------------------------------------------------------- struct sys_info { unsigned long clk_bus; unsigned long clk_cpu; unsigned long bar; struct mem_region *mr; /* << mr offset is 12!! (not DW aligned) */ int mr_no; /* number of memory regions */ }; uboot/lib/glue.c: ---------------------------------------------------------------------- struct sys_info * ub_get_sys_info(void) { int err = 0; memset(&si, 0, sizeof(struct sys_info)); si.mr = mr; si.mr_no = UB_MAX_MR; memset(&mr, 0, sizeof(mr)); if (!syscall(API_GET_SYS_INFO, &err, (u_int32_t)&si)) return (NULL); return ((err) ? NULL : &si); } ---------------------------------------------------------------------- clang -O2 output (7 steps): bl memset ; ATPCS uses r0-r3 as parameters ldr r0, .LCPI6_1 ; mr mov r1, #5 ; UB_MAX_MR mov r2, #60 ; sizeof(mr) strd r0, r1, [r5, #12] ; r5 aligned but strd requires DW(8byte) alignment (faulted here) mov r1, #0 bl memset ; memset(&mr, 0, sizeof(mr)); clang final binary size(2.8% smaller): -rwxr-xr-x 1 root wheel 235984 Dec 28 23:49 ubldr ---------------------------------------------------------------------- gcc 4.2 -O2 output (9 steps): bl memset ; ATPCS uses r0-r3 as parameters ldr ip, .L162+4 ; mr mov r3, #5 ; UB_MAX_MR mov r1, r4 ; r4 is zero mov r0, ip ; << what?? mov r2, #60 ; sizeof(mr) str r3, [r6, #16] ; r6 aligned same as clang str ip, [r6, #12] ; r6 aligned same as clang bl memset ; memset(&mr, 0, sizeof(mr)); gcc final binary size: -rwxr-xr-x 1 root wheel 242810 Dec 28 18:22 ubldr ---------------------------------------------------------------------- I don't know gcc 4.3 or newer, but probably output is more smart. It seems that there is no reason to use ip in this case. Does any one know how to prevent above clang output? (or how to solve this issue for all codes.) Thanks -- Daisuke Aoyama