Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6543becf authored by Andreas Schwab's avatar Andreas Schwab Committed by Michal Marek
Browse files

mod/file2alias: make modalias generation safe for cross compiling



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: default avatarAndreas Schwab <schwab@linux-m68k.org>
Signed-off-by: default avatarMichal Marek <mmarek@suse.cz>
parent a49f0d1e
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -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:"%"=%)

+9 −49
Original line number Diff line number Diff line
@@ -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;
};


@@ -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 */
@@ -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;
};

@@ -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];
@@ -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 */
@@ -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
@@ -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/ */
@@ -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 */
@@ -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 */
@@ -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 */
@@ -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;
@@ -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 }

@@ -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:"
@@ -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
};

/*
+1 −6
Original line number Diff line number Diff line
@@ -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                    \
@@ -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
+1 −0
Original line number Diff line number Diff line
elfconfig.h
mk_elfconfig
modpost
devicetable-offsets.h
+35 −0
Original line number Diff line number Diff line
@@ -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 < $< > $@
Loading