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

power.h (9158B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#include <linux/suspend.h>
      3#include <linux/suspend_ioctls.h>
      4#include <linux/utsname.h>
      5#include <linux/freezer.h>
      6#include <linux/compiler.h>
      7#include <linux/cpu.h>
      8#include <linux/cpuidle.h>
      9
     10struct swsusp_info {
     11	struct new_utsname	uts;
     12	u32			version_code;
     13	unsigned long		num_physpages;
     14	int			cpus;
     15	unsigned long		image_pages;
     16	unsigned long		pages;
     17	unsigned long		size;
     18} __aligned(PAGE_SIZE);
     19
     20#ifdef CONFIG_HIBERNATION
     21/* kernel/power/snapshot.c */
     22extern void __init hibernate_reserved_size_init(void);
     23extern void __init hibernate_image_size_init(void);
     24
     25#ifdef CONFIG_ARCH_HIBERNATION_HEADER
     26/* Maximum size of architecture specific data in a hibernation header */
     27#define MAX_ARCH_HEADER_SIZE	(sizeof(struct new_utsname) + 4)
     28
     29extern int arch_hibernation_header_save(void *addr, unsigned int max_size);
     30extern int arch_hibernation_header_restore(void *addr);
     31
     32static inline int init_header_complete(struct swsusp_info *info)
     33{
     34	return arch_hibernation_header_save(info, MAX_ARCH_HEADER_SIZE);
     35}
     36
     37static inline const char *check_image_kernel(struct swsusp_info *info)
     38{
     39	return arch_hibernation_header_restore(info) ?
     40			"architecture specific data" : NULL;
     41}
     42#endif /* CONFIG_ARCH_HIBERNATION_HEADER */
     43
     44extern int hibernate_resume_nonboot_cpu_disable(void);
     45
     46/*
     47 * Keep some memory free so that I/O operations can succeed without paging
     48 * [Might this be more than 4 MB?]
     49 */
     50#define PAGES_FOR_IO	((4096 * 1024) >> PAGE_SHIFT)
     51
     52/*
     53 * Keep 1 MB of memory free so that device drivers can allocate some pages in
     54 * their .suspend() routines without breaking the suspend to disk.
     55 */
     56#define SPARE_PAGES	((1024 * 1024) >> PAGE_SHIFT)
     57
     58asmlinkage int swsusp_save(void);
     59
     60/* kernel/power/hibernate.c */
     61extern bool freezer_test_done;
     62
     63extern int hibernation_snapshot(int platform_mode);
     64extern int hibernation_restore(int platform_mode);
     65extern int hibernation_platform_enter(void);
     66
     67#ifdef CONFIG_STRICT_KERNEL_RWX
     68/* kernel/power/snapshot.c */
     69extern void enable_restore_image_protection(void);
     70#else
     71static inline void enable_restore_image_protection(void) {}
     72#endif /* CONFIG_STRICT_KERNEL_RWX */
     73
     74#else /* !CONFIG_HIBERNATION */
     75
     76static inline void hibernate_reserved_size_init(void) {}
     77static inline void hibernate_image_size_init(void) {}
     78#endif /* !CONFIG_HIBERNATION */
     79
     80#define power_attr(_name) \
     81static struct kobj_attribute _name##_attr = {	\
     82	.attr	= {				\
     83		.name = __stringify(_name),	\
     84		.mode = 0644,			\
     85	},					\
     86	.show	= _name##_show,			\
     87	.store	= _name##_store,		\
     88}
     89
     90#define power_attr_ro(_name) \
     91static struct kobj_attribute _name##_attr = {	\
     92	.attr	= {				\
     93		.name = __stringify(_name),	\
     94		.mode = S_IRUGO,		\
     95	},					\
     96	.show	= _name##_show,			\
     97}
     98
     99/* Preferred image size in bytes (default 500 MB) */
    100extern unsigned long image_size;
    101/* Size of memory reserved for drivers (default SPARE_PAGES x PAGE_SIZE) */
    102extern unsigned long reserved_size;
    103extern int in_suspend;
    104extern dev_t swsusp_resume_device;
    105extern sector_t swsusp_resume_block;
    106
    107extern int create_basic_memory_bitmaps(void);
    108extern void free_basic_memory_bitmaps(void);
    109extern int hibernate_preallocate_memory(void);
    110
    111extern void clear_or_poison_free_pages(void);
    112
    113/**
    114 *	Auxiliary structure used for reading the snapshot image data and
    115 *	metadata from and writing them to the list of page backup entries
    116 *	(PBEs) which is the main data structure of swsusp.
    117 *
    118 *	Using struct snapshot_handle we can transfer the image, including its
    119 *	metadata, as a continuous sequence of bytes with the help of
    120 *	snapshot_read_next() and snapshot_write_next().
    121 *
    122 *	The code that writes the image to a storage or transfers it to
    123 *	the user land is required to use snapshot_read_next() for this
    124 *	purpose and it should not make any assumptions regarding the internal
    125 *	structure of the image.  Similarly, the code that reads the image from
    126 *	a storage or transfers it from the user land is required to use
    127 *	snapshot_write_next().
    128 *
    129 *	This may allow us to change the internal structure of the image
    130 *	in the future with considerably less effort.
    131 */
    132
    133struct snapshot_handle {
    134	unsigned int	cur;	/* number of the block of PAGE_SIZE bytes the
    135				 * next operation will refer to (ie. current)
    136				 */
    137	void		*buffer;	/* address of the block to read from
    138					 * or write to
    139					 */
    140	int		sync_read;	/* Set to one to notify the caller of
    141					 * snapshot_write_next() that it may
    142					 * need to call wait_on_bio_chain()
    143					 */
    144};
    145
    146/* This macro returns the address from/to which the caller of
    147 * snapshot_read_next()/snapshot_write_next() is allowed to
    148 * read/write data after the function returns
    149 */
    150#define data_of(handle)	((handle).buffer)
    151
    152extern unsigned int snapshot_additional_pages(struct zone *zone);
    153extern unsigned long snapshot_get_image_size(void);
    154extern int snapshot_read_next(struct snapshot_handle *handle);
    155extern int snapshot_write_next(struct snapshot_handle *handle);
    156extern void snapshot_write_finalize(struct snapshot_handle *handle);
    157extern int snapshot_image_loaded(struct snapshot_handle *handle);
    158
    159extern bool hibernate_acquire(void);
    160extern void hibernate_release(void);
    161
    162extern sector_t alloc_swapdev_block(int swap);
    163extern void free_all_swap_pages(int swap);
    164extern int swsusp_swap_in_use(void);
    165
    166/*
    167 * Flags that can be passed from the hibernatig hernel to the "boot" kernel in
    168 * the image header.
    169 */
    170#define SF_PLATFORM_MODE	1
    171#define SF_NOCOMPRESS_MODE	2
    172#define SF_CRC32_MODE	        4
    173#define SF_HW_SIG		8
    174
    175/* kernel/power/hibernate.c */
    176extern int swsusp_check(void);
    177extern void swsusp_free(void);
    178extern int swsusp_read(unsigned int *flags_p);
    179extern int swsusp_write(unsigned int flags);
    180extern void swsusp_close(fmode_t);
    181#ifdef CONFIG_SUSPEND
    182extern int swsusp_unmark(void);
    183#endif
    184
    185struct __kernel_old_timeval;
    186/* kernel/power/swsusp.c */
    187extern void swsusp_show_speed(ktime_t, ktime_t, unsigned int, char *);
    188
    189#ifdef CONFIG_SUSPEND
    190/* kernel/power/suspend.c */
    191extern const char * const pm_labels[];
    192extern const char *pm_states[];
    193extern const char *mem_sleep_states[];
    194
    195extern int suspend_devices_and_enter(suspend_state_t state);
    196#else /* !CONFIG_SUSPEND */
    197#define mem_sleep_current	PM_SUSPEND_ON
    198
    199static inline int suspend_devices_and_enter(suspend_state_t state)
    200{
    201	return -ENOSYS;
    202}
    203#endif /* !CONFIG_SUSPEND */
    204
    205#ifdef CONFIG_PM_TEST_SUSPEND
    206/* kernel/power/suspend_test.c */
    207extern void suspend_test_start(void);
    208extern void suspend_test_finish(const char *label);
    209#else /* !CONFIG_PM_TEST_SUSPEND */
    210static inline void suspend_test_start(void) {}
    211static inline void suspend_test_finish(const char *label) {}
    212#endif /* !CONFIG_PM_TEST_SUSPEND */
    213
    214#ifdef CONFIG_PM_SLEEP
    215/* kernel/power/main.c */
    216extern int pm_notifier_call_chain_robust(unsigned long val_up, unsigned long val_down);
    217extern int pm_notifier_call_chain(unsigned long val);
    218#endif
    219
    220#ifdef CONFIG_HIGHMEM
    221int restore_highmem(void);
    222#else
    223static inline unsigned int count_highmem_pages(void) { return 0; }
    224static inline int restore_highmem(void) { return 0; }
    225#endif
    226
    227/*
    228 * Suspend test levels
    229 */
    230enum {
    231	/* keep first */
    232	TEST_NONE,
    233	TEST_CORE,
    234	TEST_CPUS,
    235	TEST_PLATFORM,
    236	TEST_DEVICES,
    237	TEST_FREEZER,
    238	/* keep last */
    239	__TEST_AFTER_LAST
    240};
    241
    242#define TEST_FIRST	TEST_NONE
    243#define TEST_MAX	(__TEST_AFTER_LAST - 1)
    244
    245#ifdef CONFIG_PM_SLEEP_DEBUG
    246extern int pm_test_level;
    247#else
    248#define pm_test_level	(TEST_NONE)
    249#endif
    250
    251#ifdef CONFIG_SUSPEND_FREEZER
    252static inline int suspend_freeze_processes(void)
    253{
    254	int error;
    255
    256	error = freeze_processes();
    257	/*
    258	 * freeze_processes() automatically thaws every task if freezing
    259	 * fails. So we need not do anything extra upon error.
    260	 */
    261	if (error)
    262		return error;
    263
    264	error = freeze_kernel_threads();
    265	/*
    266	 * freeze_kernel_threads() thaws only kernel threads upon freezing
    267	 * failure. So we have to thaw the userspace tasks ourselves.
    268	 */
    269	if (error)
    270		thaw_processes();
    271
    272	return error;
    273}
    274
    275static inline void suspend_thaw_processes(void)
    276{
    277	thaw_processes();
    278}
    279#else
    280static inline int suspend_freeze_processes(void)
    281{
    282	return 0;
    283}
    284
    285static inline void suspend_thaw_processes(void)
    286{
    287}
    288#endif
    289
    290#ifdef CONFIG_PM_AUTOSLEEP
    291
    292/* kernel/power/autosleep.c */
    293extern int pm_autosleep_init(void);
    294extern int pm_autosleep_lock(void);
    295extern void pm_autosleep_unlock(void);
    296extern suspend_state_t pm_autosleep_state(void);
    297extern int pm_autosleep_set_state(suspend_state_t state);
    298
    299#else /* !CONFIG_PM_AUTOSLEEP */
    300
    301static inline int pm_autosleep_init(void) { return 0; }
    302static inline int pm_autosleep_lock(void) { return 0; }
    303static inline void pm_autosleep_unlock(void) {}
    304static inline suspend_state_t pm_autosleep_state(void) { return PM_SUSPEND_ON; }
    305
    306#endif /* !CONFIG_PM_AUTOSLEEP */
    307
    308#ifdef CONFIG_PM_WAKELOCKS
    309
    310/* kernel/power/wakelock.c */
    311extern ssize_t pm_show_wakelocks(char *buf, bool show_active);
    312extern int pm_wake_lock(const char *buf);
    313extern int pm_wake_unlock(const char *buf);
    314
    315#endif /* !CONFIG_PM_WAKELOCKS */
    316
    317static inline int pm_sleep_disable_secondary_cpus(void)
    318{
    319	cpuidle_pause();
    320	return suspend_disable_secondary_cpus();
    321}
    322
    323static inline void pm_sleep_enable_secondary_cpus(void)
    324{
    325	suspend_enable_secondary_cpus();
    326	cpuidle_resume();
    327}