Skip to content

Commit

Permalink
mod/file2alias: make modalias generation safe for cross compiling
Browse files Browse the repository at this point in the history
Use the target compiler to compute the offsets for the fields of the
device_id structures, so that it won't be broken by different alignments
between the host and target ABIs.

This also fixes missing endian corrections for some modaliases.

Signed-off-by: Andreas Schwab <schwab@linux-m68k.org>
Signed-off-by: Michal Marek <mmarek@suse.cz>
  • Loading branch information
Andreas Schwab authored and Michal Marek committed Jan 24, 2013
1 parent a49f0d1 commit 6543bec
Show file tree
Hide file tree
Showing 8 changed files with 591 additions and 368 deletions.
1 change: 0 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,6 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
# "make" in the configured kernel build directory always uses that.
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)

Expand Down
58 changes: 9 additions & 49 deletions include/linux/mod_devicetable.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ struct ieee1394_device_id {
__u32 model_id;
__u32 specifier_id;
__u32 version;
kernel_ulong_t driver_data
__attribute__((aligned(sizeof(kernel_ulong_t))));
kernel_ulong_t driver_data;
};


Expand Down Expand Up @@ -148,8 +147,7 @@ struct hid_device_id {
__u16 group;
__u32 vendor;
__u32 product;
kernel_ulong_t driver_data
__attribute__((aligned(sizeof(kernel_ulong_t))));
kernel_ulong_t driver_data;
};

