[parisc-linux] Unaligned trap handler - comments appreciated

Helge Deller deller@gmx.de
Sat, 23 Jun 2001 14:31:53 +0200


Hi Randolph,

I've tested your changes on a 32bit kernel:

c3000:~/unaligned# uname -a
Linux c3000 2.4.0-pa37 #1 Sam Jun 23 11:42:43 CEST 2001 parisc unknown
c3000:~/unaligned# gcc unaligned.c
c3000:~/unaligned# ./a.out
Bus error

In the syslog:
Jun 23 14:26:36 c3000 kernel: a.out(3225): unaligned access to 0xbff00649 at 
ip=0x000104fb

Greetings,
Helge

On Saturday 23 June 2001 08:54, Randolph Chung wrote:
> In reference to a message from Randolph Chung, dated Jun 18:
> > I just checked in an arch/parisc/kernel/unaligned.c file into palinux
> > cvs.
>
> I've updated traps.c to call the unaligned handler now. Many thanks to
> jsm for his help and advice.
>
> I've only tested this for parisc64, would appreciate if someone can test
> to make sure it works on a narrow kernel as well. My test case looks
> something like this:
>
>
> #include <stdio.h>
>
> struct data_t {
>         unsigned long a;
>         unsigned long b;
> };
>
> int main(int argc, char **argv)
> {
>         struct data_t data;
>         unsigned char *t;
>         unsigned long l;
>         int i;
>
>         data.a = 0x12345678;
>         data.b = 0x87654321;
>
>         t = (unsigned char *)(&data)+1;
>         l = *((unsigned long *)t);
>         printf("l = 0x%08lx\n\n\n", l);
>
>         printf("expected result is: 0x");
>         for (i = 0; i < sizeof(unsigned long); i++)
>                 printf("%x", *(t+i));
>         printf("\n");
>
>         printf("testing store...\n");
>         *((unsigned long *)t) = 0x13572468;
>
>         l = *((unsigned long *)t);
>         printf("l = 0x%08lx\n", l);
>
>         return 0;
> }
>
> randolph