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

image.h (2075B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Linker script macros to generate Image header fields.
      4 *
      5 * Copyright (C) 2014 ARM Ltd.
      6 */
      7#ifndef __ARM64_KERNEL_IMAGE_H
      8#define __ARM64_KERNEL_IMAGE_H
      9
     10#ifndef LINKER_SCRIPT
     11#error This file should only be included in vmlinux.lds.S
     12#endif
     13
     14#include <asm/image.h>
     15
     16/*
     17 * There aren't any ELF relocations we can use to endian-swap values known only
     18 * at link time (e.g. the subtraction of two symbol addresses), so we must get
     19 * the linker to endian-swap certain values before emitting them.
     20 *
     21 * Note that, in order for this to work when building the ELF64 PIE executable
     22 * (for KASLR), these values should not be referenced via R_AARCH64_ABS64
     23 * relocations, since these are fixed up at runtime rather than at build time
     24 * when PIE is in effect. So we need to split them up in 32-bit high and low
     25 * words.
     26 */
     27#ifdef CONFIG_CPU_BIG_ENDIAN
     28#define DATA_LE32(data)				\
     29	((((data) & 0x000000ff) << 24) |	\
     30	 (((data) & 0x0000ff00) << 8)  |	\
     31	 (((data) & 0x00ff0000) >> 8)  |	\
     32	 (((data) & 0xff000000) >> 24))
     33#else
     34#define DATA_LE32(data) ((data) & 0xffffffff)
     35#endif
     36
     37#define DEFINE_IMAGE_LE64(sym, data)				\
     38	sym##_lo32 = DATA_LE32((data) & 0xffffffff);		\
     39	sym##_hi32 = DATA_LE32((data) >> 32)
     40
     41#define __HEAD_FLAG(field)	(__HEAD_FLAG_##field << \
     42					ARM64_IMAGE_FLAG_##field##_SHIFT)
     43
     44#ifdef CONFIG_CPU_BIG_ENDIAN
     45#define __HEAD_FLAG_BE		ARM64_IMAGE_FLAG_BE
     46#else
     47#define __HEAD_FLAG_BE		ARM64_IMAGE_FLAG_LE
     48#endif
     49
     50#define __HEAD_FLAG_PAGE_SIZE	((PAGE_SHIFT - 10) / 2)
     51
     52#define __HEAD_FLAG_PHYS_BASE	1
     53
     54#define __HEAD_FLAGS		(__HEAD_FLAG(BE)	| \
     55				 __HEAD_FLAG(PAGE_SIZE) | \
     56				 __HEAD_FLAG(PHYS_BASE))
     57
     58/*
     59 * These will output as part of the Image header, which should be little-endian
     60 * regardless of the endianness of the kernel. While constant values could be
     61 * endian swapped in head.S, all are done here for consistency.
     62 */
     63#define HEAD_SYMBOLS						\
     64	DEFINE_IMAGE_LE64(_kernel_size_le, _end - _text);	\
     65	DEFINE_IMAGE_LE64(_kernel_flags_le, __HEAD_FLAGS);
     66
     67#endif /* __ARM64_KERNEL_IMAGE_H */