VServer 1.9.2 (patch-2.6.8.1-vs1.9.2.diff)
[linux-2.6.git] / include / linux / init.h
index 45069e2..7a9f699 100644 (file)
@@ -66,6 +66,9 @@ typedef void (*exitcall_t)(void);
 
 extern initcall_t __con_initcall_start, __con_initcall_end;
 extern initcall_t __security_initcall_start, __security_initcall_end;
+
+/* Defined in init/main.c */
+extern char saved_command_line[];
 #endif
   
 #ifndef MODULE
@@ -107,25 +110,39 @@ extern initcall_t __security_initcall_start, __security_initcall_end;
 struct obs_kernel_param {
        const char *str;
        int (*setup_func)(char *);
+       int early;
 };
 
-/* OBSOLETE: see moduleparam.h for the right way. */
-#define __setup_param(str, unique_id, fn)                      \
+/*
+ * 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)                       \
        static char __setup_str_##unique_id[] __initdata = str; \
        static struct obs_kernel_param __setup_##unique_id      \
-                __attribute_used__                             \
-                __attribute__((__section__(".init.setup")))    \
-               = { __setup_str_##unique_id, fn }
+               __attribute_used__                              \
+               __attribute__((__section__(".init.setup")))     \
+               __attribute__((aligned((sizeof(long)))))        \
+               = { __setup_str_##unique_id, fn, early }
 
 #define __setup_null_param(str, unique_id)                     \
-       __setup_param(str, unique_id, NULL)
+       __setup_param(str, unique_id, NULL, 0)
 
 #define __setup(str, fn)                                       \
-       __setup_param(str, fn, fn)
+       __setup_param(str, fn, fn, 0)
 
 #define __obsolete_setup(str)                                  \
        __setup_null_param(str, __LINE__)
 
+/* NOTE: fn is as per module_param, not __setup!  Emits warning if fn
+ * returns non-zero. */
+#define early_param(str, fn)                                   \
+       __setup_param(str, fn, fn, 1)
+
+/* Relies on saved_command_line being set */
+void __init parse_early_param(void);
 #endif /* __ASSEMBLY__ */
 
 /**