cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

init.h (11963B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _LINUX_INIT_H
      3#define _LINUX_INIT_H
      4
      5#include <linux/compiler.h>
      6#include <linux/types.h>
      7
      8/* Built-in __init functions needn't be compiled with retpoline */
      9#if defined(__noretpoline) && !defined(MODULE)
     10#define __noinitretpoline __noretpoline
     11#else
     12#define __noinitretpoline
     13#endif
     14
     15/* These macros are used to mark some functions or 
     16 * initialized data (doesn't apply to uninitialized data)
     17 * as `initialization' functions. The kernel can take this
     18 * as hint that the function is used only during the initialization
     19 * phase and free up used memory resources after
     20 *
     21 * Usage:
     22 * For functions:
     23 * 
     24 * You should add __init immediately before the function name, like:
     25 *
     26 * static void __init initme(int x, int y)
     27 * {
     28 *    extern int z; z = x * y;
     29 * }
     30 *
     31 * If the function has a prototype somewhere, you can also add
     32 * __init between closing brace of the prototype and semicolon:
     33 *
     34 * extern int initialize_foobar_device(int, int, int) __init;
     35 *
     36 * For initialized data:
     37 * You should insert __initdata or __initconst between the variable name
     38 * and equal sign followed by value, e.g.:
     39 *
     40 * static int init_variable __initdata = 0;
     41 * static const char linux_logo[] __initconst = { 0x32, 0x36, ... };
     42 *
     43 * Don't forget to initialize data not at file scope, i.e. within a function,
     44 * as gcc otherwise puts the data into the bss section and not into the init
     45 * section.
     46 */
     47
     48/* These are for everybody (although not all archs will actually
     49   discard it in modules) */
     50#define __init		__section(".init.text") __cold  __latent_entropy __noinitretpoline __nocfi
     51#define __initdata	__section(".init.data")
     52#define __initconst	__section(".init.rodata")
     53#define __exitdata	__section(".exit.data")
     54#define __exit_call	__used __section(".exitcall.exit")
     55
     56/*
     57 * modpost check for section mismatches during the kernel build.
     58 * A section mismatch happens when there are references from a
     59 * code or data section to an init section (both code or data).
     60 * The init sections are (for most archs) discarded by the kernel
     61 * when early init has completed so all such references are potential bugs.
     62 * For exit sections the same issue exists.
     63 *
     64 * The following markers are used for the cases where the reference to
     65 * the *init / *exit section (code or data) is valid and will teach
     66 * modpost not to issue a warning.  Intended semantics is that a code or
     67 * data tagged __ref* can reference code or data from init section without
     68 * producing a warning (of course, no warning does not mean code is
     69 * correct, so optimally document why the __ref is needed and why it's OK).
     70 *
     71 * The markers follow same syntax rules as __init / __initdata.
     72 */
     73#define __ref            __section(".ref.text") noinline
     74#define __refdata        __section(".ref.data")
     75#define __refconst       __section(".ref.rodata")
     76
     77#ifdef MODULE
     78#define __exitused
     79#else
     80#define __exitused  __used
     81#endif
     82
     83#define __exit          __section(".exit.text") __exitused __cold notrace
     84
     85/* Used for MEMORY_HOTPLUG */
     86#define __meminit        __section(".meminit.text") __cold notrace \
     87						  __latent_entropy
     88#define __meminitdata    __section(".meminit.data")
     89#define __meminitconst   __section(".meminit.rodata")
     90#define __memexit        __section(".memexit.text") __exitused __cold notrace
     91#define __memexitdata    __section(".memexit.data")
     92#define __memexitconst   __section(".memexit.rodata")
     93
     94/* For assembly routines */
     95#define __HEAD		.section	".head.text","ax"
     96#define __INIT		.section	".init.text","ax"
     97#define __FINIT		.previous
     98
     99#define __INITDATA	.section	".init.data","aw",%progbits
    100#define __INITRODATA	.section	".init.rodata","a",%progbits
    101#define __FINITDATA	.previous
    102
    103#define __MEMINIT        .section	".meminit.text", "ax"
    104#define __MEMINITDATA    .section	".meminit.data", "aw"
    105#define __MEMINITRODATA  .section	".meminit.rodata", "a"
    106
    107/* silence warnings when references are OK */
    108#define __REF            .section       ".ref.text", "ax"
    109#define __REFDATA        .section       ".ref.data", "aw"
    110#define __REFCONST       .section       ".ref.rodata", "a"
    111
    112#ifndef __ASSEMBLY__
    113/*
    114 * Used for initialization calls..
    115 */
    116typedef int (*initcall_t)(void);
    117typedef void (*exitcall_t)(void);
    118
    119#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
    120typedef int initcall_entry_t;
    121
    122static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
    123{
    124	return offset_to_ptr(entry);
    125}
    126#else
    127typedef initcall_t initcall_entry_t;
    128
    129static inline initcall_t initcall_from_entry(initcall_entry_t *entry)
    130{
    131	return *entry;
    132}
    133#endif
    134
    135extern initcall_entry_t __con_initcall_start[], __con_initcall_end[];
    136
    137/* Used for contructor calls. */
    138typedef void (*ctor_fn_t)(void);
    139
    140struct file_system_type;
    141
    142/* Defined in init/main.c */
    143extern int do_one_initcall(initcall_t fn);
    144extern char __initdata boot_command_line[];
    145extern char *saved_command_line;
    146extern unsigned int reset_devices;
    147
    148/* used by init/main.c */
    149void setup_arch(char **);
    150void prepare_namespace(void);
    151void __init init_rootfs(void);
    152extern struct file_system_type rootfs_fs_type;
    153
    154#if defined(CONFIG_STRICT_KERNEL_RWX) || defined(CONFIG_STRICT_MODULE_RWX)
    155extern bool rodata_enabled;
    156#endif
    157#ifdef CONFIG_STRICT_KERNEL_RWX
    158void mark_rodata_ro(void);
    159#endif
    160
    161extern void (*late_time_init)(void);
    162
    163extern bool initcall_debug;
    164
    165#endif
    166  
    167#ifndef MODULE
    168
    169#ifndef __ASSEMBLY__
    170
    171/*
    172 * initcalls are now grouped by functionality into separate
    173 * subsections. Ordering inside the subsections is determined
    174 * by link order. 
    175 * For backwards compatibility, initcall() puts the call in 
    176 * the device init subsection.
    177 *
    178 * The `id' arg to __define_initcall() is needed so that multiple initcalls
    179 * can point at the same handler without causing duplicate-symbol build errors.
    180 *
    181 * Initcalls are run by placing pointers in initcall sections that the
    182 * kernel iterates at runtime. The linker can do dead code / data elimination
    183 * and remove that completely, so the initcall sections have to be marked
    184 * as KEEP() in the linker script.
    185 */
    186
    187/* Format: <modname>__<counter>_<line>_<fn> */
    188#define __initcall_id(fn)					\
    189	__PASTE(__KBUILD_MODNAME,				\
    190	__PASTE(__,						\
    191	__PASTE(__COUNTER__,					\
    192	__PASTE(_,						\
    193	__PASTE(__LINE__,					\
    194	__PASTE(_, fn))))))
    195
    196/* Format: __<prefix>__<iid><id> */
    197#define __initcall_name(prefix, __iid, id)			\
    198	__PASTE(__,						\
    199	__PASTE(prefix,						\
    200	__PASTE(__,						\
    201	__PASTE(__iid, id))))
    202
    203#ifdef CONFIG_LTO_CLANG
    204/*
    205 * With LTO, the compiler doesn't necessarily obey link order for
    206 * initcalls. In order to preserve the correct order, we add each
    207 * variable into its own section and generate a linker script (in
    208 * scripts/link-vmlinux.sh) to specify the order of the sections.
    209 */
    210#define __initcall_section(__sec, __iid)			\
    211	#__sec ".init.." #__iid
    212
    213/*
    214 * With LTO, the compiler can rename static functions to avoid
    215 * global naming collisions. We use a global stub function for
    216 * initcalls to create a stable symbol name whose address can be
    217 * taken in inline assembly when PREL32 relocations are used.
    218 */
    219#define __initcall_stub(fn, __iid, id)				\
    220	__initcall_name(initstub, __iid, id)
    221
    222#define __define_initcall_stub(__stub, fn)			\
    223	int __init __cficanonical __stub(void);			\
    224	int __init __cficanonical __stub(void)			\
    225	{ 							\
    226		return fn();					\
    227	}							\
    228	__ADDRESSABLE(__stub)
    229#else
    230#define __initcall_section(__sec, __iid)			\
    231	#__sec ".init"
    232
    233#define __initcall_stub(fn, __iid, id)	fn
    234
    235#define __define_initcall_stub(__stub, fn)			\
    236	__ADDRESSABLE(fn)
    237#endif
    238
    239#ifdef CONFIG_HAVE_ARCH_PREL32_RELOCATIONS
    240#define ____define_initcall(fn, __stub, __name, __sec)		\
    241	__define_initcall_stub(__stub, fn)			\
    242	asm(".section	\"" __sec "\", \"a\"		\n"	\
    243	    __stringify(__name) ":			\n"	\
    244	    ".long	" __stringify(__stub) " - .	\n"	\
    245	    ".previous					\n");	\
    246	static_assert(__same_type(initcall_t, &fn));
    247#else
    248#define ____define_initcall(fn, __unused, __name, __sec)	\
    249	static initcall_t __name __used 			\
    250		__attribute__((__section__(__sec))) = fn;
    251#endif
    252
    253#define __unique_initcall(fn, id, __sec, __iid)			\
    254	____define_initcall(fn,					\
    255		__initcall_stub(fn, __iid, id),			\
    256		__initcall_name(initcall, __iid, id),		\
    257		__initcall_section(__sec, __iid))
    258
    259#define ___define_initcall(fn, id, __sec)			\
    260	__unique_initcall(fn, id, __sec, __initcall_id(fn))
    261
    262#define __define_initcall(fn, id) ___define_initcall(fn, id, .initcall##id)
    263
    264/*
    265 * Early initcalls run before initializing SMP.
    266 *
    267 * Only for built-in code, not modules.
    268 */
    269#define early_initcall(fn)		__define_initcall(fn, early)
    270
    271/*
    272 * A "pure" initcall has no dependencies on anything else, and purely
    273 * initializes variables that couldn't be statically initialized.
    274 *
    275 * This only exists for built-in code, not for modules.
    276 * Keep main.c:initcall_level_names[] in sync.
    277 */
    278#define pure_initcall(fn)		__define_initcall(fn, 0)
    279
    280#define core_initcall(fn)		__define_initcall(fn, 1)
    281#define core_initcall_sync(fn)		__define_initcall(fn, 1s)
    282#define postcore_initcall(fn)		__define_initcall(fn, 2)
    283#define postcore_initcall_sync(fn)	__define_initcall(fn, 2s)
    284#define arch_initcall(fn)		__define_initcall(fn, 3)
    285#define arch_initcall_sync(fn)		__define_initcall(fn, 3s)
    286#define subsys_initcall(fn)		__define_initcall(fn, 4)
    287#define subsys_initcall_sync(fn)	__define_initcall(fn, 4s)
    288#define fs_initcall(fn)			__define_initcall(fn, 5)
    289#define fs_initcall_sync(fn)		__define_initcall(fn, 5s)
    290#define rootfs_initcall(fn)		__define_initcall(fn, rootfs)
    291#define device_initcall(fn)		__define_initcall(fn, 6)
    292#define device_initcall_sync(fn)	__define_initcall(fn, 6s)
    293#define late_initcall(fn)		__define_initcall(fn, 7)
    294#define late_initcall_sync(fn)		__define_initcall(fn, 7s)
    295
    296#define __initcall(fn) device_initcall(fn)
    297
    298#define __exitcall(fn)						\
    299	static exitcall_t __exitcall_##fn __exit_call = fn
    300
    301#define console_initcall(fn)	___define_initcall(fn, con, .con_initcall)
    302
    303struct obs_kernel_param {
    304	const char *str;
    305	int (*setup_func)(char *);
    306	int early;
    307};
    308
    309/*
    310 * Only for really core code.  See moduleparam.h for the normal way.
    311 *
    312 * Force the alignment so the compiler doesn't space elements of the
    313 * obs_kernel_param "array" too far apart in .init.setup.
    314 */
    315#define __setup_param(str, unique_id, fn, early)			\
    316	static const char __setup_str_##unique_id[] __initconst		\
    317		__aligned(1) = str; 					\
    318	static struct obs_kernel_param __setup_##unique_id		\
    319		__used __section(".init.setup")				\
    320		__aligned(__alignof__(struct obs_kernel_param))		\
    321		= { __setup_str_##unique_id, fn, early }
    322
    323/*
    324 * NOTE: __setup functions return values:
    325 * @fn returns 1 (or non-zero) if the option argument is "handled"
    326 * and returns 0 if the option argument is "not handled".
    327 */
    328#define __setup(str, fn)						\
    329	__setup_param(str, fn, fn, 0)
    330
    331/*
    332 * NOTE: @fn is as per module_param, not __setup!
    333 * I.e., @fn returns 0 for no error or non-zero for error
    334 * (possibly @fn returns a -errno value, but it does not matter).
    335 * Emits warning if @fn returns non-zero.
    336 */
    337#define early_param(str, fn)						\
    338	__setup_param(str, fn, fn, 1)
    339
    340#define early_param_on_off(str_on, str_off, var, config)		\
    341									\
    342	int var = IS_ENABLED(config);					\
    343									\
    344	static int __init parse_##var##_on(char *arg)			\
    345	{								\
    346		var = 1;						\
    347		return 0;						\
    348	}								\
    349	early_param(str_on, parse_##var##_on);				\
    350									\
    351	static int __init parse_##var##_off(char *arg)			\
    352	{								\
    353		var = 0;						\
    354		return 0;						\
    355	}								\
    356	early_param(str_off, parse_##var##_off)
    357
    358/* Relies on boot_command_line being set */
    359void __init parse_early_param(void);
    360void __init parse_early_options(char *cmdline);
    361#endif /* __ASSEMBLY__ */
    362
    363#else /* MODULE */
    364
    365#define __setup_param(str, unique_id, fn)	/* nothing */
    366#define __setup(str, func) 			/* nothing */
    367#endif
    368
    369/* Data marked not to be saved by software suspend */
    370#define __nosavedata __section(".data..nosave")
    371
    372#ifdef MODULE
    373#define __exit_p(x) x
    374#else
    375#define __exit_p(x) NULL
    376#endif
    377
    378#endif /* _LINUX_INIT_H */