kdump on ARM
Grzegorz Bernacki
gjb at semihalf.com
Wed Feb 17 14:18:15 UTC 2010
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");
}
More information about the freebsd-arm
mailing list