linux/arch/um/include/shared/init.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _LINUX_UML_INIT_H
   3#define _LINUX_UML_INIT_H
   4
   5/* These macros are used to mark some functions or
   6 * initialized data (doesn't apply to uninitialized data)
   7 * as `initialization' functions. The kernel can take this
   8 * as hint that the function is used only during the initialization
   9 * phase and free up used memory resources after
  10 *
  11 * Usage:
  12 * For functions:
  13 *
  14 * You should add __init immediately before the function name, like:
  15 *
  16 * static void __init initme(int x, int y)
  17 * {
  18 *    extern int z; z = x * y;
  19 * }
  20 *
  21 * If the function has a prototype somewhere, you can also add
  22 * __init between closing brace of the prototype and semicolon:
  23 *
  24 * extern int initialize_foobar_device(int, int, int) __init;
  25 *
  26 * For initialized data:
  27 * You should insert __initdata between the variable name and equal
  28 * sign followed by value, e.g.:
  29 *
  30 * static int init_variable __initdata = 0;
  31 * static const char linux_logo[] __initconst = { 0x32, 0x36, ... };
  32 *
  33 * Don't forget to initialize data not at file scope, i.e. within a function,
  34 * as gcc otherwise puts the data into the bss section and not into the init
  35 * section.
  36 *
  37 * Also note, that this data cannot be "const".
  38 */
  39
  40#ifndef _LINUX_INIT_H
  41typedef int (*initcall_t)(void);
  42typedef void (*exitcall_t)(void);
  43
  44#include <linux/compiler_types.h>
  45
  46/* These are for everybody (although not all archs will actually
  47   discard it in modules) */
  48#define __init          __section(".init.text")
  49#define __initdata      __section(".init.data")
  50#define __exitdata      __section(".exit.data")
  51#define __exit_call     __used __section(".exitcall.exit")
  52
  53#ifdef MODULE
  54#define __exit          __section(".exit.text")
  55#else
  56#define __exit          __used __section(".exit.text")
  57#endif
  58
  59#endif
  60
  61#ifndef MODULE
  62struct uml_param {
  63        const char *str;
  64        int (*setup_func)(char *, int *);
  65};
  66
  67extern initcall_t __uml_postsetup_start, __uml_postsetup_end;
  68extern const char *__uml_help_start, *__uml_help_end;
  69#endif
  70
  71#define __uml_exitcall(fn)                                              \
  72        static exitcall_t __uml_exitcall_##fn __uml_exit_call = fn
  73
  74extern struct uml_param __uml_setup_start, __uml_setup_end;
  75
  76#define __uml_postsetup(fn)                                             \
  77        static initcall_t __uml_postsetup_##fn __uml_postsetup_call = fn
  78
  79#define __non_empty_string(dummyname,string)                            \
  80        struct __uml_non_empty_string_struct_##dummyname                \
  81        {                                                               \
  82                char _string[sizeof(string)-2];                         \
  83        }
  84
  85#ifndef MODULE
  86#define __uml_setup(str, fn, help...)                                   \
  87        __non_empty_string(fn ##_setup, str);                           \
  88        __uml_help(fn, help);                                           \
  89        static char __uml_setup_str_##fn[] __initdata = str;            \
  90        static struct uml_param __uml_setup_##fn __uml_init_setup = { __uml_setup_str_##fn, fn }
  91#else
  92#define __uml_setup(str, fn, help...)                                   \
  93
  94#endif
  95
  96#define __uml_help(fn, help...)                                         \
  97        __non_empty_string(fn ##__help, help);                          \
  98        static char __uml_help_str_##fn[] __initdata = help;            \
  99        static const char *__uml_help_##fn __uml_setup_help = __uml_help_str_##fn
 100
 101/*
 102 * Mark functions and data as being only used at initialization
 103 * or exit time.
 104 */
 105#define __uml_init_setup        __used __section(".uml.setup.init")
 106#define __uml_setup_help        __used __section(".uml.help.init")
 107#define __uml_postsetup_call    __used __section(".uml.postsetup.init")
 108#define __uml_exit_call         __used __section(".uml.exitcall.exit")
 109
 110#ifdef __UM_HOST__
 111
 112#define __define_initcall(level,fn) \
 113        static initcall_t __initcall_##fn __used \
 114        __attribute__((__section__(".initcall" level ".init"))) = fn
 115
 116/* Userspace initcalls shouldn't depend on anything in the kernel, so we'll
 117 * make them run first.
 118 */
 119#define __initcall(fn) __define_initcall("1", fn)
 120
 121#define __exitcall(fn) static exitcall_t __exitcall_##fn __exit_call = fn
 122
 123#define __init_call     __used __section(".initcall.init")
 124
 125#endif
 126
 127#endif /* _LINUX_UML_INIT_H */
 128