[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[microblaze-uclinux] Microblaze with MMU, loadable module printk problems
Hi All,,
We're working on bringing up Petalinux
Microblaze with MMU v0.10 distro on a custom board. Part of this is the
development of a loadable module device driver. So far, we've been able
to insmod and rmmod the .ko file, as well as create a /proc entry. We haven't
gotten much farther because of a serious issue we're seeing.
It appears that strings are not being
handled correctly in the module. I don't have any strong ideas about what's
going on, but I do have a simple program that demonstrates this problem:
================================================================================
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <asm/uaccess.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#define STRING1 "1 2 3 4 5 6 7
8 9 10 11 12 13 14 15 16 17 18 19 20\n"
#define STRING2 "a b c d e f g
h i j k l m n o p q r s
t \n"
int
NspbProc(char *page,
char **start,
off_t offset,
int count,
int *eof,
void *data)
{
int length = 0;
length += sprintf(page
+ length, "%s", STRING1);
length += sprintf(page
+ length, "%s", STRING2);
*eof = 1;
return length;
}
static int __init
NspbInit(void)
{
create_proc_read_entry("nspb",
0, NULL, NspbProc, NULL);
printk("%s",
STRING1);
printk("%s",
STRING2);
return 0;
}
module_init(NspbInit);
static void __exit
NspbCleanup(void)
{
remove_proc_entry("nspb",
NULL);
}
module_exit(NspbCleanup);
================================================================================
Here's what happens when we load the
above module (using busybox insmod - we also have syslogd and klogd running):
#insmod nspb.ko
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20
#
Here is what was expected:
#insmod nspb.ko
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
16 17 18 19 20
a b c d e f g h i j k l
m n o p q r s t
#
Further, doing a cat of the driver's
proc file (cat /proc/nspb) produces the exact same output as the printks
do. This seems to eliminate the printk function as the cause of the problem.
I didn't choose the values of STRING1
and STRING2 for any special reason. You can mess around with the values
and get varying results, none of which are correct. You can also try printing
string literals directly (e.g. print("some string\n") or printing
a string in any way you can think of, and get incorrect results. In the
above code, if I comment out the printk and sprintf of STRING1, I get this:
c d e f g h i j k l m
n o p q r s t
Again, incorrect, and I'm not sure if
you'd get the same thing, but whatever you got, it would likely be wrong.
Bottom line is that I've tried printing all sorts of different strings
in all sorts of different ways and very few of them seem to come out correct.
Here is one more example of incorrect behavior:
1. Comment out the #define STRING 1
and STRING2 macros.
2. Comment out the 2 printk and sprintf
calls.
3. Add this to the proc function:
length += sprintf(page
+ length, "somestring1\n");
length += sprintf(page
+ length, "somestring2\n");
length += sprintf(page
+ length, "somestring3\n");
length += sprintf(page
+ length, "somestring4\n");
4. Add this to the NspbInit fucntion:
printk("somestring1\n");
printk("somestring2\n");
printk("somestring3\n");
printk("somestring4\n");
5. Load the module.
I get this output from the NspbInit
function's printks:
ng1
ng3
I get the same output from /proc/nspb.
So, two of the strings are not printed at all, and the two that are appear
truncated. I had some luck in printing integers (e.g. printk("%d",
someInt)) but upon trying to do this again when preparing these examples,
I got incorrect results, so I am not sure what might be going on with that.
Two other notes as a general FYI to
anyone who might be working on the next petalinux distro. Our actual driver
will use the ioremap, iounmap, copy_from_user, and copy_to_user functions.
Those functions, however, are not exported, causing compile warnings and
load errors. We had to add the following to software/linux-2.6.x-petalogix/arch/microblaze/kernel/microblaze_ksyms.c
to get things working:
EXPORT_SYMBOL(__copy_user);
EXPORT_SYMBOL(ioremap);
EXPORT_SYMBOL(iounmap);
I expect there might be more symbols
missing, as well.
Finally, we also had to fix a syntax
error in software/linux-2.6.x-petalogix/arch/microblaze/kernel/module.c,
line 99, where there was an extra parenthesis.
Thanks in advance for any help!
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