Commit 7ce23746 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] x86_64 .init.setup alignment fix

We're now putting 24-byte structures into .init.setup via __setup.  But
x86_64's compiler is emitting a `.align 16' in there, so they end up on
32-byte boundaries and do_early_param()'s pointer arithmetic goes wrong.

Fix that up by forcing the compiler to align these structures to sizeof(long).

Cc: Andi Kleen <ak@muc.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 4bba626e
...@@ -113,12 +113,18 @@ struct obs_kernel_param { ...@@ -113,12 +113,18 @@ struct obs_kernel_param {
int early; int early;
}; };
/* Only for really core code. See moduleparam.h for the normal way. */ /*
* Only for really core code. See moduleparam.h for the normal way.
*
* Force the alignment so the compiler doesn't space elements of the
* obs_kernel_param "array" too far apart in .init.setup.
*/
#define __setup_param(str, unique_id, fn, early) \ #define __setup_param(str, unique_id, fn, early) \
static char __setup_str_##unique_id[] __initdata = str; \ static char __setup_str_##unique_id[] __initdata = str; \
static struct obs_kernel_param __setup_##unique_id \ static struct obs_kernel_param __setup_##unique_id \
__attribute_used__ \ __attribute_used__ \
__attribute__((__section__(".init.setup"))) \ __attribute__((__section__(".init.setup"))) \
__attribute__((aligned((sizeof(long))))) \
= { __setup_str_##unique_id, fn, early } = { __setup_str_##unique_id, fn, early }
#define __setup_null_param(str, unique_id) \ #define __setup_null_param(str, unique_id) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment