Ticker problem on ppc405 - FIXED

Smith, Gene gene.smith at siemens.com
Mon Oct 18 23:49:53 UTC 2004


Figure out what the problem is but not why or how to correctly fix it. 
The problem was due statements like this for selecting code:

#if (PPC_USE_SPRG)
	do this way
#else
	do that way
#end

In file old_exception_processing/cpu.c "do that way" is selected, while
in old_exception_processing/irq_stub.S "do this way" is selected. The 
conflict resulted in some bad memory accesses.  I don't see anywhere 
that PPC_USE_SPRG is explicitly defined in the code except under 
build-rtems there is a automatically generated file bspopts.h that contains
#define PPC_USE_SPRG 1
But the file that (I think) controls this, bspopts.h.in, contains
#undef PPC_USE_SPRG

The kluge fix was to just add
#define PPC_USE_SPRG 0
in irq_stub.S so both files generate "do that way" code.

Anyhow, ticker now runs.

-gene


Gene Smith wrote, On 10/17/2004 11:46 PM:

> I have tried to run the ticker example with no changes. I can see that 
> it installs a interrupt handler for a Programmable Interval Timer (PIT) 
> called from the typical location 0x1000 (with EVPR set to 0). However, 
> when it actually runs I rarely see a vector to 0x1000. The first 
> interrupt that occurs is usually to location 0x200 which is a machine 
> check (bus error). When the machine check tries to branch to its actual 
> handler (in _ISR_Handler) it looks like it sees a zero pointer which in 
> turn causes a "Program" interrupt at location 0x700, which in turn 
> causes a branch to zero and another Program interrupt, ad infinitum.
> 
> I only see explicit handlers being installed for the UART (an external 
> interrupt which begins at location 0x500) and the PIT interrupt off of 
> location 0x1000. I don't see any real handler installed for Machine 
> Check or Program. I would assume these might be caught by a default 
> spurious handler but the "blrl" at irq_stub.S:150 branches to location 0 
> which just results in another Program exception.
> 
> The first Machine Check interrupt that gets the whole process going 
> stores in register SRR2 the value 0x5938 which is supposed to be the bus 
> error location. Location 0x5938 is actually an instruction in irq_stub.S 
> (part of _IRQ_Handler) but I don't see a problem there and putting a 
> breakpoint before location 0x5938 never hits before the first Machine 
> Check at 0x200.
> 
> One other observation: In old_exception_processing/cpu.c:508 where the 
> actual stwu_r1 value is compared to a template value they do appear to 
> be equal but for some reason the else condition is taken and 
> *old_handler is set to zero. This appears to be a possible compiler 
> error. (I am checking this with no optimization -O0 in powerpc-rtems-gcc.)
> 
> If anyone has an understanding of this code I would appreciate any 
> suggestions as to what is going wrong.
> 
> Thanks,
> -gene
> P/S: I can step through the code and see what is happening using the 
> Macraigor JTAG debugger with gdb/insight.
> Please reply to list.




More information about the users mailing list