Hi,
At what condition MPC7447A will generate Decrementer exception? From the user manual, I just found two conditions: value in DEC register reach to 0 (at next cycle, it will be 0xFFFFFFFF, e.g. the MSB will change from 0 to 1), and MSR[EE] (bit 16) should be 1.
All these two conditions are there, but I can't see the decrementer exception run. I cleaned memory section 0x900 ~ 0xa00 to all zeros and erase flash section 0xFFF00000 ~ 0xFFFFFFFF to all 0xFFs. MSR = 0xa030 (MSR[EE] = 1). Nothing happened, shell still there and commands can work as usrual. Even I set DEC register to 0 in the shell, still can't crash CPU.
Following are data in 0x900:
00000900: 7e9043a6 7eb143a6 7e800026 3aa1ff00 ~.C.~.C.~..&:...
00000910: 929500a8 92d50068 92f5006c 7e9042a6 .......h...l~.B.
00000920: 92950060 7ed142a6 92d50064 7e8802a6 ...`~.B....d~...
00000930: 929500a0 7ec902a6 92d5009c 7e8102a6 ....~.......~...
00000940: 929500a4 7eda02a6 7efb02a6 90150010 ....~...~.......
00000950: 90350014 90550018 90350000 7ea1ab78 .5...U...5..~..x
00000960: 9075001c 90950020 90b50024 90d50028 .u..... ...$...(
00000970: 806e8014 7c6803a6 38610010 3a801002 .n..|h..8a..:...
00000980: 52f40672 4e800021 00fcf4dc 00fbb2a8 R..rN..!........
and the data in 0x988 is the ISR function pointer. I can use go command to run this ISR (go 0xFCF4DC), and ISR runs as what I want.
following are data in 0xFFF00900:
fff00900: 7e9043a6 7eb143a6 7e800026 3aa1ff00 ~.C.~.C.~..&:...
fff00910: 929500a8 92d50068 92f5006c 7e9042a6 .......h...l~.B.
fff00920: 92950060 7ed142a6 92d50064 7e8802a6 ...`~.B....d~...
fff00930: 929500a0 7ec902a6 92d5009c 7e8102a6 ....~.......~...
fff00940: 929500a4 7eda02a6 7efb02a6 90150010 ....~...~.......
fff00950: 90350014 90550018 90350000 7ea1ab78 .5...U...5..~..x
fff00960: 9075001c 90950020 90b50024 90d50028 .u..... ...$...(
fff00970: 806e8014 7c6803a6 38610010 3a801002 .n..|h..8a..:...
fff00980: 52f40672 4e800021 000164dc 000022a8 R..rN..!..d...".
same as data in 0x900, except 0x988 and 0x98c. seems right.
What else can I do?
wyu
On 11/14/05, Yu Weiping <wyu120@gmail.com> wrote:
I think Decrementer runs because every time I read the DEC register (SPR 22), different value returned.
In the timer_interrupt, set_dec(decrementer_count) was called to reload the value of DEC register. I also tried to change decrementer_count value to 100, and then the value of DEC register I read out will always smaller than 100 (I tried many times). if I mask the call of set_dec in timer_interrupt, then I can read out big values (such as 0xFxxxxxxx, 0xExxxxxxx) for the DEC register. From this test, I guess the timer_interrupt was called after the exception generated. But the value of timestamp always be 0. It's hard to believe since in timer_interrupt, after calling set_dec, timestamp++ should be excuted.