Skip to contentSkip to conversation

Instruction error with cache opcode

DISCUSSION John Miller 4 participants 9 messages May 14, 2006 – May 15, 2006 MIPS

lore
Share & tools
lore
#0 lore raw

I am attempting to write a routine to initialize the cache for a MIPS 4kc core to get Linux 2.6.16.14 to compile. I am sure someone has probably already done this, but I am doing it for educational reasons. I am receiving the following error:

arch/mips/kernel/head.S: Assembler messages:
arch/mips/kernel/head.S:131: Error: Instruction cache requires absolute expression

#1 lore raw
Quoted 21 lines

I am attempting to write a routine to initialize the cache for a MIPS 4kc core to get Linux 2.6.16.14 to compile. I am sure someone has probably already done this, but I am doing it for educational reasons. I am receiving the following error:

arch/mips/kernel/head.S: Assembler messages:
arch/mips/kernel/head.S:131: Error: Instruction cache requires absolute expression

From the following code section:

li t0, 0x80000000 # start address (KSEG0)
addu t1,t0,0x2000 # 8KB I-cache
1: addu t0,0x10 # 16B line size
cache Index_Store_Tag_I,-4(t0) # clear tag
nop
cache Fill_I,-4(t0) # fill line
nop
bne t0,t1,1b
cache Index_Store_Tag_I,-4(t0)

Quoted 2 lines

I copied the code section from See MIPS Run, so I know the code must be
correct. What am I doing wrong?

Where and how is the value of Index_Store_Tag_I defined?

Regards,

Kevin K.

#2 lore raw
Quoted 7 lines

Where and how is the value of Index_Store_Tag_I defined?

Regards,

Kevin K.

I included asm/cacheops.h from the kernel tree, it is defined there as :

#define Index_Store_Tag_I 0x08

I also tried to substitute 0x08 directly into my source and I got the same error. Strangely enough, if I remove the include line, I get the same exact error.

#3 lore raw
Quoted 9 lines
Quoted 1 line

Where and how is the value of Index_Store_Tag_I defined?

I included asm/cacheops.h from the kernel tree, it is defined there as :

#define Index_Store_Tag_I 0x08

I also tried to substitute 0x08 directly into my source and I got the same error. Strangely enough, if I remove the include line, I get the same exact error.

Have you got your sources properly installes so that include/asm is a symlink to include/asm-mips? I've done the experiment at my end, and it builds just fine so long as regdef.h and cacheops.h are really on the include path of the compilation. If they're not, I get:

[kevink@cthulhu tmp]$ mipsel-linux-gcc -I ~/smtchead/include -c cacheop.S cacheop.S: Assembler messages:
cacheop.S:4: Error: Instruction cache requires absolute expression cacheop.S:4: Error: Instruction cache requires absolute expression cacheop.S:4: Error: illegal operands `cache'

Regards,

Kevin K.

#4 lore raw
Quoted 4 lines

Have you got your sources properly installes so that include/asm is a symlink to include/asm-mips?

Yes, include/asm is symlinked to include/asm-mips. Let me provide a little more detail. I did not want to modify head.S (since this is a kernel file) but I noticed an undefined macro,

kernel_entry_setup # cpu specific setup

and the include #include <kernel-entry-init.h>

I found at least one kernel-entry-init.h file in a hardware specific directory so I made my own under include/asm-mips/rb500 and added a line to the Makefile. Within kernel-entry-init.h are the include for cacheops.h as well as the macro definition. regdef.h is included in head.s.

Quoted 11 lines

I've done the experiment at my end,
and it builds just fine so long as regdef.h and cacheops.h are really on the include path of the compilation. If they're not, I get:

[kevink@cthulhu tmp]$ mipsel-linux-gcc -I ~/smtchead/include -c cacheop.S cacheop.S: Assembler messages:
cacheop.S:4: Error: Instruction cache requires absolute expression cacheop.S:4: Error: Instruction cache requires absolute expression cacheop.S:4: Error: illegal operands `cache'

Well, it looks like I am missing something somewhere, just need to pin down what I did wrong.

#5 lore raw

John Miller wrote:
[snip]

Quoted 10 lines
Quoted 7 lines

[kevink@cthulhu tmp]$ mipsel-linux-gcc -I ~/smtchead/include -c cacheop.S cacheop.S: Assembler messages:
cacheop.S:4: Error: Instruction cache requires absolute expression cacheop.S:4: Error: Instruction cache requires absolute expression cacheop.S:4: Error: illegal operands `cache'

Well, it looks like I am missing something somewhere, just need to pin down what I did wrong.

Try gcc -E to get the preprocessed source, this is what the assembler sees.

Thiemo

#6 lore raw
In reply to John Miller
Quoted 3 lines · John Miller

I included asm/cacheops.h from the kernel tree, it is defined there as :

#define Index_Store_Tag_I 0x08

Then how about Fill_I ?

---
Atsushi Nemoto

#7 lore raw
Quoted 4 lines · Atsushi Nemoto
Quoted 2 lines · John Miller

I included asm/cacheops.h from the kernel tree, it is defined there as :

Quoted 8 lines
Quoted 2 lines

#define Index_Store_Tag_I 0x08

Then how about Fill_I ?

---
Atsushi Nemoto

That got it! Sorry, I had my head up somewhere it was not supposed to be. I do not know how many times I went over cacheops.h and missed the fact that Fill was defined, not Fill_I. One I changed my code to Fill, it built the kernel nicely. It still died before the first printk :) but at least I am a little closer. I got Fill_I out of the See MIPS Run book, it has the same option hex (0x14) as Fill, does anyone know why this changed?

#8 lore raw

Sorry, I sent that last message without thanking everyone for their help.