> -----Original Message-----
> From: Zach Welch [mailto:z...@superlucidity.net]
> Sent: vrijdag 12 juni 2009 10:39
> To: Nico Coesel
> Cc: David Claffey; openocd-development
> Subject: Re: [Openocd-development] mips32 big endian fix
> 
> On Fri, 2009-06-12 at 09:55 +0200, Nico Coesel wrote:
> > > -----Original Message-----
> > > From: openocd-development-boun...@lists.berlios.de
[mailto:openocd-
> > > development-boun...@lists.berlios.de] On Behalf Of David Claffey
> > > Sent: donderdag 11 juni 2009 23:18
> > > To: openocd-development
> > > Subject: [Openocd-development] mips32 big endian fix
> > >
> > > A patch is needed for MIPS big endian (elf32-tradbigmips) targets.
> > Perhaps
> > > I'm the first to test trunk with a MIPS big endian target.
> > >
> > > If "-endian big" is not set in target create, the endianess
defaults
> > to
> > > little.
> > >  mw and md commands will still work, but binary file loads will
have
> > the
> > > incorrect word order loaded into memory.
> > >
> > > The EJTAG processor access data register (PrAcc) is little endian
> > regardless
> > > of the CPU endianness; it is always loaded LSB first. This is
> > confirmed by
> > > the fact that mips_ejtag_drscan_32() uses buf_set_u32() to load
the
> > scan
> > > field;
> > > buf_set_u32() is a little-endian formatter. For big endian
targets,
> > data
> > > buffers have to be modified so the LSB of each u32 or u16 is at
the
> > lower
> > > (first) memory location.
> > >
> > > The attached patch for src/target/mips_m4k.c fixes the problem.
> > >
> > > Included is a patch for src/target/mips_ejtag.c that fixes the
case of
> > a big
> > > endian host.  Again it is related to PrAcc.  If the drscan
out_value
> > word
> > > order is set using buf_set_u32() then it makes sense to also fixup
the
> > > in_value with buf_get_u32(); a symmetry argument. This has no
affect
> > on
> > > little endian hosts.
> > >
> > David,
> > I strongly doubt your patch is required. AFAIK OpenOCD already
modifies
> > the loaded data for correct endianess at a higher level. Secondly I
> > think endianess conversions should not be done inside a target
specific
> > file.
> >
> > I'm using OpenOCD with a MIPS target (AU1100) as well which is also
big
> > endian. I've configured OpenOCD to use little endian mode and that
seems
> > to be the proper setting. A thing to look out for is that the MIPS
EJTAG
> > interface may do the endian conversion for you. Is the order of the
> > special function registers correct when OpenOCD is in little endian
> > mode? This the case with 'my' AU1100 target. You might want to check
> > that first. If the special function registers read correctly in
little
> > endian mode then you'll need to modify the endianess of the binary
file
> > before loading it with OpenOCD. There are tools to do that. If I'm
> > correct the bootloader Yamon comes with a tool called 'smunge' which
can
> > be used to modify the endianess of a file.
> 
> As you probably noticed, I already committed these changes, but they
> will be trivial to revert.  Please let me know if I should remove
them.
> 
> That said, why require an external tool manage the conversion?  Can
> OpenOCD reasonably offer such support built-in?

Zach,
In case of the AU1100 the answer is no. The AU1100 SOC is a complete
endian mess. For starters: the MIPS core starts in big endian but the
external memory controller starts in little endian. This would imply
endian conversion depending on the address. Way too complicated.

Anyway when I use OpenOCD I can load the binary file (bootloader)
without need for byte shuffling. If I use the MacGraigor software I need
to shuffle the data first.

I would like to hear from David first before a final judgement about his
patches is made. I'm curious about the target he is working on.

Nico Coesel


_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to