Instruction error with cache opcode
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
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 expressionFrom 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.
Quoted 7 lines
Where and how is the value of
Index_Store_Tag_Idefined?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.
Quoted 9 lines
Quoted 1 line
Where and how is the value of
Index_Store_Tag_Idefined?I included
asm/cacheops.hfrom the kernel tree, it is defined there as :#define
Index_Store_Tag_I0x08I also tried to substitute
0x08directly 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.
Quoted 4 lines
Have you got your sources properly installes so that
include/asmis a symlink toinclude/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 asregdef.handcacheops.hare 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.Scacheop.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.
John Miller wrote:
[snip]
Quoted 10 lines
Quoted 7 lines
[kevink@cthulhu tmp]$ mipsel-linux-gcc -I ~/smtchead/include -c
cacheop.Scacheop.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
Quoted 3 lines · John Miller
I included
asm/cacheops.hfrom the kernel tree, it is defined there as :#define
Index_Store_Tag_I0x08
Then how about Fill_I ?
---
Atsushi Nemoto
Quoted 4 lines · Atsushi Nemoto
Quoted 2 lines · John Miller
I included
asm/cacheops.hfrom the kernel tree, it is defined there as :
Quoted 8 lines
Quoted 2 lines
#define
Index_Store_Tag_I0x08Then 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?
Sorry, I sent that last message without thanking everyone for their help.