xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: "Luis R. Rodriguez" <mcgrof@do-not-panic.com>
Cc: peter.senna@gmail.com, ryabinin.a.a@gmail.com, JBeulich@suse.com,
	hpa@zytor.com, qiuxishi@huawei.com, boris.ostrovsky@oracle.com,
	xen-devel@lists.xensource.com, joro@8bytes.org, x86@kernel.org,
	mingo@redhat.com, aryabinin@virtuozzo.com,
	mchehab@osg.samsung.com, andreyknvl@google.com, mcgrof@suse.com,
	rusty@rustcorp.com.au, bp@alien8.de, tglx@linutronix.de,
	mcb30@ipxe.org, valentinrothberg@gmail.com, jgross@suse.com,
	linux-kernel@vger.kernel.org, luto@amacapital.net,
	long.wanglong@huawei.com
Subject: Re: [RFC v1 4/8] x86/init: add linker table support
Date: Wed, 20 Jan 2016 15:45:01 -0500	[thread overview]
Message-ID: <20160120204501.GD4769@char.us.oracle.com> (raw)
In-Reply-To: <1450217797-19295-5-git-send-email-mcgrof@do-not-panic.com>

> diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
> index 137dfa96aa14..e66b030e82bc 100644
> --- a/arch/x86/Kconfig.debug
> +++ b/arch/x86/Kconfig.debug
> @@ -400,4 +400,51 @@ config PUNIT_ATOM_DEBUG
>  	  The current power state can be read from
>  	  /sys/kernel/debug/punit_atom/dev_power_state
>  
> +config X86_DEBUG_LINKER_TABLES
> +	bool "x86 linker table debug"
> +	depends on DEBUG_KERNEL
> +	default n
> +	---help---
> +	  Enabling this should enable debugging linker tables on x86
> +	  with its own solution. To help debug it enables the "x86 beta"

its own solution? Would it be good to just name what that solution is?

> +	  and "x86 gamma" built-in feature. Both "x86 alpha" and "x86 delta"
> +	  built-in features are left disabled. You should see all tables
> +	  compiled, except delta, only the beta and gamma feature will be
> +	  linked in. The delta feature will only be compiled and linked in
> +	  if and only if its enabled the old way.

Whoa. Beta Alpha Delta Gamma? You lost me :-)

> +
> +	  For more details on these linker table refer to:
> +
> +	  include/linux/tables.h
> +
> +	  If unsure, say N.
> +
> +config X86_DEBUG_LINKER_TABLE_ALPHA
> +	bool "x86 linker table alpha"
> +	default n
> +	depends on X86_DEBUG_LINKER_TABLES
> +	---help---
> +	  Enabling this should enable the linker table "x86 alpha" feature.
> +
> +config X86_DEBUG_LINKER_TABLE_BETA
> +	bool "x86 linker table beta"
> +	default y
> +	depends on X86_DEBUG_LINKER_TABLES
> +	---help---
> +	  Enabling this should enable the linker table "x86 beta" feature.
> +
> +config X86_DEBUG_LINKER_TABLE_GAMMA
> +	bool "x86 linker table gamma"
> +	default y
> +	depends on X86_DEBUG_LINKER_TABLES
> +	---help---
> +	  Enabling this should enable the linker table "x86 gamma" feature.

Which has nothing to with gamma radiation right :-)

> +
> +config X86_DEBUG_LINKER_TABLE_DELTA
> +	bool "x86 linker table delta"
> +	default n
> +	depends on X86_DEBUG_LINKER_TABLES
> +	---help---
> +	  Enabling this should enable the linker table "x86 delta" feature.
> +
>  endmenu
> diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
> index cd0fc0cc78bc..b1b941e9ccd7 100644
> --- a/arch/x86/include/asm/x86_init.h
> +++ b/arch/x86/include/asm/x86_init.h
> +/**
> + * enum x86_init_fn_flags: flags for init sequences
> + *
> + * X86_INIT_FINISH_IF_DETECTED: tells the core that once this init sequence
> + *	has completed it can break out of the loop for init sequences on
> + *	its own level.
> + * X86_INIT_DETECTED: private flag. Used by the x86 core to annotate that this
> + * 	init sequence has been detected and it all of its callbacks
> + * 	must be run during initialization.
> + */
> +enum x86_init_fn_flags {

Should you have a 'default' one? That is an default one?
X86_INIT_IGNORE = 0,

> +	X86_INIT_FINISH_IF_DETECTED = BIT(0),
> +	X86_INIT_DETECTED = BIT(1),
> +};
> +
> +/* The x86 initialisation function table */
> +#define X86_INIT_FNS __table(struct x86_init_fn, "x86_init_fns")
> +
> +/* Used to declares an x86 initialization table */

