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
>
next prev parent 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).