|
@@ -116,8 +116,24 @@
|
|
typedef int (*initcall_t)(void);
|
|
typedef int (*initcall_t)(void);
|
|
typedef void (*exitcall_t)(void);
|
|
typedef void (*exitcall_t)(void);
|
|
|
|
|
|
-extern initcall_t __con_initcall_start[], __con_initcall_end[];
|
|
|
|
-extern initcall_t __security_initcall_start[], __security_initcall_end[];
|
|
|
|
|
|
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
|
|
|
|
+typedef int initcall_entry_t;
|
|
|
|
+
|
|
|
|
+static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
|
|
|
|
+{
|
|
|
|
+ return offset_to_ptr(entry);
|
|
|
|
+}
|
|
|
|
+#else
|
|
|
|
+typedef initcall_t initcall_entry_t;
|
|
|
|
+
|
|
|
|
+static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
|
|
|
|
+{
|
|
|
|
+ return *entry;
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+extern initcall_entry_t __con_initcall_start[], __con_initcall_end[];
|
|
|
|
+extern initcall_entry_t __security_initcall_start[], __security_initcall_end[];
|
|
|
|
|
|
/* Used for contructor calls. */
|
|
/* Used for contructor calls. */
|
|
typedef void (*ctor_fn_t)(void);
|
|
typedef void (*ctor_fn_t)(void);
|
|
@@ -167,9 +183,20 @@ extern bool initcall_debug;
|
|
* as KEEP() in the linker script.
|
|
* as KEEP() in the linker script.
|
|
*/
|
|
*/
|
|
|
|
|
|
-#define __define_initcall(fn, id) \
|
|
|
|
|
|
+#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
|
|
|
|
+#define ___define_initcall(fn, id, __sec) \
|
|
|
|
+ __ADDRESSABLE(fn) \
|
|
|
|
+ asm(".section \"" #__sec ".init\", \"a\" \n" \
|
|
|
|
+ "__initcall_" #fn #id ": \n" \
|
|
|
|
+ ".long " #fn " - . \n" \
|
|
|
|
+ ".previous \n");
|
|
|
|
+#else
|
|
|
|
+#define ___define_initcall(fn, id, __sec) \
|
|
static initcall_t __initcall_##fn##id __used \
|
|
static initcall_t __initcall_##fn##id __used \
|
|
- __attribute__((__section__(".initcall" #id ".init"))) = fn;
|
|
|
|
|
|
+ __attribute__((__section__(#__sec ".init"))) = fn;
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+#define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
|
|
|
|
|
|
/*
|
|
/*
|
|
* Early initcalls run before initializing SMP.
|
|
* Early initcalls run before initializing SMP.
|
|
@@ -208,13 +235,8 @@ extern bool initcall_debug;
|
|
#define __exitcall(fn) \
|
|
#define __exitcall(fn) \
|
|
static exitcall_t __exitcall_##fn __exit_call = fn
|
|
static exitcall_t __exitcall_##fn __exit_call = fn
|
|
|
|
|
|
-#define console_initcall(fn) \
|
|
|
|
- static initcall_t __initcall_##fn \
|
|
|
|
- __used __section(.con_initcall.init) = fn
|
|
|
|
-
|
|
|
|
-#define security_initcall(fn) \
|
|
|
|
- static initcall_t __initcall_##fn \
|
|
|
|
- __used __section(.security_initcall.init) = fn
|
|
|
|
|
|
+#define console_initcall(fn) ___define_initcall(fn,, .con_initcall)
|
|
|
|
+#define security_initcall(fn) ___define_initcall(fn,, .security_initcall)
|
|
|
|
|
|
struct obs_kernel_param {
|
|
struct obs_kernel_param {
|
|
const char *str;
|
|
const char *str;
|