s/declares/declare/
Also missing stop.

> +#define __x86_init_fn(order_level) __table_entry(X86_INIT_FNS, order_level)
> +
> +/* Init order levels, we can start at 01 but reserve 01-09 for now */
> +#define X86_INIT_ORDER_EARLY	10
> +#define X86_INIT_ORDER_NORMAL	30
> +#define X86_INIT_ORDER_LATE	50

Something is odd with those tabs/spaces.

> +
> +/*
> + * Use LTO_REFERENCE_INITCALL just in case of issues with old versions of gcc.
> + * This might not be needed for linker tables due to how we compartamentalize

s/compartamentalize/compartmentalize/

> + * sections and then order them at linker time, but just in case.
> + */
> +
> +#define x86_init(__level,						\
> +		 __supp_hardware_subarch,				\
> +		 __detect,						\
> +		 __depend,						\
> +		 __early_init)						\
> +	static struct x86_init_fn __x86_init_fn_##__early_init __used	\
> +		__x86_init_fn(__level) = {				\
> +		.order_level = __level,					\
> +		.supp_hardware_subarch = __supp_hardware_subarch,	\
> +		.detect = __detect,					\
> +		.depend = __depend,					\
> +		.early_init = __early_init,				\

.flags = 0, ? or  X86_INIT_IGNORE ?

> +	};								\
> +	LTO_REFERENCE_INITCALL(__x86_init_fn_##__early_init);
> +
> +#define x86_init_early(__supp_hardware_subarch,				\

The first \ is at an odd column.

> +		       __detect,					\
> +		       __depend,					\
> +		       __early_init)					\
> +	x86_init(X86_INIT_ORDER_EARLY, __supp_hardware_subarch,		\
> +		 __detect, __depend,					\
> +		 __early_init);
> +
> +#define x86_init_normal(__supp_hardware_subarch,			\
> +		       __detect,					\
> +		       __depend,					\
> +		       __early_init)					\
> +	x86_init(__name, X86_INIT_ORDER_NORMAL, __supp_hardware_subarch,\
> +		 __detect, __depend,					\
> +		 __early_init);
> +
> +#define x86_init_early_all(__detect,					\
> +			   __depend,					\
> +			   __early_init)				\
> +	x86_init_early(__name, X86_SUBARCH_ALL_SUBARCHS,		\
> +		       __detect, __depend,				\
> +		       __early_init);
> +
> +#define x86_init_early_pc(__detect,					\
> +			  __depend,					\
> +			  __early_init)					\
> +	x86_init_early(BIT(X86_SUBARCH_PC),				\
> +		       __detect, __depend,				\
> +		       __early_init);
> +
> +#define x86_init_early_pc_simple(__early_init)				\

Ditto
> +	x86_init_early((BIT(X86_SUBARCH_PC)), NULL, NULL,		\
> +		       __early_init);
> +
> +#define x86_init_normal_all(__detect,					\

Ditto
> +			    __depend,					\
> +			    __early_init)				\
> +	x86_init_normal(X86_SUBARCH_ALL_SUBARCHS,			\
> +		        __detect, __depend,				\
> +		        __early_init);
> +
> +#define x86_init_normal_pc(__detect,					\
> +			   __depend,					\
> +			   __early_init)				\
> +	x86_init_normal((BIT(X86_SUBARCH_PC)),				\
> +		        __detect, __depend,				\
> +		        __early_init);
> +
> +
> +#define x86_init_normal_xen(__detect,					\

