42
     ˆÅÄƒ„/ÃÆÈ ®    /* SPDX-License-Identifier: GPL-2.0-only */
#ifndef _LINUX_RANDOMIZE_KSTACK_H
#define _LINUX_RANDOMIZE_KSTACK_H

#ifdef CONFIG_RANDOMIZE_KSTACK_OFFSET
#include <linux/kernel.h>
#include <linux/jump_label.h>
#include <linux/percpu-defs.h>

DECLARE_STATIC_KEY_MAYBE(CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT,
			 randomize_kstack_offset);
DECLARE_PER_CPU(u32, kstack_offset);

/*
 * Do not use this anywhere else in the kernel. This is used here because
 * it provides an arch-agnostic way to grow the stack with correct
 * alignment. Also, since this use is being explicitly masked to a max of
 * 10 bits, stack-clash style attacks are unlikely. For more details see
 * "VLAs" in Documentation/process/deprecated.rst
 */
void *__builtin_alloca(size_t size);
/*
 * Use, at most, 10 bits of entropy. We explicitly cap this to keep the
 * "VLA" from being unbounded (see above). 10 bits leaves enough room for
 * per-arch offset masks to reduce entropy (by removing higher bits, since
 * high entropy may overly constrain usable stack space), and for
 * compiler/arch-specific stack alignment to remove the lower bits.
 */
#define KSTACK_OFFSET_MAX(x)	((x) & 0x3FF)

/*
 * These macros must be used during syscall entry when interrupts and
 * preempt are disabled, and after user registers have been stored to
 * the stack.
 */
#define add_random_kstack_offset() do {					\
	if (static_branch_maybe(CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT,	\
				&randomize_kstack_offset)) {		\
		u32 offset = raw_cpu_read(kstack_offset);		\
		u8 *ptr = __builtin_alloca(KSTACK_OFFSET_MAX(offset));	\
		/* Keep allocation even after "ptr" loses scope. */	\
		asm volatile("" :: "r"(ptr) : "memory");		\
	}								\
} while (0)

#define choose_random_kstack_offset(rand) do {				\
	if (static_branch_maybe(CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT,	\
				&randomize_kstack_offset)) {		\
		u32 offset = raw_cpu_read(kstack_offset);		\
		offset = ror32(offset, 5) ^ (rand);			\
		raw_cpu_write(kstack_offset, offset);			\
	}								\
} while (0)
#else /* CONFIG_RANDOMIZE_KSTACK_OFFSET */
#define add_random_kstack_offset()		do { } while (0)
#define choose_random_kstack_offset(rand)	do { } while (0)
#endif /* CONFIG_RANDOMIZE_KSTACK_OFFSET */

#endif
  "   ˆl–Ðz¾”ŠC]Šq@?p@¸ÛªbÑ¿Åƒd-=ÇÉ L    ELF                      D
      4     (   U‰å¸    ]ÃU‰åƒì8‰EÔ‰UÐ‰MÌÇEô    ƒ}Ðthp   j1hˆ   jèüÿÿÿƒÄé°   ‹EÌ‹ ¹    º    èüÿÿÿ‰Eð‹EÔ‹ ‹ ‹@ƒÀ¶ ¾Àƒøwtƒøw/ƒøbtƒødu%‹Eð‹ ‰Eôë‹Eð· ·À‰Eôë‹Eð¶ ¶À‰Eô�‹EÔ‹@‹ …Àt)ÿuôh©   j	�EçPèüÿÿÿƒÄ‹EÔ‹@‹@�Uçèüÿÿÿëƒìÿuôh¬   èüÿÿÿƒÄ¸    ÉÃU‰åƒì(‰Eä‰Uà‰MÜÇEôÿÿÿÿƒ}àt!ƒ}àth²   jVhˆ   jèüÿÿÿƒÄé  ‹EÜ‹ ¹    º    èüÿÿÿ‰Eð‹EÜƒÀ‹ ¹    º    èüÿÿÿ‰Eìƒ}àu‹EÜƒÀ‹ ¹    º    èüÿÿÿ‰Eô‹Eô!Eì‹Eä‹@ƒÀ¶ ¾Àƒøwt=ƒøw�™   ƒøbtcƒød…‹   ƒ}ôÿt‹Eð‹‹Eô÷Ð!Â‹EðUì‰ëo‹Eð‹Uì‰ëe‹Eô·À=ÿÿ  t‹Eð·‹Eô÷Ð!Â‹Eì‰Á‹Eð	Êf‰ë<‹Eð‹Uìf‰ë1‹Eô¶À=ÿ   t‹Eð¶ ‹Uô÷Ò!Â‹Eì‰Á‹Eð	Êˆë‹Eð‹Uìˆ�¸    ÉÃU‰åƒì‰Eôè®ýÿÿ<„ø   ƒìh@   hÓ   hï   ¹    º
   ¸É   èüÿÿÿƒÄ£    ƒìh@   hþ   hï   ¹    º
   ¸ô   èüÿÿÿƒÄ£   ƒìh@   h&  hï   ¹    º
   ¸  èüÿÿÿƒÄ£   ƒìh`  ¹C  ºó   ¸U  èüÿÿÿƒÄ£   ƒìh†  ¹C  ºó   ¸{  èüÿÿÿƒÄ£   ƒìh®  ¹C  ºó   ¸¢  èüÿÿÿƒÄ£   ë�ÉÃU‰åƒìè üÿÿ<t>¡    èüÿÿÿ¡   èüÿÿÿ¡   èüÿÿÿ¡   èüÿÿÿ¡   èüÿÿÿ¡   èüÿÿÿë�ÉÃ       Save read value into variable VARNAME. VARNAME                      v           '                              one argument expected   ../../grub-core/commands/memrw.c %x 0x%x
 two arguments expected read_byte Read 8-bit value from ADDR. ADDR read_word Read 16-bit value from ADDR. read_dword Read 32-bit value from ADDR. ADDR VALUE [MASK] write_byte Write 8-bit VALUE to ADDR. write_word Write 16-bit VALUE to ADDR. write_dword Write 32-bit VALUE to ADDR.   LICENSE=GPLv3+  extcmd memrw                                                                 D         U  P                                                            	               +              B              N              f              q              �              ®              »               