[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[microblaze-uclinux] Microblaze with MMU, possible stack corruption in loadable module?
Hi John (and everyone else),
I am attaching some code that compiles
into a loadable module. It will allow anyone who is interested to recreate
a problem I'm having. This is on Microblaze with MMU. The code I am attaching
is based on code in a real driver module, but has specifics removed and
is made as simple as possible.
I'm seeing strange behavior when I call
a function implemented in one .c file from another .c file. If I move the
function into the same .c file, the weirdness goes away. Further, not all
function calls across compilation units behave badly. I've only got one
example of it happening - some other calls I make don't seem to have problems.
The function that does have a problem, though, is much longer that the
others. It contains a lengthy switch statement. If you take the switch
statement out or make it have fewer cases, the problem may go away. The
problem itself is everything from the called function having local variables
or function parameters get their values changed, to seeing the function
run several (or more) times even though it's only called once, to causing
an Oops. Here is one example of an Oops I got:
Oops: Exception in kernel mode, sig:
4
Registers dump: mode=1
sp=DF8B5E70, r2=00000000, r3=00000038,
r4=E005B330
r5=0000000E, r6=0000000E, r7=00000000,
r8=00000000
r9=C03AF5A8, r10=00000000, r11=00000000,
r12=C004C8AC
r13=00000000, r14=00000001, r15=E005B24C,
r16=000000D0
r17=10001A64, r18=00000005, r19=00001000,
r20=BFB96EF4
r21=00000000, r22=C01AF374, r23=00000010,
r24=DF8B4000
r25=000200D0, r26=C00339A4, r27=C03AB7D8,
r28=C0007534
r29=00000001, r30=00000000, r31=C0374040,
rPC=E005B334
ear=DF8E3000, esr=00001000
Illegal instruction
Anyway, on to the example:
1. Compile the file1.h, file.c, and
main.c files into a loadable module.
2. load the module.
3. cat /proc/testdriver
4. This is the output I get:
ProcFunction
Oops:
Exception in kernel mode, sig: 4
register
listing....
5. Now, go to line 191 of main.c and
comment it out
6. Go to line 192 of main.c and uncomment
it.
7. Rebuild and load the module.
8. cat /proc/testdriver
9. This is the output I get (and it
is the output I should have got in step 4.)
ProcFucntion
14
Switch Val = 14.
The difference between the incorrect
and correct versions is that in step 4, the output is coming from functions
in file1.c (proc funciton in main.c, output functions in file1.c), while
in step 9, all the functions are in main.c. Basically, the main.c file
contains copies of the functions in file1.c - they just have the prefix
"Proc" added to all the function names so as to avoid collisions.
By commenting/uncommenting lines 191 and 192 in main.c, you can choose
whether main.c 's proc output function calls a function in file.c or in
main.c. Both set of functions are identical (except for their names). This
illustrates the problem I am having in calling functions in another compilation
unit.
You can vary the parameter passed to
the PrintSwitch/ProcPrintSwitch functions on line 191 and 192 of main.c
and get different behavior. For example, changing the parameter from 14
(which it is in the file I am attaching) to 3 (which means the output should
say "3 Switch Val = 3." produces the correct output when keeping
all calls in main.c. It produce the output "9 Switch Val = 9."
when the call goes out to file1.c, however. Note that no oops is produced
in this case!
Any help is appreciated. Not sure if
this is some sort of stack corruption or long jump problem or what.
Thanks in advance,
Jeff
Jeff Fuller
Software Engineer
EI WW SOFTWARE SYSTEMS ENGINEERING
Eastman Kodak Company
2400 Mt Read Blvd.
Rochester, NY 14650-3019
jeffrey.fuller@xxxxxxxxx
Office: (585)726-6908
www.kodak.com
Attachment:
main.c
Description: Binary data
Attachment:
file1.h
Description: Binary data
Attachment:
file1.c
Description: Binary data