Ditto
> +			    __depend,					\
> +			    __early_init)				\
> +	x86_init_normal((BIT(X86_SUBARCH_XEN)),				\
> +		        __detect, __depend,				\
> +		        __early_init);
> +
> +/**
> + * x86_init_fn_early_init: call all early_init() callbacks
> + *
> + * This calls all early_init() callbacks on the x86_init_fns linker table.
> + */
> +void x86_init_fn_early_init(void);
> +
> +/**
> + * x86_init_fn_init_tables - sort and check x86 linker table
> + *
> + * This sorts struct x86_init_fn init sequences in the x86_init_fns linker
> + * table by ensuring that init sequences that depend on other init sequences
> + * are placed later in the linker table. Init sequences that do not have
> + * dependencies are left in place. Circular dependencies are not allowed.
> + * The order-level of subordinate init sequences, that is of init sequences
> + * that depend on other init sequences, must have an order-level of lower
> + * or equal priority to the init sequence it depends on.
> + *
> + * This also validates semantics of all struct x86_init_fn init sequences
> + * on the x86_init_fns linker table.
> + */
> +void x86_init_fn_init_tables(void);
> +
> +#endif /* __X86_INIT_TABLES_H */
> diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
> index b1b78ffe01d0..be167a0a5e2c 100644
> --- a/arch/x86/kernel/Makefile
> +++ b/arch/x86/kernel/Makefile
> @@ -23,6 +23,8 @@ KASAN_SANITIZE_dumpstack_$(BITS).o := n
>  CFLAGS_irq.o := -I$(src)/../include/asm/trace
>  
>  obj-y			:= process_$(BITS).o signal.o
> +obj-y			+= init.o sort-init.o
> +obj-$(CONFIG_X86_DEBUG_LINKER_TABLES) += dbg-tables/
>  obj-$(CONFIG_COMPAT)	+= signal_compat.o
>  obj-y			+= traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o
>  obj-y			+= time.o ioport.o dumpstack.o nmi.o
> diff --git a/arch/x86/kernel/dbg-tables/Makefile b/arch/x86/kernel/dbg-tables/Makefile
> new file mode 100644
> index 000000000000..02d12c502ad0
> --- /dev/null
> +++ b/arch/x86/kernel/dbg-tables/Makefile
> @@ -0,0 +1,18 @@
> +# You should see all these compile but at run time you'd
> +# only see the ones that were linked in.
> +
> +# This ensures we always compile but only link
> +# in alpha if it was enabled. This is typically what
> +# you are expected to use to avoid code bit-rot.
> +table-$(CONFIG_X86_DEBUG_LINKER_TABLE_ALPHA)	+= alpha.o
> +
> +# This accomplishes the same, but requires 2 lines.
> +extra-y						+= beta.o
> +obj-$(CONFIG_X86_DEBUG_LINKER_TABLE_BETA)	+= beta.o
> +
> +table-$(CONFIG_X86_DEBUG_LINKER_TABLE_GAMMA)	+= gamma.o
> +
> +# If you *know* you only want to enable compilation of
> +# a feature when its selected you can just use the good
> +# ol' obj
> +obj-$(CONFIG_X86_DEBUG_LINKER_TABLE_DELTA)	+= delta.o
> diff --git a/arch/x86/kernel/dbg-tables/alpha.c b/arch/x86/kernel/dbg-tables/alpha.c
> new file mode 100644
> index 000000000000..54754f893a08
> --- /dev/null
> +++ b/arch/x86/kernel/dbg-tables/alpha.c
> @@ -0,0 +1,10 @@
> +#define pr_fmt(fmt) "debug-alpha: " fmt
> +
> +#include <linux/kernel.h>
> +#include <asm/x86_init.h>
> +
> +static void early_init_dbg_alpha(void) {
> +	pr_info("early_init triggered\n");
> +}
> +
> +x86_init_early_pc_simple(early_init_dbg_alpha);
> diff --git a/arch/x86/kernel/dbg-tables/beta.c b/arch/x86/kernel/dbg-tables/beta.c
> new file mode 100644
> index 000000000000..7384a57fc386
> --- /dev/null
> +++ b/arch/x86/kernel/dbg-tables/beta.c
> @@ -0,0 +1,18 @@
> +#define pr_fmt(fmt) "debug-beta: " fmt
> +
> +#include <linux/kernel.h>
> +#include <asm/x86_init.h>
> +
> +#include "gamma.h"
> +
> +static bool x86_dbg_detect_beta(void)
> +{
> +	return true;
> +}
> +
> +static void early_init_dbg_beta(void) {
> +	pr_info("early_init triggered\n");
> +}
> +x86_init_early_pc(x86_dbg_detect_beta,
> +		  x86_dbg_detect_gamma,
> +		  early_init_dbg_beta);
> diff --git a/arch/x86/kernel/dbg-tables/delta.c b/arch/x86/kernel/dbg-tables/delta.c
> new file mode 100644
> index 000000000000..9d38c68e602a
> --- /dev/null
> +++ b/arch/x86/kernel/dbg-tables/delta.c
> @@ -0,0 +1,10 @@
> +#define pr_fmt(fmt) "debug-delta: " fmt
> +
> +#include <linux/kernel.h>
> +#include <asm/x86_init.h>
> +
> +static void early_init_dbg_delta(void) {
> +	pr_info("early_init triggered\n");
> +}
> +
> +x86_init_early_pc_simple(early_init_dbg_delta);
> diff --git a/arch/x86/kernel/dbg-tables/gamma.c b/arch/x86/kernel/dbg-tables/gamma.c
> new file mode 100644
> index 000000000000..7b663c1f08f4
> --- /dev/null
> +++ b/arch/x86/kernel/dbg-tables/gamma.c
> @@ -0,0 +1,18 @@
> +#define pr_fmt(fmt) "debug-gamma: " fmt
> +
> +#include <linux/kernel.h>
> +#include <asm/x86_init.h>
> +
> +bool x86_dbg_detect_gamma(void)
> +{
> +	return true;
> +}
> +
> +static void early_init_dbg_gamma(void)
> +{
> +	pr_info("early_init triggered\n");
> +}
> +
> +x86_init_early_pc(x86_dbg_detect_gamma,
> +		  NULL,
> +		  early_init_dbg_gamma);
> diff --git a/arch/x86/kernel/dbg-tables/gamma.h b/arch/x86/kernel/dbg-tables/gamma.h
> new file mode 100644
> index 000000000000..810d450ddd14
> --- /dev/null
> +++ b/arch/x86/kernel/dbg-tables/gamma.h
> @@ -0,0 +1,3 @@
> +#include <asm/x86_init.h>
> +
> +bool x86_dbg_detect_gamma(void);

