David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 2 | /* |
| 3 | * Linker script macros to generate Image header fields. |
| 4 | * |
| 5 | * Copyright (C) 2014 ARM Ltd. |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 6 | */ |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 7 | #ifndef __ARM64_KERNEL_IMAGE_H |
| 8 | #define __ARM64_KERNEL_IMAGE_H |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 9 | |
| 10 | #ifndef LINKER_SCRIPT |
| 11 | #error This file should only be included in vmlinux.lds.S |
| 12 | #endif |
| 13 | |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 14 | #include <asm/image.h> |
| 15 | |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 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 | |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 41 | #define __HEAD_FLAG(field) (__HEAD_FLAG_##field << \ |
| 42 | ARM64_IMAGE_FLAG_##field##_SHIFT) |
| 43 | |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 44 | #ifdef CONFIG_CPU_BIG_ENDIAN |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 45 | #define __HEAD_FLAG_BE ARM64_IMAGE_FLAG_BE |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 46 | #else |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 47 | #define __HEAD_FLAG_BE ARM64_IMAGE_FLAG_LE |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 48 | #endif |
| 49 | |
| 50 | #define __HEAD_FLAG_PAGE_SIZE ((PAGE_SHIFT - 10) / 2) |
| 51 | |
| 52 | #define __HEAD_FLAG_PHYS_BASE 1 |
| 53 | |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 54 | #define __HEAD_FLAGS (__HEAD_FLAG(BE) | \ |
| 55 | __HEAD_FLAG(PAGE_SIZE) | \ |
| 56 | __HEAD_FLAG(PHYS_BASE)) |
Andrew Scull | b4b6d4a | 2019-01-02 15:54:55 +0000 | [diff] [blame] | 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_offset_le, TEXT_OFFSET); \ |
| 66 | DEFINE_IMAGE_LE64(_kernel_flags_le, __HEAD_FLAGS); |
| 67 | |
David Brazdil | 0f672f6 | 2019-12-10 10:32:29 +0000 | [diff] [blame^] | 68 | #endif /* __ARM64_KERNEL_IMAGE_H */ |