[U-Boot] the mips cache code question ?
Scott Nicholas
scott.nicholas at scottn.us
Thu Dec 2 02:03:10 CET 2010
hello,
On Wed, Dec 1, 2010 at 10:27 AM, Andrew Dyer <amdyer at gmail.com> wrote:
> On Dec 1, 2010 12:26 AM, "奥刘" <happyoach at gmail.com> wrote:
>
>> In the file .\cpu\mips\cache.s , i found some code confounded .
>>
>> line 152 to line 156 :
>>
>> cache_op Index_Store_Tag_I t0
>> PTR_ADDU t0, a2
>> bne t0, t1, 1b
>> /* fill once, so data field parity is correct */
>> PTR_LI t0, INDEX_BASE
>>
>> the code 'PTR_LI t0, INDEX_BASE' is in the branch delay slot , so this
>> instruction will be implement every branch cycle.
>>
>> Is it right ? Then the cache operation logic seems wrong .
It would seem. a NOP is needed in this case. seem every branch is
incorrect. a disassembly would be best way to confirm. assembler might
insert it for us.
>
> From a quick glance I think the code is OK. I would suggest
> disassembling the executable code to make sure of what the assembler
> did.
>
> The answer depends on what mode the assembler is in. For MIPS
> assembler there is a 'reorder mode' where the assembler will fill in
> the branch delay slot for you or place a nop if necessary, and the
> next instruction in the source is really the one after the delay slot,
> or there is noreorder mode where the next instruction after the branch
> is what is put in the delay slot.
>
> Normally the assembler runs in reorder mode, and you use a '.set
> reorder' and '.set noreorder' to switch between them. Noreorder mode
> is commonly used in code that requires precise control of where
> instructions get executed (cache & tlb handling)
the file does specify noreorder! This is interesting, and of course I
will be looking at a disassembly of my u-boot later, it is not
available to me now. Tho, the cache's work, and have seen nothing
that makes it seem otherwise..
--
Scott
More information about the U-Boot
mailing list