mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-20 05:31:15 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild
* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild: (40 commits) kbuild: introduce ccflags-y, asflags-y and ldflags-y kbuild: enable 'make CPPFLAGS=...' to add additional options to CPP kbuild: enable use of AFLAGS and CFLAGS on commandline kbuild: enable 'make AFLAGS=...' to add additional options to AS kbuild: fix AFLAGS use in h8300 and m68knommu kbuild: check for wrong use of CFLAGS kbuild: enable 'make CFLAGS=...' to add additional options to CC kbuild: fix up CFLAGS usage kbuild: make modpost detect unterminated device id lists kbuild: call export_report from the Makefile kbuild: move Kai Germaschewski to CREDITS kconfig/menuconfig: distinguish between selected-by-another options and comments kconfig: tristate choices with mixed tristate and boolean values include/linux/Kbuild: remove duplicate entries kbuild: kill backward compatibility checks kbuild: kill EXTRA_ARFLAGS kbuild: fix documentation in makefiles.txt kbuild: call make once for all targets when O=.. is used kbuild: pass -g to assembler under CONFIG_DEBUG_INFO kbuild: update _shipped files for kconfig syntax cleanup ... Fix up conflicts in arch/um/sys-{x86_64,i386}/Makefile manually.
This commit is contained in:
commit
821f3eff7c
106 changed files with 4048 additions and 2946 deletions
|
@ -55,10 +55,14 @@ do { \
|
|||
* Check that sizeof(device_id type) are consistent with size of section
|
||||
* in .o file. If in-consistent then userspace and kernel does not agree
|
||||
* on actual size which is a bug.
|
||||
* Also verify that the final entry in the table is all zeros.
|
||||
**/
|
||||
static void device_id_size_check(const char *modname, const char *device_id,
|
||||
unsigned long size, unsigned long id_size)
|
||||
static void device_id_check(const char *modname, const char *device_id,
|
||||
unsigned long size, unsigned long id_size,
|
||||
void *symval)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (size % id_size || size < id_size) {
|
||||
fatal("%s: sizeof(struct %s_device_id)=%lu is not a modulo "
|
||||
"of the size of section __mod_%s_device_table=%lu.\n"
|
||||
|
@ -66,6 +70,20 @@ static void device_id_size_check(const char *modname, const char *device_id,
|
|||
"in mod_devicetable.h\n",
|
||||
modname, device_id, id_size, device_id, size, device_id);
|
||||
}
|
||||
/* Verify last one is a terminator */
|
||||
for (i = 0; i < id_size; i++ ) {
|
||||
if (*(uint8_t*)(symval+size-id_size+i)) {
|
||||
fprintf(stderr,"%s: struct %s_device_id is %lu bytes. "
|
||||
"The last of %lu is:\n",
|
||||
modname, device_id, id_size, size / id_size);
|
||||
for (i = 0; i < id_size; i++ )
|
||||
fprintf(stderr,"0x%02x ",
|
||||
*(uint8_t*)(symval+size-id_size+i) );
|
||||
fprintf(stderr,"\n");
|
||||
fatal("%s: struct %s_device_id is not terminated "
|
||||
"with a NULL entry!\n", modname, device_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* USB is special because the bcdDevice can be matched against a numeric range */
|
||||
|
@ -168,7 +186,7 @@ static void do_usb_table(void *symval, unsigned long size,
|
|||
unsigned int i;
|
||||
const unsigned long id_size = sizeof(struct usb_device_id);
|
||||
|
||||
device_id_size_check(mod->name, "usb", size, id_size);
|
||||
device_id_check(mod->name, "usb", size, id_size, symval);
|
||||
|
||||
/* Leave last one: it's the terminator. */
|
||||
size -= id_size;
|
||||
|
@ -528,7 +546,7 @@ static void do_table(void *symval, unsigned long size,
|
|||
char alias[500];
|
||||
int (*do_entry)(const char *, void *entry, char *alias) = function;
|
||||
|
||||
device_id_size_check(mod->name, device_id, size, id_size);
|
||||
device_id_check(mod->name, device_id, size, id_size, symval);
|
||||
/* Leave last one: it's the terminator. */
|
||||
size -= id_size;
|
||||
|
||||
|
@ -550,14 +568,21 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
|
|||
Elf_Sym *sym, const char *symname)
|
||||
{
|
||||
void *symval;
|
||||
char *zeros = NULL;
|
||||
|
||||
/* We're looking for a section relative symbol */
|
||||
if (!sym->st_shndx || sym->st_shndx >= info->hdr->e_shnum)
|
||||
return;
|
||||
|
||||
symval = (void *)info->hdr
|
||||
+ info->sechdrs[sym->st_shndx].sh_offset
|
||||
+ sym->st_value;
|
||||
/* Handle all-NULL symbols allocated into .bss */
|
||||
if (info->sechdrs[sym->st_shndx].sh_type & SHT_NOBITS) {
|
||||
zeros = calloc(1, sym->st_size);
|
||||
symval = zeros;
|
||||
} else {
|
||||
symval = (void *)info->hdr
|
||||
+ info->sechdrs[sym->st_shndx].sh_offset
|
||||
+ sym->st_value;
|
||||
}
|
||||
|
||||
if (sym_is(symname, "__mod_pci_device_table"))
|
||||
do_table(symval, sym->st_size,
|
||||
|
@ -626,6 +651,7 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
|
|||
do_table(symval, sym->st_size,
|
||||
sizeof(struct ssb_device_id), "ssb",
|
||||
do_ssb_entry, mod);
|
||||
free(zeros);
|
||||
}
|
||||
|
||||
/* Now add out buffered information to the generated C source */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue