diff options
| author | Anton Altaparmakov <anton@tuxera.com> | 2012-02-27 04:01:22 -0500 |
|---|---|---|
| committer | Anton Altaparmakov <anton@tuxera.com> | 2012-02-27 04:01:22 -0500 |
| commit | f621c5334396fd153cd882ea92466823b7e7b821 (patch) | |
| tree | 7b829cad44dc0e5003d7cacac3a7a1b128637083 /scripts/mod | |
| parent | 0afa1b62e33250d4777c5803a98ae69fbe872061 (diff) | |
| parent | 500dd2370e77c9551ba298bdeeb91b02d8402199 (diff) | |
Merge branch 'master' of /Volumes/CaseSensitiveDisk/linux
Diffstat (limited to 'scripts/mod')
| -rw-r--r-- | scripts/mod/file2alias.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index d0de2a2c3a2d..b89efe6e4c85 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c | |||
| @@ -46,11 +46,37 @@ struct devtable { | |||
| 46 | void *function; | 46 | void *function; |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | #define ___cat(a,b) a ## b | ||
| 50 | #define __cat(a,b) ___cat(a,b) | ||
| 51 | |||
| 52 | /* we need some special handling for this host tool running eventually on | ||
| 53 | * Darwin. The Mach-O section handling is a bit different than ELF section | ||
| 54 | * handling. The differnces in detail are: | ||
| 55 | * a) we have segments which have sections | ||
| 56 | * b) we need a API call to get the respective section symbols */ | ||
| 57 | #if defined(__MACH__) | ||
| 58 | #include <mach-o/getsect.h> | ||
| 59 | |||
| 60 | #define INIT_SECTION(name) do { \ | ||
| 61 | unsigned long name ## _len; \ | ||
| 62 | char *__cat(pstart_,name) = getsectdata("__TEXT", \ | ||
| 63 | #name, &__cat(name,_len)); \ | ||
| 64 | char *__cat(pstop_,name) = __cat(pstart_,name) + \ | ||
| 65 | __cat(name, _len); \ | ||
| 66 | __cat(__start_,name) = (void *)__cat(pstart_,name); \ | ||
| 67 | __cat(__stop_,name) = (void *)__cat(pstop_,name); \ | ||
| 68 | } while (0) | ||
| 69 | #define SECTION(name) __attribute__((section("__TEXT, " #name))) | ||
| 70 | |||
| 71 | struct devtable **__start___devtable, **__stop___devtable; | ||
| 72 | #else | ||
| 73 | #define INIT_SECTION(name) /* no-op for ELF */ | ||
| 74 | #define SECTION(name) __attribute__((section(#name))) | ||
| 75 | |||
| 49 | /* We construct a table of pointers in an ELF section (pointers generally | 76 | /* We construct a table of pointers in an ELF section (pointers generally |
| 50 | * go unpadded by gcc). ld creates boundary syms for us. */ | 77 | * go unpadded by gcc). ld creates boundary syms for us. */ |
| 51 | extern struct devtable *__start___devtable[], *__stop___devtable[]; | 78 | extern struct devtable *__start___devtable[], *__stop___devtable[]; |
| 52 | #define ___cat(a,b) a ## b | 79 | #endif /* __MACH__ */ |
| 53 | #define __cat(a,b) ___cat(a,b) | ||
| 54 | 80 | ||
| 55 | #if __GNUC__ == 3 && __GNUC_MINOR__ < 3 | 81 | #if __GNUC__ == 3 && __GNUC_MINOR__ < 3 |
| 56 | # define __used __attribute__((__unused__)) | 82 | # define __used __attribute__((__unused__)) |
| @@ -65,8 +91,8 @@ extern struct devtable *__start___devtable[], *__stop___devtable[]; | |||
| 65 | (type *)NULL, \ | 91 | (type *)NULL, \ |
| 66 | (char *)NULL)), \ | 92 | (char *)NULL)), \ |
| 67 | sizeof(type), (function) }; \ | 93 | sizeof(type), (function) }; \ |
| 68 | static struct devtable *__attribute__((section("__devtable"))) \ | 94 | static struct devtable *SECTION(__devtable) __used \ |
| 69 | __used __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) | 95 | __cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__) |
| 70 | 96 | ||
| 71 | #define ADD(str, sep, cond, field) \ | 97 | #define ADD(str, sep, cond, field) \ |
| 72 | do { \ | 98 | do { \ |
| @@ -1080,6 +1106,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info, | |||
| 1080 | do_pnp_card_entries(symval, sym->st_size, mod); | 1106 | do_pnp_card_entries(symval, sym->st_size, mod); |
| 1081 | else { | 1107 | else { |
| 1082 | struct devtable **p; | 1108 | struct devtable **p; |
| 1109 | INIT_SECTION(__devtable); | ||
| 1083 | 1110 | ||
| 1084 | for (p = __start___devtable; p < __stop___devtable; p++) { | 1111 | for (p = __start___devtable; p < __stop___devtable; p++) { |
| 1085 | if (sym_is(name, namelen, (*p)->device_id)) { | 1112 | if (sym_is(name, namelen, (*p)->device_id)) { |
