> -----Original Message-----
> From: David Claffey [mailto:dnclaf...@gmail.com]
> Sent: vrijdag 12 juni 2009 13:50
> To: Nico Coesel
> Cc: Zach Welch; openocd-development
> Subject: Re: [Openocd-development] mips32 big endian fix
> 
> Nico,
> 
> You are correct, target.c modifies for endianness.  This is helpful
when I
> set
> openocd to -endian big; it sets the word order for mw and md commands
to the
> same endianness as the binary files I want to load.  The problem is
the
> mips_m4k
> target does not adjust for endianness like the xscale target does.
> 
> My board is a Atheros ar71xx with a MIPS 24Kc hardcore.  The cpu
endianness
> cannot be changed and there is no other endianness in the SoC. The
special
> registers read and write correctly when I configure openocd in little
endian
> mode.  When I saw the discrepancy I thought, I have a big endian
target, why
> should I not set "-endian big". So as a fix, I followed the practice
in
> src/target/xscale.c:xscale_send() where word order is swapped
depending on
> target->endianness. I can now read/write the special registers
correctly and
> download a binary from my toolchain without modification.

David,
I think the following is happening with your patch applied and OpenOCD
in big endian mode:

mww command -> endian shuffle in target.c -> endian shuffle in mips
target driver -> target

binary file -> endian shuffle in mips target driver -> target


I tried to read the SFRs in the AU1100 using the mdb and the mdh command
with OpenOCD in little endian mode. It reads the correct values on 4
bytes boundaries while the CPU is in big endian mode. This proofs the
EJTAG access port is doing the proper endian conversion. 

In other words: the binary file should be changed for proper endianess
before loading it. The MIPS implementation in OpenOCD doesn't need to be
fixed regarding the endianess.

Nico Coesel

PS: It seems reading data on non 4 byte boundaries needs to be fixed for
MIPS targets.
 

> Nico Coesel wrote:
> >> -----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