kdump on ARM

Hans Petter Selasky hselasky at c2i.net
Wed Feb 17 14:44:08 UTC 2010


On Wednesday 17 February 2010 15:18:12 Grzegorz Bernacki wrote:
> 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");
>          }

I think more than ARM is affected by this.

--HPS


More information about the freebsd-arm mailing list