Rusty Russell
2007-Apr-18 13:02 UTC
[PATCH] lguest: clean rest of linkage warnings (bar one)
My previous warning fix broke lguest if your text size wasn't correct to make the __start_paravirtprobe aligned correctly. Put the separate paravirtprobe section back, but inside the init section so it gets discarded. It also fixes the remaining warnings, except one. The code in modpost.c which needs to be taught that it's legal to link from .paravirtprobe to .init.text is horrible, and I'm pretty sure I'd just make it worse. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> diff -r a38b5b461807 arch/i386/kernel/vmlinux.lds.S --- a/arch/i386/kernel/vmlinux.lds.S Thu Mar 22 19:28:55 2007 +1100 +++ b/arch/i386/kernel/vmlinux.lds.S Thu Mar 22 20:12:26 2007 +1100 @@ -145,12 +145,7 @@ SECTIONS *(.init.text) _einittext = .; } - .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { - *(.init.data) - __start_paravirtprobe = .; - *(.paravirtprobe) - __stop_paravirtprobe = .; - } + .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) } . = ALIGN(16); .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { __setup_start = .; @@ -178,6 +173,11 @@ SECTIONS *(.altinstr_replacement) } . = ALIGN(4); + .paravirtprobe : AT(ADDR(.paravirtprobe) - LOAD_OFFSET) { + __start_paravirtprobe = .; + *(.paravirtprobe) + __stop_paravirtprobe = .; + } .parainstructions : AT(ADDR(.parainstructions) - LOAD_OFFSET) { __start_parainstructions = .; *(.parainstructions) diff -r a38b5b461807 arch/i386/lguest/core.c --- a/arch/i386/lguest/core.c Thu Mar 22 19:28:55 2007 +1100 +++ b/arch/i386/lguest/core.c Thu Mar 22 20:21:21 2007 +1100 @@ -131,7 +131,7 @@ free_some_pages: return err; } -static __exit void unmap_hypervisor(void) +static void unmap_hypervisor(void) { unsigned int i; diff -r a38b5b461807 arch/i386/lguest/lg.h --- a/arch/i386/lguest/lg.h Thu Mar 22 19:28:55 2007 +1100 +++ b/arch/i386/lguest/lg.h Thu Mar 22 20:20:15 2007 +1100 @@ -38,7 +38,7 @@ struct lguest_regs u32 ss; }; -__exit void free_pagetables(void); +void free_pagetables(void); __init int init_pagetables(struct page **hype_page, int pages); /* Full 4G segment descriptors, suitable for CS and DS. */ diff -r a38b5b461807 arch/i386/lguest/lguest.c --- a/arch/i386/lguest/lguest.c Thu Mar 22 19:28:55 2007 +1100 +++ b/arch/i386/lguest/lguest.c Thu Mar 22 20:40:22 2007 +1100 @@ -550,7 +550,7 @@ static __attribute_used__ __init void lg start_kernel(); } -asm(".section .init.text\n" +asm(".pushsection .init.text,\"ax\",@progbits\n" "lguest_maybe_init:\n" " cmpl $"__stringify(LGUEST_MAGIC_EBP)", %ebp\n" " jne 1f\n" @@ -558,6 +558,7 @@ asm(".section .init.text\n" " jne 1f\n" " cmpl $"__stringify(LGUEST_MAGIC_ESI)", %esi\n" " je lguest_init\n" - "1: ret"); + "1: ret\n" + ".popsection"); extern void asmlinkage lguest_maybe_init(void); paravirt_probe(lguest_maybe_init); diff -r a38b5b461807 arch/i386/lguest/page_tables.c --- a/arch/i386/lguest/page_tables.c Thu Mar 22 19:28:55 2007 +1100 +++ b/arch/i386/lguest/page_tables.c Thu Mar 22 20:06:03 2007 +1100 @@ -381,7 +381,7 @@ __init int init_pagetables(struct page * return 0; } -__exit void free_pagetables(void) +void free_pagetables(void) { free_hypervisor_pte_pages(); }
Rusty Russell
2007-Apr-18 13:02 UTC
[PATCH] lguest: clean up some l"references .init.text" warnings
Thanks to Andrew for pointing these out. This patch moves the parvirtprobe section into .init.data: it's only used in very very early boot, and for similar reasons, puts lguest_maybe_init and lguest_memory_setup in init.text. As well as fixing some warnings, this frees up a tiny bit more memory. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> diff -r ecec388180b2 arch/i386/kernel/vmlinux.lds.S --- a/arch/i386/kernel/vmlinux.lds.S Mon Mar 19 14:58:08 2007 +1100 +++ b/arch/i386/kernel/vmlinux.lds.S Tue Mar 20 12:10:39 2007 +1100 @@ -81,12 +81,6 @@ SECTIONS CONSTRUCTORS } :data - .paravirtprobe : AT(ADDR(.paravirtprobe) - LOAD_OFFSET) { - __start_paravirtprobe = .; - *(.paravirtprobe) - __stop_paravirtprobe = .; - } - . = ALIGN(4096); .data_nosave : AT(ADDR(.data_nosave) - LOAD_OFFSET) { __nosave_begin = .; @@ -151,7 +145,12 @@ SECTIONS *(.init.text) _einittext = .; } - .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { *(.init.data) } + .init.data : AT(ADDR(.init.data) - LOAD_OFFSET) { + *(.init.data) + __start_paravirtprobe = .; + *(.paravirtprobe) + __stop_paravirtprobe = .; + } . = ALIGN(16); .init.setup : AT(ADDR(.init.setup) - LOAD_OFFSET) { __setup_start = .; diff -r ecec388180b2 arch/i386/lguest/lguest.c --- a/arch/i386/lguest/lguest.c Mon Mar 19 14:58:08 2007 +1100 +++ b/arch/i386/lguest/lguest.c Tue Mar 20 11:34:07 2007 +1100 @@ -136,7 +136,7 @@ static struct notifier_block paniced = { .notifier_call = lguest_panic }; -static char *lguest_memory_setup(void) +static __init char *lguest_memory_setup(void) { /* We do this here because lockcheck barfs if before start_kernel */ atomic_notifier_chain_register(&panic_notifier_list, &paniced); @@ -549,7 +549,8 @@ static __attribute_used__ __init void lg start_kernel(); } -asm("lguest_maybe_init:\n" +asm(".section .init.text\n" + "lguest_maybe_init:\n" " cmpl $"__stringify(LGUEST_MAGIC_EBP)", %ebp\n" " jne 1f\n" " cmpl $"__stringify(LGUEST_MAGIC_EDI)", %edi\n"