Subject: Data Abort Exceptions
To: None <port-arm@netbsd.org>
From: Jay Monkman <jtm@smoothsmoothie.com>
List: port-arm
Date: 07/22/2002 11:37:06
I'm trying to figure out how NetBSD handles misaligned data accesses
on the ARM, and from what I can see, it doesn't. There'a a comment in 
arm32/fault.c : data_abort_handler():
        case FAULT_ALIGN_0:              /* Alignment Fault */
        case FAULT_ALIGN_1:              /* Alignment Fault */
                /*
                 * Really this should just kill the process.
                 * Alignment faults are turned off in the kernel
                 * in order to get better performance from shorts with
                 * GCC so an alignment fault means somebody has played
                 * with the control register in the CPU. Might as well
                 * panic as the kernel was not compiled for aligned
		 accesses.
                 */

How can this work? What if someone wants to compile an application 
something like the following:
        typedef struct {
             char c  __attribute__ ((packed));
             long l  __attribute__ ((packed));
        } foo_t;


        void func1(void);
        void func2(long *p);

        void func1(void)
        {
             foo_t foo;

             foo.c = 'a';
             foo.l = 0x12345678;

             func2(&foo.l);
        }

        void func2(long *p)
        {
             printf("%p : %x\n", p, *p);
        }

        int main(void)
        {
             func1();
        }

Isn't this guaranteed to cause a data abort? Does NetBSD just kill the 
process that does it?


-- 
Jay Monkman         The truth knocks on the door and you say "Go away, I'm 
                    looking for the truth," and so it goes away. Puzzling.
                     - from _Zen_and_the_Art_of_Motorcycle_Maintenance_