From owner-freebsd-arm@FreeBSD.ORG Wed Feb 17 14:18:15 2010 Return-Path: Delivered-To: freebsd-arm@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4B1551065670 for ; Wed, 17 Feb 2010 14:18:15 +0000 (UTC) (envelope-from gjb@semihalf.com) Received: from smtp.semihalf.com (smtp.semihalf.com [213.17.239.109]) by mx1.freebsd.org (Postfix) with ESMTP id E82238FC15 for ; Wed, 17 Feb 2010 14:18:14 +0000 (UTC) Received: from localhost (unknown [213.17.239.109]) by smtp.semihalf.com (Postfix) with ESMTP id DA9F9C427D for ; Wed, 17 Feb 2010 15:20:06 +0100 (CET) X-Virus-Scanned: by amavisd-new at semihalf.com Received: from smtp.semihalf.com ([213.17.239.109]) by localhost (smtp.semihalf.com [213.17.239.109]) (amavisd-new, port 10024) with ESMTP id 0d-tWMiHAAMT for ; Wed, 17 Feb 2010 15:20:06 +0100 (CET) Received: from [10.0.0.75] (cardhu.semihalf.com [213.17.239.108]) by smtp.semihalf.com (Postfix) with ESMTPA id 219D4C41E7 for ; Wed, 17 Feb 2010 15:20:06 +0100 (CET) Message-ID: <4B7BFAA4.4040607@semihalf.com> Date: Wed, 17 Feb 2010 15:18:12 +0100 From: Grzegorz Bernacki User-Agent: Thunderbird 2.0.0.16 (X11/20090618) MIME-Version: 1.0 To: freebsd-arm@freebsd.org Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: kdump on ARM X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting FreeBSD to the StrongARM Processor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Feb 2010 14:18:15 -0000 Hi, I've noticed that kdump on ARM doesn't work properly, it generates bus error. The problem is that structures dumped into ktrace.out are not aligned. Processing such a structure causes Aligment Fault. One solution is to copy structure into local variable and then process it, please see patch below. But I am not sure if this is the best solution and maybe someone has a better idea. grzesiek diff --git a/usr.bin/kdump/kdump.c b/usr.bin/kdump/kdump.c index 386221e..5a15886 100644 --- a/usr.bin/kdump/kdump.c +++ b/usr.bin/kdump/kdump.c @@ -1325,6 +1325,10 @@ ktrstat(struct stat *statp) void ktrstruct(char *buf, size_t buflen) { +#if defined(__arm__) + struct stat stat; + struct sockaddr sockaddr; +#endif char *name, *data; size_t namelen, datalen; int i; @@ -1348,12 +1352,22 @@ ktrstruct(char *buf, size_t buflen) if (strcmp(name, "stat") == 0) { if (datalen != sizeof(struct stat)) goto invalid; +#if defined(__arm__) + memcpy(&stat, data, sizeof(struct stat)); + ktrstat(&stat); +#else ktrstat((struct stat *)data); +#endif } else if (strcmp(name, "sockaddr") == 0) { if (datalen < sizeof(struct sockaddr) || datalen != ((struct sockaddr *)(data))->sa_len) goto invalid; +#if defined(__arm__) + memcpy(&sockaddr, data, sizeof(struct sockaddr)); + ktrsockaddr(&sockaddr); +#else ktrsockaddr((struct sockaddr *)data); +#endif } else { printf("unknown structure\n"); }