kdump on ARM

M. Warner Losh imp at bsdimp.com
Wed Feb 17 17:08:45 UTC 2010


In message: <20100217152900.GX43625 at cicely7.cicely.de>
            Bernd Walter <ticso at cicely7.cicely.de> writes:
: On Wed, Feb 17, 2010 at 04:19:41PM +0100, Bernd Walter wrote:
: > On Wed, Feb 17, 2010 at 04:16:07PM +0100, Bernd Walter wrote:
: > > On Wed, Feb 17, 2010 at 02:54:05PM +0000, Rui Paulo wrote:
: > > > On 17 Feb 2010, at 14:18, Grzegorz Bernacki wrote:
: > > > I wonder if this can't be made non arm conditional?
: > 
: > Ups - I'd just recovered from Mr. Sandman's work.
: > So we all agree about.
: > Nevertheless it should be verified if this is just a faulty struct
: > definition.
: > On the other hand I think it is not because someone else wrote it is
: > a brokem on mips as well.
: 
: I'm really still sleeping - noone mentioned mips at all.
: > > Either this struct is properly aligned or not.
: > > So why should this be made conditional?
: > > Non strict alignment architecturs also have problems with this, but
: > > it is usualy just speed penalties.
: > > There is one ARM sepcific struct missalignment problem.
: > > In this case we usually add __packed macro to structure definition.
: > > For most structures this usually means no change on other
: > > archtitectures and we only declare the struct to forcibly be what the
: > > programmer already expected.
: > > Only a few programmers are aware that they expect something from
: > > structures, which is not garantied.

This code is clearly nutso when it comes to alignment.  I've come up
with a slightly better patch.  I'd though about doing the structure
assignment that I suggested in a prior note, but the compiler is free
to assume alignment when copying the structures, which may end badly.
There's no way we can add __packed or __aligned easily to this code
(although the ktrstat and ktrsockaddr routines should be able to have
that annotation, a quick test suggests that the annotations I tried
didn't take right).

I don't have a good ARM setup at the moment to actually test these
changes.  Can others test them?  They seem to work for me on x86, but
that isn't saying much.

Warner

Index: kdump.c
===================================================================
--- kdump.c	(revision 203976)
+++ kdump.c	(working copy)
@@ -1328,6 +1328,8 @@
 	char *name, *data;
 	size_t namelen, datalen;
 	int i;
+	struct stat sb;
+	struct sockaddr_storage ss;
 
 	for (name = buf, namelen = 0;
 	     namelen < buflen && name[namelen] != '\0';
@@ -1348,12 +1350,16 @@
 	if (strcmp(name, "stat") == 0) {
 		if (datalen != sizeof(struct stat))
 			goto invalid;
-		ktrstat((struct stat *)data);
+		memcpy(&sb, data, datalen);
+		ktrstat(&sb);
 	} else if (strcmp(name, "sockaddr") == 0) {
+		if (datalen > sizeof(ss))
+			goto invalid;
+		memcpy(&ss, data, datalen);
 		if (datalen < sizeof(struct sockaddr) ||
-		    datalen != ((struct sockaddr *)(data))->sa_len)
+		    datalen != ss.ss_len)
 			goto invalid;
-		ktrsockaddr((struct sockaddr *)data);
+		ktrsockaddr((struct sockaddr *)&ss);
 	} else {
 		printf("unknown structure\n");
 	}


More information about the freebsd-arm mailing list