Hi Pete: I forgot that I'm overwriting the RAM-based exception vectors. Earlier I had disabled interrupts in the CP0 status register bit 0, but Linux actually needs them enabled... :) So, I changed my test to start at base address 0x80001000, but I still get the same failure at the same RAM location. Also important to mention is that my bootloader is executing from flash ROM, and my initialization is very similar to the YAMON initialization file that comes with the DbAu1500 eval board. Here's what my code is like: // in __main failures = (int)loader_memcheck((UINT32)0xA0001000, (UINT32)0xA4000000, 0xAAAAAAAA); failures = (int)loader_memcheck((UINT32)0xA0001000, (UINT32)0xA4000000, 0x55555555); failures = (int)loader_memcheck((UINT32)0x80001000, (UINT32)0x84000000, 0xAAAAAAAA); // Try to invalidate cache and go again failures = (int)loader_memcheck((UINT32)0x80001000, (UINT32)0x84000000, 0xAAAAAAAA); .... static unsigned int loader_memcheck( UINT32 base_addr, UINT32 max_addr, UINT32 test_data) { for (i = base_addr; i < max_addr; i=i+4) { *((unsigned int *)i) = test_data; } failures = 0; first_failure = 0xffffffff; for (i = base_addr; i < max_addr; i=i+4) { if (*((unsigned int *)i) != test_data) { if ((unsigned int)i < (unsigned int)first_failure) { first_failure = i; } ++failures; } } // if failures !=0 print_hex(first_failure) return failures; } So, after I execute this code, I pull up the EJTAG debugger, and poke around. I notice that even though the C code says that the first failure is at 0x8000fe50, but when I poke around, I find: ... (gdb) p/x *(0x8000fe04) $27 = 0xaaaaaaaa (gdb) p/x *(0x8000fe08) $28 = 0x10fe0080 (gdb) p/x *(0x8000fe10) $29 = 0x38000000 ... It seems like I'm having some cache coherency issues, since the results while executing code are quite differenet. Thanks for your help, Pete! -Jeff On Wed, May 14, 2003 at 03:34:01PM -0700, Pete Popov wrote: > On Wed, 2003-05-14 at 15:26, Jeff Baitis wrote: > > Hi all: > > > > I implemented memory tests in my bootloader code for the AU1500. I'm trying > > to figure out why Linux boots when loaded into cached KSEG0 (0x 80c0 0000), > > but my memory test FAILS for this same region. > > > > (pretty backwards huh? get linux booting, then write memory tests!) > > > > > > I start by writing 0x5555 5555 to all of uncached memory, reading it back, and > > I write 0xAAAA AAAA to all of uncached memory and read it back. > > > > This works great. > > > > Next, I try to write 0x5555 5555 to cached KSEG0 memory, and it fails at addr > > 0x8000FE50. But Linux boots! > > You're not overwriting any of the boot exception vectors, right? What's > the failure exactly and how does the test work? > > Pete > > > I'm not issuing SYNC commands when writing to cached memory; could this be > > the problem? > > > > We've exhaustively verified the memory burst parameters, etc. They look good. > > > > Thank you in advance for your ideas! > > > > Regards, > > Jeff > -- Jeffrey Baitis - Associate Software Engineer Evolution Robotics, Inc. 130 West Union Street Pasadena CA 91103 tel: 626.535.2776 | fax: 626.535.2777 | baitisj@evolution.com