162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_X86_SETUP_H 362306a36Sopenharmony_ci#define _ASM_X86_SETUP_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <uapi/asm/setup.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#define COMMAND_LINE_SIZE 2048 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/linkage.h> 1062306a36Sopenharmony_ci#include <asm/page_types.h> 1162306a36Sopenharmony_ci#include <asm/ibt.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#ifdef __i386__ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <linux/pfn.h> 1662306a36Sopenharmony_ci/* 1762306a36Sopenharmony_ci * Reserved space for vmalloc and iomap - defined in asm/page.h 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci#define MAXMEM_PFN PFN_DOWN(MAXMEM) 2062306a36Sopenharmony_ci#define MAX_NONPAE_PFN (1 << 20) 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#endif /* __i386__ */ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define PARAM_SIZE 4096 /* sizeof(struct boot_params) */ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define OLD_CL_MAGIC 0xA33F 2762306a36Sopenharmony_ci#define OLD_CL_ADDRESS 0x020 /* Relative to real mode data */ 2862306a36Sopenharmony_ci#define NEW_CL_POINTER 0x228 /* Relative to real mode data */ 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 3162306a36Sopenharmony_ci#include <asm/bootparam.h> 3262306a36Sopenharmony_ci#include <asm/x86_init.h> 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciextern u64 relocated_ramdisk; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci/* Interrupt control for vSMPowered x86_64 systems */ 3762306a36Sopenharmony_ci#ifdef CONFIG_X86_64 3862306a36Sopenharmony_civoid vsmp_init(void); 3962306a36Sopenharmony_ci#else 4062306a36Sopenharmony_cistatic inline void vsmp_init(void) { } 4162306a36Sopenharmony_ci#endif 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistruct pt_regs; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_civoid setup_bios_corruption_check(void); 4662306a36Sopenharmony_civoid early_platform_quirks(void); 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ciextern unsigned long saved_video_mode; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ciextern void reserve_standard_io_resources(void); 5162306a36Sopenharmony_ciextern void i386_reserve_resources(void); 5262306a36Sopenharmony_ciextern unsigned long __startup_64(unsigned long physaddr, struct boot_params *bp); 5362306a36Sopenharmony_ciextern void startup_64_setup_env(unsigned long physbase); 5462306a36Sopenharmony_ciextern void early_setup_idt(void); 5562306a36Sopenharmony_ciextern void __init do_early_exception(struct pt_regs *regs, int trapnr); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#ifdef CONFIG_X86_INTEL_MID 5862306a36Sopenharmony_ciextern void x86_intel_mid_early_setup(void); 5962306a36Sopenharmony_ci#else 6062306a36Sopenharmony_cistatic inline void x86_intel_mid_early_setup(void) { } 6162306a36Sopenharmony_ci#endif 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci#ifdef CONFIG_X86_INTEL_CE 6462306a36Sopenharmony_ciextern void x86_ce4100_early_setup(void); 6562306a36Sopenharmony_ci#else 6662306a36Sopenharmony_cistatic inline void x86_ce4100_early_setup(void) { } 6762306a36Sopenharmony_ci#endif 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci#ifndef _SETUP 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci#include <asm/espfix.h> 7262306a36Sopenharmony_ci#include <linux/kernel.h> 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* 7562306a36Sopenharmony_ci * This is set up by the setup-routine at boot-time 7662306a36Sopenharmony_ci */ 7762306a36Sopenharmony_ciextern struct boot_params boot_params; 7862306a36Sopenharmony_ciextern char _text[]; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cistatic inline bool kaslr_enabled(void) 8162306a36Sopenharmony_ci{ 8262306a36Sopenharmony_ci return IS_ENABLED(CONFIG_RANDOMIZE_MEMORY) && 8362306a36Sopenharmony_ci !!(boot_params.hdr.loadflags & KASLR_FLAG); 8462306a36Sopenharmony_ci} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/* 8762306a36Sopenharmony_ci * Apply no randomization if KASLR was disabled at boot or if KASAN 8862306a36Sopenharmony_ci * is enabled. KASAN shadow mappings rely on regions being PGD aligned. 8962306a36Sopenharmony_ci */ 9062306a36Sopenharmony_cistatic inline bool kaslr_memory_enabled(void) 9162306a36Sopenharmony_ci{ 9262306a36Sopenharmony_ci return kaslr_enabled() && !IS_ENABLED(CONFIG_KASAN); 9362306a36Sopenharmony_ci} 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cistatic inline unsigned long kaslr_offset(void) 9662306a36Sopenharmony_ci{ 9762306a36Sopenharmony_ci return (unsigned long)&_text - __START_KERNEL; 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/* 10162306a36Sopenharmony_ci * Do NOT EVER look at the BIOS memory size location. 10262306a36Sopenharmony_ci * It does not work on many machines. 10362306a36Sopenharmony_ci */ 10462306a36Sopenharmony_ci#define LOWMEMSIZE() (0x9f000) 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ci/* exceedingly early brk-like allocator */ 10762306a36Sopenharmony_ciextern unsigned long _brk_end; 10862306a36Sopenharmony_civoid *extend_brk(size_t size, size_t align); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci/* 11162306a36Sopenharmony_ci * Reserve space in the .brk section, which is a block of memory from which the 11262306a36Sopenharmony_ci * caller is allowed to allocate very early (before even memblock is available) 11362306a36Sopenharmony_ci * by calling extend_brk(). All allocated memory will be eventually converted 11462306a36Sopenharmony_ci * to memblock. Any leftover unallocated memory will be freed. 11562306a36Sopenharmony_ci * 11662306a36Sopenharmony_ci * The size is in bytes. 11762306a36Sopenharmony_ci */ 11862306a36Sopenharmony_ci#define RESERVE_BRK(name, size) \ 11962306a36Sopenharmony_ci __section(".bss..brk") __aligned(1) __used \ 12062306a36Sopenharmony_ci static char __brk_##name[size] 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ciextern void probe_roms(void); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_civoid clear_bss(void); 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci#ifdef __i386__ 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ciasmlinkage void __init __noreturn i386_start_kernel(void); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci#else 13162306a36Sopenharmony_ciasmlinkage void __init __noreturn x86_64_start_kernel(char *real_mode); 13262306a36Sopenharmony_ciasmlinkage void __init __noreturn x86_64_start_reservations(char *real_mode_data); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci#endif /* __i386__ */ 13562306a36Sopenharmony_ci#endif /* _SETUP */ 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci#else /* __ASSEMBLY */ 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci.macro __RESERVE_BRK name, size 14062306a36Sopenharmony_ci .pushsection .bss..brk, "aw" 14162306a36Sopenharmony_ciSYM_DATA_START(__brk_\name) 14262306a36Sopenharmony_ci .skip \size 14362306a36Sopenharmony_ciSYM_DATA_END(__brk_\name) 14462306a36Sopenharmony_ci .popsection 14562306a36Sopenharmony_ci.endm 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci#define RESERVE_BRK(name, size) __RESERVE_BRK name, size 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci#endif /* __ASSEMBLY__ */ 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci#endif /* _ASM_X86_SETUP_H */ 152