![Josh Poimboeuf](/assets/img/avatar_default.png)
commit e32683c6f7d22ba624e0bfc58b02cf3348bdca63 upstream. With binutils 2.26, RESERVE_BRK() causes a build failure: /tmp/ccnGOKZ5.s: Assembler messages: /tmp/ccnGOKZ5.s:98: Error: missing ')' /tmp/ccnGOKZ5.s:98: Error: missing ')' /tmp/ccnGOKZ5.s:98: Error: missing ')' /tmp/ccnGOKZ5.s:98: Error: junk at end of line, first unrecognized character is `U' The problem is this line: RESERVE_BRK(early_pgt_alloc, INIT_PGT_BUF_SIZE) Specifically, the INIT_PGT_BUF_SIZE macro which (via PAGE_SIZE's use _AC()) has a "1UL", which makes older versions of the assembler unhappy. Unfortunately the _AC() macro doesn't work for inline asm. Inline asm was only needed here to convince the toolchain to add the STT_NOBITS flag. However, if a C variable is placed in a section whose name is prefixed with ".bss", GCC and Clang automatically set STT_NOBITS. In fact, ".bss..page_aligned" already relies on this trick. So fix the build failure (and simplify the macro) by allocating the variable in C. Also, add NOLOAD to the ".brk" output section clause in the linker script. This is a failsafe in case the ".bss" prefix magic trick ever stops working somehow. If there's a section type mismatch, the GNU linker will force the ".brk" output section to be STT_NOBITS. The LLVM linker will fail with a "section type mismatch" error. Note this also changes the name of the variable from .brk.##name to __brk_##name. The variable names aren't actually used anywhere, so it's harmless. Fixes: a1e2c031ec39 ("x86/mm: Simplify RESERVE_BRK()") Reported-by: Joe Damato <jdamato@fastly.com> Reported-by: Byungchul Park <byungchul.park@lge.com> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Joe Damato <jdamato@fastly.com> Link: https://lore.kernel.org/r/22d07a44c80d8e8e1e82b9a806ddc8c6bbb2606e.1654759036.git.jpoimboe@kernel.org [nathan: Fix trivial conflict due to lack of 81519f778830] Signed-off-by: Nathan Chancellor <nathan@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
153 lines
3.7 KiB
C
Executable file
153 lines
3.7 KiB
C
Executable file
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_X86_SETUP_H
|
|
#define _ASM_X86_SETUP_H
|
|
|
|
#include <uapi/asm/setup.h>
|
|
|
|
#define COMMAND_LINE_SIZE 2048
|
|
|
|
#include <linux/linkage.h>
|
|
#include <asm/page_types.h>
|
|
|
|
#ifdef __i386__
|
|
|
|
#include <linux/pfn.h>
|
|
/*
|
|
* Reserved space for vmalloc and iomap - defined in asm/page.h
|
|
*/
|
|
#define MAXMEM_PFN PFN_DOWN(MAXMEM)
|
|
#define MAX_NONPAE_PFN (1 << 20)
|
|
|
|
#endif /* __i386__ */
|
|
|
|
#define PARAM_SIZE 4096 /* sizeof(struct boot_params) */
|
|
|
|
#define OLD_CL_MAGIC 0xA33F
|
|
#define OLD_CL_ADDRESS 0x020 /* Relative to real mode data */
|
|
#define NEW_CL_POINTER 0x228 /* Relative to real mode data */
|
|
|
|
#ifndef __ASSEMBLY__
|
|
#include <asm/bootparam.h>
|
|
#include <asm/x86_init.h>
|
|
|
|
extern u64 relocated_ramdisk;
|
|
|
|
/* Interrupt control for vSMPowered x86_64 systems */
|
|
#ifdef CONFIG_X86_64
|
|
void vsmp_init(void);
|
|
#else
|
|
static inline void vsmp_init(void) { }
|
|
#endif
|
|
|
|
struct pt_regs;
|
|
|
|
void setup_bios_corruption_check(void);
|
|
void early_platform_quirks(void);
|
|
|
|
extern unsigned long saved_video_mode;
|
|
|
|
extern void reserve_standard_io_resources(void);
|
|
extern void i386_reserve_resources(void);
|
|
extern unsigned long __startup_64(unsigned long physaddr, struct boot_params *bp);
|
|
extern unsigned long __startup_secondary_64(void);
|
|
extern void startup_64_setup_env(unsigned long physbase);
|
|
extern void early_setup_idt(void);
|
|
extern void __init do_early_exception(struct pt_regs *regs, int trapnr);
|
|
|
|
#ifdef CONFIG_X86_INTEL_MID
|
|
extern void x86_intel_mid_early_setup(void);
|
|
#else
|
|
static inline void x86_intel_mid_early_setup(void) { }
|
|
#endif
|
|
|
|
#ifdef CONFIG_X86_INTEL_CE
|
|
extern void x86_ce4100_early_setup(void);
|
|
#else
|
|
static inline void x86_ce4100_early_setup(void) { }
|
|
#endif
|
|
|
|
#ifndef _SETUP
|
|
|
|
#include <asm/espfix.h>
|
|
#include <linux/kernel.h>
|
|
|
|
/*
|
|
* This is set up by the setup-routine at boot-time
|
|
*/
|
|
extern struct boot_params boot_params;
|
|
extern char _text[];
|
|
|
|
static inline bool kaslr_enabled(void)
|
|
{
|
|
return IS_ENABLED(CONFIG_RANDOMIZE_MEMORY) &&
|
|
!!(boot_params.hdr.loadflags & KASLR_FLAG);
|
|
}
|
|
|
|
/*
|
|
* Apply no randomization if KASLR was disabled at boot or if KASAN
|
|
* is enabled. KASAN shadow mappings rely on regions being PGD aligned.
|
|
*/
|
|
static inline bool kaslr_memory_enabled(void)
|
|
{
|
|
return kaslr_enabled() && !IS_ENABLED(CONFIG_KASAN);
|
|
}
|
|
|
|
static inline unsigned long kaslr_offset(void)
|
|
{
|
|
return (unsigned long)&_text - __START_KERNEL;
|
|
}
|
|
|
|
/*
|
|
* Do NOT EVER look at the BIOS memory size location.
|
|
* It does not work on many machines.
|
|
*/
|
|
#define LOWMEMSIZE() (0x9f000)
|
|
|
|
/* exceedingly early brk-like allocator */
|
|
extern unsigned long _brk_end;
|
|
void *extend_brk(size_t size, size_t align);
|
|
|
|
/*
|
|
* Reserve space in the .brk section, which is a block of memory from which the
|
|
* caller is allowed to allocate very early (before even memblock is available)
|
|
* by calling extend_brk(). All allocated memory will be eventually converted
|
|
* to memblock. Any leftover unallocated memory will be freed.
|
|
*
|
|
* The size is in bytes.
|
|
*/
|
|
#define RESERVE_BRK(name, size) \
|
|
__section(".bss..brk") __aligned(1) __used \
|
|
static char __brk_##name[size]
|
|
|
|
/* Helper for reserving space for arrays of things */
|
|
#define RESERVE_BRK_ARRAY(type, name, entries) \
|
|
type *name; \
|
|
RESERVE_BRK(name, sizeof(type) * entries)
|
|
|
|
extern void probe_roms(void);
|
|
#ifdef __i386__
|
|
|
|
asmlinkage void __init i386_start_kernel(void);
|
|
|
|
#else
|
|
asmlinkage void __init x86_64_start_kernel(char *real_mode);
|
|
asmlinkage void __init x86_64_start_reservations(char *real_mode_data);
|
|
|
|
#endif /* __i386__ */
|
|
#endif /* _SETUP */
|
|
|
|
#else /* __ASSEMBLY */
|
|
|
|
.macro __RESERVE_BRK name, size
|
|
.pushsection .bss..brk, "aw"
|
|
SYM_DATA_START(__brk_\name)
|
|
.skip \size
|
|
SYM_DATA_END(__brk_\name)
|
|
.popsection
|
|
.endm
|
|
|
|
#define RESERVE_BRK(name, size) __RESERVE_BRK name, size
|
|
|
|
#endif /* __ASSEMBLY__ */
|
|
|
|
#endif /* _ASM_X86_SETUP_H */
|