OK, now that makes sense. I would split the debug functionality
in a seperate patch. And update the description in the Kconfig 
to say what you would expect.

> diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
> index 2911ef3a9f1c..d93f3e42e61b 100644
> --- a/arch/x86/kernel/head32.c
> +++ b/arch/x86/kernel/head32.c
> @@ -19,6 +19,7 @@
>  #include <asm/bios_ebda.h>
>  #include <asm/tlbflush.h>
>  #include <asm/bootparam_utils.h>
> +#include <asm/x86_init.h>
>  
>  static void __init i386_default_early_setup(void)
>  {
> @@ -47,5 +48,8 @@ asmlinkage __visible void __init i386_start_kernel(void)
>  		break;
>  	}
>  
> +	x86_init_fn_init_tables();
> +	x86_init_fn_early_init();
> +
>  	start_kernel();
>  }
> diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
> index f129a9af6357..f83263a8d0ed 100644
> --- a/arch/x86/kernel/head64.c
> +++ b/arch/x86/kernel/head64.c
> @@ -28,6 +28,7 @@
>  #include <asm/bootparam_utils.h>
>  #include <asm/microcode.h>
>  #include <asm/kasan.h>
> +#include <asm/x86_init.h>
>  
>  /*
>   * Manage page tables very early on.
> @@ -190,6 +191,9 @@ void __init x86_64_start_reservations(char *real_mode_data)
>  	if (!boot_params.hdr.version)
>  		copy_bootdata(__va(real_mode_data));
>  
> +	x86_init_fn_init_tables();
> +	x86_init_fn_early_init();
> +
>  	reserve_ebda_region();
>  
>  	start_kernel();
> diff --git a/arch/x86/kernel/init.c b/arch/x86/kernel/init.c
> new file mode 100644
> index 000000000000..5f9b662e2b34
> --- /dev/null
> +++ b/arch/x86/kernel/init.c
> @@ -0,0 +1,55 @@
> +#define pr_fmt(fmt) "x86-init: " fmt
> +
> +#include <linux/bug.h>
> +#include <linux/kernel.h>
> +
> +#include <asm/x86_init_fn.h>
> +#include <asm/bootparam.h>
> +#include <asm/boot.h>
> +#include <asm/setup.h>
> +
> +extern struct x86_init_fn __tbl_x86_start_init_fns[], __tbl_x86_end_init_fns[];
> +
> +static bool x86_init_fn_supports_subarch(struct x86_init_fn *fn)
> +{
> +	if (!fn->supp_hardware_subarch) {
> +		pr_err("Init sequence fails to declares any supported subarchs: %pF\n", fn->early_init);
> +		WARN_ON(1);
> +	}
> +	if (BIT(boot_params.hdr.hardware_subarch) & fn->supp_hardware_subarch)
> +		return true;
> +	return false;
> +}
> +
> +void x86_init_fn_early_init(void)
> +{
> +	int ret;
> +	struct x86_init_fn *init_fn;
> +	unsigned int num_inits = table_num_entries(X86_INIT_FNS);
> +
> +	if (!num_inits)
> +		return;
> +
> +	pr_debug("Number of init entries: %d\n", num_inits);
> +
> +	for_each_table_entry(init_fn, X86_INIT_FNS) {
> +		if (!x86_init_fn_supports_subarch(init_fn))
> +			continue;
> +		if (!init_fn->detect)
> +			init_fn->flags |= X86_INIT_DETECTED;
> +		else {
> +			ret = init_fn->detect();
> +			if (ret > 0)
> +				init_fn->flags |= X86_INIT_DETECTED;
> +		}
> +
> +		if (init_fn->flags & X86_INIT_DETECTED) {
> +			init_fn->flags |= X86_INIT_DETECTED;

Huh? It is already set.
> +			pr_debug("Running early init %pF ...\n", init_fn->early_init);
> +			init_fn->early_init();
> +			pr_debug("Completed early init %pF\n", init_fn->early_init);
> +			if (init_fn->flags & X86_INIT_FINISH_IF_DETECTED)
> +				break;
> +		}
> +	}
> +}
> diff --git a/arch/x86/kernel/sort-init.c b/arch/x86/kernel/sort-init.c
> new file mode 100644
> index 000000000000..f230f3ddb0aa
> --- /dev/null
> +++ b/arch/x86/kernel/sort-init.c
> @@ -0,0 +1,114 @@
> +#include <linux/types.h>
> +#include <linux/kernel.h>
> +#include <linux/string.h>
> +#include <asm/x86_init_fn.h>
> +
> +extern struct x86_init_fn __tbl_x86_start_init_fns[], __tbl_x86_end_init_fns[];
> +
> +static struct x86_init_fn *x86_init_fn_find_dep(struct x86_init_fn *start,
> +						struct x86_init_fn *finish,
> +						struct x86_init_fn *q)
> +{
> +	struct x86_init_fn *p;
> +
> +	if (!q)
> +		return NULL;
> +
> +	for (p = start; p < finish; p++)
> +		if (p->detect == q->depend)
> +			return p;
> +
> +	return NULL;
> +}
> +
> +static void x86_init_fn_sort(struct x86_init_fn *start,
> +			     struct x86_init_fn *finish)
> +{
> +
> +	struct x86_init_fn *p, *q, tmp;
> +
> +	for (p = start; p < finish; p++) {
> +again:
> +		q = x86_init_fn_find_dep(start, finish, p);
> +		/*
> +		 * We are bit sneaky here. We use the memory address to figure
> +		 * out if the node we depend on is past our point, if so, swap.
> +		 */
> +		if (q > p) {
> +			tmp = *p;
> +			memmove(p, q, sizeof(*p));
> +			*q = tmp;
> +			goto again;
> +		}
> +	}
> +
> +}
> +
> +static void x86_init_fn_check(struct x86_init_fn *start,
> +			      struct x86_init_fn *finish)
> +{
> +	struct x86_init_fn *p, *q, *x;
> +
> +	/* Simple cyclic dependency checker. */
> +	for (p = start; p < finish; p++) {
> +		if (!p->depend)
> +			continue;
> +		q = x86_init_fn_find_dep(start, finish, p);
> +		x = x86_init_fn_find_dep(start, finish, q);
> +		if (p == x) {
> +			pr_info("CYCLIC DEPENDENCY FOUND! %pF depends on %pF and vice-versa. BREAKING IT.\n",
> +				p->early_init, q->early_init);
> +			/* Heavy handed way..*/
> +			x->depend = 0;
> +		}
> +	}
> +
> +	/*
> +	 * Validate sorting semantics.
> +	 *
> +	 * p depends on q so:
> +	 * 	- q must run first, so q < p. If q > p that's an issue
> +	 * 	  as its saying p must run prior to q. We already sorted
> +	 * 	  this table, this is a problem.
> +	 *
> +	 * 	- q's order level must be <= than p's as it should run first
> +	 */
> +	for (p = start; p < finish; p++) {
> +		if (!p->depend)
> +			continue;
> +		/*
> +		 * Be pedantic and do a full search on the entire table,
> +		 * if we need further validation, after this is called
> +		 * one could use an optimized version which just searches
> +		 * on x86_init_fn_find_dep(p, finish, p), as we would have
> +		 * guarantee on proper ordering both at the dependency level
> +		 * and by order level.
> +		 */
> +		q = x86_init_fn_find_dep(start, finish, p);
> +		if (q && q > p) {
> +			pr_info("EXECUTION ORDER INVALID! %pF should be called before %pF!\n",
> +				p->early_init, q->early_init);
> +		}
> +
> +		/*
> +		 * Technically this would still work as the memmove() would
> +		 * have forced the dependency to run first, however we want
> +		 * strong semantics, so lets avoid these.
> +		 */
> +		if (q && q->order_level > p->order_level) {
> +			pr_info("INVALID ORDER LEVEL! %pF should have an order level <= be called before %pF!\n",
> +				p->early_init, q->early_init);
> +		}
> +	}
> +}
> +
> +void x86_init_fn_init_tables(void)
> +{
> +	unsigned int num_inits = table_num_entries(X86_INIT_FNS);
> +
> +	if (!num_inits)
> +		return;
> +
> +	x86_init_fn_sort(__tbl_x86_start_init_fns, __tbl_x86_end_init_fns);
> +	x86_init_fn_check(__tbl_x86_start_init_fns, __tbl_x86_end_init_fns);
> +}
> diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S
> index 74e4bf11f562..75c8f3f80e73 100644
> --- a/arch/x86/kernel/vmlinux.lds.S
> +++ b/arch/x86/kernel/vmlinux.lds.S
> @@ -265,6 +265,31 @@ SECTIONS
>  		__apicdrivers_end = .;
>  	}
>  
> +	/*
> +	 * x86 linker tables: this will sort all order levels
> +	 * lexicographically. Something like SORT_BY_INIT_PRIORITY()
> +	 * which sorts specifically on numeric order is desirable but
> +	 * that would impose a change on binutils to generalize
> +	 * SORT_BY_INIT_PRIORITY() for any section, SORT_BY_INIT_PRIORITY()
> +	 * is specific to the init sections, and that would also mean having
> +	 * a bump on requirments for building Linux. Using SORT() should
> +	 * suffice, * its what gpxe uses. For things in the same order
> +	 * level we rely on order in the C file, and also order on the
> +	 * Makefile. Since this solution also embraces the IOMMU init solution
> +	 * it has further sorting semantics implemented in C and its semantics
> +	 * are defined in x86_init_fn.h and implemented in sort-init.c.
> +	 */
> +	.tbl            : {
> +		__tbl_x86_start_init_fns = .;
> +		*(SORT(.tbl.x86_init_fns.*))
> +		__tbl_x86_end_init_fns = .;
> +
> +		/* ... etc ... */
> +
> +		/* You would add other tables here as needed */
> +	}
> +  . = ALIGN(8);
> +

