We have a firm bitstream design that works well with registers defined at 0x8000_0000 and up. My PS application contains many routines that access our defined PL registers. At random times a Data Abort Exception will occur with the offending address provided as one of the PL registers. The problem is that the routines that accesses the PL register aren't passing any data between routines, i.e. the data is constant as are the addresses so the possibility of a bad address or unaligned access is slim to none.
For example, a UART contained in the PL is accessed by several 32 bit registers mapped to 0x8000_1000, 0x8000_1004 and 0x8000_1008. The code in the PS defines pointers of
long * reg_1000 = (long *) 0x8000_1000;
long * reg_1004 = (long *) 0x8000_1004;
long * reg_1008 = (long *) 0x8000_1008;
Reading or writing the registers in the code using the pointers works just fine...90% of the time. Sometimes executing the program on the PS causes the Data Abort Exception out of the blue and I've run out of ideas to figure why or how to prevent this. Any clues?