Annotation of /trunk/kmod/patches/kmod-9-fix32bits.patch
Parent Directory | Revision Log
Revision 1820 -
(hide annotations)
(download)
Wed Jun 27 09:21:17 2012 UTC (12 years, 3 months ago) by niro
File size: 1982 byte(s)
Wed Jun 27 09:21:17 2012 UTC (12 years, 3 months ago) by niro
File size: 1982 byte(s)
-added patch to fix testsuite failures
1 | niro | 1820 | diff --git a/testsuite/init_module.c b/testsuite/init_module.c |
2 | index 814998a..ed8b9fc 100644 | ||
3 | --- a/testsuite/init_module.c | ||
4 | +++ b/testsuite/init_module.c | ||
5 | @@ -16,6 +16,7 @@ | ||
6 | */ | ||
7 | |||
8 | #include <assert.h> | ||
9 | +#include <elf.h> | ||
10 | #include <errno.h> | ||
11 | #include <dirent.h> | ||
12 | #include <fcntl.h> | ||
13 | @@ -206,6 +207,12 @@ static inline bool module_is_inkernel(const char *modname) | ||
14 | return ret; | ||
15 | } | ||
16 | |||
17 | +static uint8_t elf_identify(void *mem) | ||
18 | +{ | ||
19 | + uint8_t *p = mem; | ||
20 | + return p[EI_CLASS]; | ||
21 | +} | ||
22 | + | ||
23 | TS_EXPORT long init_module(void *mem, unsigned long len, const char *args); | ||
24 | |||
25 | /* | ||
26 | @@ -225,6 +232,8 @@ long init_module(void *mem, unsigned long len, const char *args) | ||
27 | const void *buf; | ||
28 | uint64_t bufsize; | ||
29 | int err; | ||
30 | + uint8_t class; | ||
31 | + off_t offset; | ||
32 | |||
33 | init_retcodes(); | ||
34 | |||
35 | @@ -237,13 +246,20 @@ long init_module(void *mem, unsigned long len, const char *args) | ||
36 | kmod_elf_unref(elf); | ||
37 | |||
38 | /* | ||
39 | - * We couldn't find the module's name inside the ELF file. Just exit | ||
40 | - * as if it was successful | ||
41 | + * We couldn't find the parse the ELF file. Just exit as if it was | ||
42 | + * successful | ||
43 | */ | ||
44 | if (err < 0) | ||
45 | return 0; | ||
46 | |||
47 | - modname = (char *)buf + offsetof(struct module, name); | ||
48 | + /* We need to open both 32 and 64 bits module - hack! */ | ||
49 | + class = elf_identify(mem); | ||
50 | + if (class == ELFCLASS64) | ||
51 | + offset = MODULE_NAME_OFFSET_64; | ||
52 | + else | ||
53 | + offset = MODULE_NAME_OFFSET_32; | ||
54 | + | ||
55 | + modname = (char *)buf + offset; | ||
56 | mod = find_module(modules, modname); | ||
57 | if (mod != NULL) { | ||
58 | errno = mod->errcode; | ||
59 | diff --git a/testsuite/stripped-module.h b/testsuite/stripped-module.h | ||
60 | index 9f97dae..19862f3 100644 | ||
61 | --- a/testsuite/stripped-module.h | ||
62 | +++ b/testsuite/stripped-module.h | ||
63 | @@ -13,6 +13,7 @@ struct list_head { | ||
64 | }; | ||
65 | |||
66 | #define MODULE_NAME_LEN (64 - sizeof(unsigned long)) | ||
67 | + | ||
68 | struct module | ||
69 | { | ||
70 | enum module_state state; | ||
71 | @@ -24,4 +25,8 @@ struct module | ||
72 | char name[MODULE_NAME_LEN]; | ||
73 | }; | ||
74 | |||
75 | +/* padding */ | ||
76 | +#define MODULE_NAME_OFFSET_64 4 + 4 + 2 * 8 | ||
77 | +#define MODULE_NAME_OFFSET_32 4 + 2 * 4 | ||
78 | + | ||
79 | #endif |