/* s390 CCW devices */
Expand All @@ -173,8 +171,6 @@ struct ccw_device_id {
struct ap_device_id {
__u16 match_flags; /* which fields to match against */
__u8 dev_type; /* device type */
__u8 pad1;
__u32 pad2;
kernel_ulong_t driver_info;
};

Expand All @@ -184,13 +180,10 @@ struct ap_device_id {
struct css_device_id {
__u8 match_flags;
__u8 type; /* subchannel type */
__u16 pad2;
__u32 pad3;
kernel_ulong_t driver_data;
};

#define ACPI_ID_LEN 16 /* only 9 bytes needed here, 16 bytes are used */
/* to workaround crosscompile issues */
#define ACPI_ID_LEN 9

struct acpi_device_id {
__u8 id[ACPI_ID_LEN];
Expand Down Expand Up @@ -231,11 +224,7 @@ struct of_device_id
char name[32];
char type[32];
char compatible[128];
#ifdef __KERNEL__
const void *data;
#else
kernel_ulong_t data;
#endif
};

/* VIO */
Expand All @@ -260,24 +249,14 @@ struct pcmcia_device_id {
/* for pseudo multi-function devices */
__u8 device_no;

__u32 prod_id_hash[4]
__attribute__((aligned(sizeof(__u32))));
__u32 prod_id_hash[4];

/* not matched against in kernelspace*/
#ifdef __KERNEL__
const char * prod_id[4];
#else
kernel_ulong_t prod_id[4]
__attribute__((aligned(sizeof(kernel_ulong_t))));
#endif

/* not matched against */
kernel_ulong_t driver_info;
#ifdef __KERNEL__
char * cisfile;
#else
kernel_ulong_t cisfile;
#endif
};

#define PCMCIA_DEV_ID_MATCH_MANF_ID 0x0001
Expand Down Expand Up @@ -373,8 +352,7 @@ struct sdio_device_id {
__u8 class; /* Standard interface or SDIO_ANY_ID */
__u16 vendor; /* Vendor or SDIO_ANY_ID */
__u16 device; /* Device ID or SDIO_ANY_ID */
kernel_ulong_t driver_data /* Data private to the driver */
__attribute__((aligned(sizeof(kernel_ulong_t))));
kernel_ulong_t driver_data; /* Data private to the driver */
};

/* SSB core, see drivers/ssb/ */
Expand Down Expand Up @@ -420,8 +398,7 @@ struct virtio_device_id {
*/
struct hv_vmbus_device_id {
__u8 guid[16];
kernel_ulong_t driver_data /* Data private to the driver */
__attribute__((aligned(sizeof(kernel_ulong_t))));
kernel_ulong_t driver_data; /* Data private to the driver */
};

/* rpmsg */
Expand All @@ -440,8 +417,7 @@ struct rpmsg_device_id {

struct i2c_device_id {
char name[I2C_NAME_SIZE];
kernel_ulong_t driver_data /* Data private to the driver */
__attribute__((aligned(sizeof(kernel_ulong_t))));
kernel_ulong_t driver_data; /* Data private to the driver */
};

/* spi */
Expand All @@ -451,8 +427,7 @@ struct i2c_device_id {

struct spi_device_id {
char name[SPI_NAME_SIZE];
kernel_ulong_t driver_data /* Data private to the driver */
__attribute__((aligned(sizeof(kernel_ulong_t))));
kernel_ulong_t driver_data; /* Data private to the driver */
};

/* dmi */
Expand Down Expand Up @@ -484,15 +459,6 @@ struct dmi_strmatch {
char substr[79];
};

#ifndef __KERNEL__
struct dmi_system_id {
kernel_ulong_t callback;
kernel_ulong_t ident;
struct dmi_strmatch matches[4];
kernel_ulong_t driver_data
__attribute__((aligned(sizeof(kernel_ulong_t))));
};
#else
struct dmi_system_id {
int (*callback)(const struct dmi_system_id *);
const char *ident;
Expand All @@ -506,7 +472,6 @@ struct dmi_system_id {
* error: storage size of '__mod_dmi_device_table' isn't known
*/
#define dmi_device_id dmi_system_id
#endif

#define DMI_MATCH(a, b) { a, b }

Expand All @@ -515,8 +480,7 @@ struct dmi_system_id {

struct platform_device_id {
char name[PLATFORM_NAME_SIZE];
kernel_ulong_t driver_data
__attribute__((aligned(sizeof(kernel_ulong_t))));
kernel_ulong_t driver_data;
};

#define MDIO_MODULE_PREFIX "mdio:"
Expand Down Expand Up @@ -572,11 +536,7 @@ struct isapnp_device_id {
struct amba_id {
unsigned int id;
unsigned int mask;
#ifndef __KERNEL__
kernel_ulong_t data;
#else
void *data;
#endif
};

/*
Expand Down
7 changes: 1 addition & 6 deletions scripts/Makefile.modpost
Original file line number Diff line number Diff line change
Expand Up @@ -66,10 +66,6 @@ modules := $(patsubst %.o,%.ko, $(wildcard $(__modules:.ko=.o)))
# Stop after building .o files if NOFINAL is set. Makes compile tests quicker
_modpost: $(if $(KBUILD_MODPOST_NOFINAL), $(modules:.ko:.o),$(modules))

ifneq ($(KBUILD_BUILDHOST),$(ARCH))
cross_build := 1
endif

# Step 2), invoke modpost
# Includes step 3,4
modpost = scripts/mod/modpost \
Expand All @@ -80,8 +76,7 @@ modpost = scripts/mod/modpost \
$(if $(KBUILD_EXTRA_SYMBOLS), $(patsubst %, -e %,$(KBUILD_EXTRA_SYMBOLS))) \
$(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
$(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \
$(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \
$(if $(cross_build),-c)
$(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w)

quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules
cmd_modpost = $(modpost) -s
Expand Down
1 change: 1 addition & 0 deletions scripts/mod/.gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
elfconfig.h
mk_elfconfig
modpost
devicetable-offsets.h

35 changes: 35 additions & 0 deletions scripts/mod/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,44 @@ always := $(hostprogs-y) empty.o

modpost-objs := modpost.o file2alias.o sumversion.o

devicetable-offsets-file := devicetable-offsets.h

define sed-y
"/^->/{s:->#\(.*\):/* \1 */:; \
s:^->\([^ ]*\) [\$$#]*\([-0-9]*\) \(.*\):#define \1 \2 /* \3 */:; \
s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
s:->::; p;}"
endef

quiet_cmd_offsets = GEN $@
define cmd_offsets
(set -e; \
echo "#ifndef __DEVICEVTABLE_OFFSETS_H__"; \
echo "#define __DEVICEVTABLE_OFFSETS_H__"; \
echo "/*"; \
echo " * DO NOT MODIFY."; \
echo " *"; \
echo " * This file was generated by Kbuild"; \
echo " *"; \
echo " */"; \
echo ""; \
sed -ne $(sed-y) $<; \
echo ""; \
echo "#endif" ) > $@
endef

# We use internal kbuild rules to avoid the "is up to date" message from make
scripts/mod/devicetable-offsets.s: scripts/mod/devicetable-offsets.c FORCE
$(Q)mkdir -p $(dir $@)
$(call if_changed_dep,cc_s_c)

$(obj)/$(devicetable-offsets-file): scripts/mod/devicetable-offsets.s
$(call cmd,offsets)

# dependencies on generated files need to be listed explicitly

$(obj)/modpost.o $(obj)/file2alias.o $(obj)/sumversion.o: $(obj)/elfconfig.h
$(obj)/file2alias.o: $(obj)/$(devicetable-offsets-file)

quiet_cmd_elfconfig = MKELF $@
cmd_elfconfig = $(obj)/mk_elfconfig < $< > $@
Expand Down
Loading

0 comments on commit 6543bec

Please sign in to comment.