There is an extra .= ALIGN(8) there ?

>  	. = ALIGN(8);
>  	/*
>  	 * .exit.text is discard at runtime, not link time, to deal with
> diff --git a/arch/x86/tools/relocs.c b/arch/x86/tools/relocs.c
> index 0c2fae8d929d..22b1616de37c 100644
> --- a/arch/x86/tools/relocs.c
> +++ b/arch/x86/tools/relocs.c
> @@ -56,6 +56,7 @@ static const char * const sym_regex_kernel[S_NSYMTYPES] = {
>  	"__x86_cpu_dev_(start|end)|"
>  	"(__parainstructions|__alt_instructions)(|_end)|"
>  	"(__iommu_table|__apicdrivers|__smp_locks)(|_end)|"
> +	"(__tbl_x86_(start|end)_init_fns|"
>  	"__(start|end)_pci_.*|"
>  	"__(start|end)_builtin_fw|"
>  	"__(start|stop)___ksymtab(|_gpl|_unused|_unused_gpl|_gpl_future)|"
> -- 
> 2.6.2
> 

  reply	other threads:[~2016-01-20 20:45 UTC|newest]

Thread overview: 70+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-15 22:16 [RFC v1 0/8] x86/init: Linux linker tables Luis R. Rodriguez
2015-12-15 22:16 ` [RFC v1 1/8] paravirt: rename paravirt_enabled to paravirt_legacy Luis R. Rodriguez
2016-01-20 19:32   ` Konrad Rzeszutek Wilk
2016-02-04 22:50     ` Luis R. Rodriguez
2015-12-15 22:16 ` [RFC v1 2/8] tables.h: add linker table support Luis R. Rodriguez
2016-01-20 20:04   ` Konrad Rzeszutek Wilk
2016-01-20 23:15     ` Michael Brown
2016-01-20 23:24       ` H. Peter Anvin
2015-12-15 22:16 ` [RFC v1 3/8] x86/boot: add BIT() to boot/bitops.h Luis R. Rodriguez
2016-01-20 20:17   ` Konrad Rzeszutek Wilk
2016-01-20 20:33     ` Luis R. Rodriguez
2015-12-15 22:16 ` [RFC v1 4/8] x86/init: add linker table support Luis R. Rodriguez
2016-01-20 20:45   ` Konrad Rzeszutek Wilk [this message]
2016-01-20 21:00   ` Konrad Rzeszutek Wilk
2016-01-20 21:33     ` Luis R. Rodriguez
2016-01-20 21:41       ` H. Peter Anvin
2016-01-20 22:12         ` Luis R. Rodriguez
2016-01-20 22:20           ` H. Peter Anvin
2016-01-22  0:25             ` Luis R. Rodriguez
2016-01-22  0:42               ` H. Peter Anvin
2016-02-11 20:45                 ` Luis R. Rodriguez
2016-01-21  8:38       ` Roger Pau Monné
2016-01-21 13:45         ` Boris Ostrovsky
2016-01-21 19:25           ` H. Peter Anvin
2016-01-21 19:46             ` Luis R. Rodriguez
2016-01-21 19:50               ` H. Peter Anvin
2016-01-21 19:52                 ` H. Peter Anvin
2016-01-22  0:19                   ` Luis R. Rodriguez
2016-01-21 20:05                 ` Luis R. Rodriguez
2016-01-21 21:36                   ` H. Peter Anvin
2015-12-15 22:16 ` [RFC v1 5/8] x86/init: move ebda reservations into linker table Luis R. Rodriguez
2015-12-17 20:48   ` Andy Lutomirski
2015-12-17 20:55     ` H. Peter Anvin
2015-12-17 20:57       ` Andy Lutomirski
2015-12-17 23:40         ` Luis R. Rodriguez
2016-01-20 20:46   ` Konrad Rzeszutek Wilk
2015-12-15 22:16 ` [RFC v1 6/8] x86/init: use linker table for i386 early setup Luis R. Rodriguez
2016-01-20 21:14   ` Konrad Rzeszutek Wilk
2016-01-20 21:41     ` Luis R. Rodriguez
2016-02-11 19:55       ` Luis R. Rodriguez
2015-12-15 22:16 ` [RFC v1 7/8] x86/init: user linker table for ce4100 " Luis R. Rodriguez
2016-01-20 21:14   ` Konrad Rzeszutek Wilk
2015-12-15 22:16 ` [RFC v1 8/8] x86/init: use linker table for mid " Luis R. Rodriguez
2016-01-20 21:15   ` Konrad Rzeszutek Wilk
2015-12-15 22:59 ` [RFC v1 0/8] x86/init: Linux linker tables H. Peter Anvin
2015-12-17 20:38 ` H. Peter Anvin
2015-12-17 23:46   ` Luis R. Rodriguez
2015-12-17 23:58     ` Luis R. Rodriguez
2015-12-18  4:25     ` H. Peter Anvin
2015-12-18  4:40       ` H. Peter Anvin
2016-01-21 20:19         ` H. Peter Anvin
2016-01-21 20:33           ` Luis R. Rodriguez
2016-01-21 21:37             ` Konrad Rzeszutek Wilk
2016-01-21 22:25               ` [Xen-devel] " Luis R. Rodriguez
2016-01-21 23:56                 ` H. Peter Anvin
2016-01-22  0:28                   ` Luis R. Rodriguez
2016-01-22  8:15               ` Michael Brown
2016-01-22 13:44           ` Michael Matz
2016-01-22 19:06             ` H. Peter Anvin
2016-01-22 21:52               ` Luis R. Rodriguez
2016-02-03  0:22                 ` Luis R. Rodriguez
2016-02-03  0:25                   ` H. Peter Anvin
2016-02-03  0:28                     ` Luis R. Rodriguez
2016-02-03  0:48                       ` Luis R. Rodriguez
2016-02-02 23:48             ` H. Peter Anvin
2016-02-03  0:15               ` Luis R. Rodriguez
2015-12-18 18:50       ` Luis R. Rodriguez
2015-12-18 18:58         ` H. Peter Anvin
2016-01-20 21:16 ` Konrad Rzeszutek Wilk
2016-01-20 21:49   ` Luis R. Rodriguez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160120204501.GD4769@char.us.oracle.com \
    --to=konrad.wilk@oracle.com \
    --cc=JBeulich@suse.com \
    --cc=andreyknvl@google.com \
    --cc=aryabinin@virtuozzo.com \
    --cc=boris.ostrovsky@oracle.com \
    --cc=bp@alien8.de \
    --cc=hpa@zytor.com \
    --cc=jgross@suse.com \
    --cc=joro@8bytes.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=long.wanglong@huawei.com \
    --cc=luto@amacapital.net \
    --cc=mcb30@ipxe.org \
    --cc=mcgrof@do-not-panic.com \
    --cc=mcgrof@suse.com \
    --cc=mchehab@osg.samsung.com \
    --cc=mingo@redhat.com \
    --cc=peter.senna@gmail.com \
    --cc=qiuxishi@huawei.com \
    --cc=rusty@rustcorp.com.au \
    --cc=ryabinin.a.a@gmail.com \
    --cc=tglx@linutronix.de \
    --cc=valentinrothberg@gmail.com \
    --cc=x86@kernel.org \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).