SPARC LEON error: IU exception (tt = 0x2B, data store error)

0

Good morning, I need an help because I'm stuck and I cannot find any solution looking at the manuals.

I want to use EDAC on Leon3. I'm programming in C using the BCC compiler. In particular, I have a GR-UT699 board. I'm using GRMON to flash my elf file in the RAM. My program is a short test where I want to use the EDAC. To enable the EDAC I simple bitbang the registers in this way (I can say that I checked the register and they are correctly wroted):

#define MCFG2_RMW_bit_set   0x00000040  //enable read-modify-write cycles on sub-word writes to 16 and 32bit areas with common write strobe

#define MCFG2_DE_bit_set    0x00004000  //SDRAM controller (1 en, 0 dis)

#define MCFG3_R_bit_set 0x00000200  //enable EDAC checking of the SDRAM or SRAM  (1 en, 0 dis)

#define MCFG1_IE_bit_set    0x00080000  //enable access to mapped I/O memory.

...

    edac->MCFG1 = edac->MCFG1 | MCFG1_IE_bit_set;

    edac->MCFG2 = edac->MCFG2 | MCFG2_RMW_bit_set | MCFG2_DE_bit_set;

    edac->MCFG3 = edac->MCFG3 | MCFG3_R_bit_set;

    ...

    return 0;

}

these instructions are executed inside a init function which returns 0. I just set the bits which you can see in the previous defines.

When the function returns, I just want to call a printf() to show a message. The latter (the printf) output is never showed. So the program crashes after having set the register and before the printf. I think it crashes during the init function return.

these is the grmon console output:

grmon2> run

  IU exception (tt = 0x2B, data store error)

  0x40009acc: 81c3e008  retl    <memmove+484>



grmon2> inst

  TIME     ADDRESS   INSTRUCTION                   RESULT      SYMBOL

  2608062  40009978  andcc  %g1, %g3, %g0          [00000000]  memmove+0x90

  2608065  4000997C  be  0x40009AB0                [00000000]  memmove+0x94

  2608066  40009980  or  %g2, %o1, %g1             [40013FA0]  memmove+0x98

  2608067  40009AB0  mov  0, %g1                   [00000000]  memmove+0x1c8

  2608068  40009AB4  ldub  [%o1 + %g1], %g3        [0000002E]  memmove+0x1cc

  2608070  40009AB8  stb  %g3, [%g2 + %g1]         [40012EA0 2E2E2E2E]  memmove+0x1d0

  2608072  40009ABC  add  %g1, 1, %g1              [00000001]  memmove+0x1d4

  2608073  40009AC0  cmp  %g1, %o2                 [00000000]  memmove+0x1d8

  2608076  40009AC4  bne,a  0x40009AB8             [00000000]  memmove+0x1dc

  2608078  40009ACC  retl                          [  TRAP  ]  memmove+0x1e4

I saw that I needed to set the IE bit in the MCFG1 reg, and so I did. But the program still crashes. What is wrong here?

thanks in advance for your patience.

-Lorenzo

c
embedded
firmware
sparc
asked on Stack Overflow Jan 18, 2018 by Andak • edited Jan 19, 2018 by S.I.

1 Answer

0

I found at least one solution which does not produces a crash of the program. If you want to use EDAC you have to initialize the memory controller registers (from GRMON using "mcfgx 0xvalue etc" OR using -edac option when starting GRMON). Then a wash of the RAM shall be performed (use of the wash command from GRMON). It is important launch the wash command (or generally wash the memory from a firmware) after the EDAC has been enabled. In fact, if you wash the memory after the ENAC has been enabled the checkbits are generated. Otherwise you'll perform a simple memory clean.

Then you can finally load a program into the RAM (from grmon using "load").

It is important to notice that also IU/FPU register shall be cleared at reset, this can be done from MKPROM (if necessary).

This solution works for programs that are loaded in the RAM through GRMON. If is necessary to flash the programs into the flash ROM similar operation shall be performed by means of MKPROM. I have not done this yet but I hope is something really similar.

Lorenzo.

answered on Stack Overflow Jan 24, 2018 by Andak

User contributions licensed under CC BY-SA 3.0