Line data Source code
1 0 : /* 2 : * Copyright (c) 2023 Nordic Semiconductor ASA 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : /* 8 : * DESCRIPTION 9 : * Platform independent set of macros for creating a memory segment for 10 : * aggregating data that shall be kept in the elf file but not in the binary. 11 : */ 12 : 13 : #ifndef ZEPHYR_INCLUDE_LINKER_LINKER_DEVNULL_H_ 14 : #define ZEPHYR_INCLUDE_LINKER_LINKER_DEVNULL_H_ 15 : 16 : #if defined(CONFIG_LINKER_DEVNULL_MEMORY) 17 : 18 : #if defined(CONFIG_XIP) 19 : #if (!defined(ROM_ADDR) && !defined(ROM_BASE)) || !defined(ROM_SIZE) 20 : #error "ROM_SIZE, ROM_ADDR or ROM_BASE not defined" 21 : #endif 22 : #endif /* CONFIG_XIP */ 23 : 24 : #if (!defined(RAM_ADDR) && !defined(RAM_BASE)) || !defined(RAM_SIZE) 25 : #error "RAM_SIZE, RAM_ADDR or RAM_BASE not defined" 26 : #endif 27 : 28 : #if defined(CONFIG_XIP) && !defined(ROM_ADDR) 29 : #define ROM_ADDR ROM_BASE 30 : #endif 31 : 32 : #if !defined(RAM_ADDR) 33 : #define RAM_ADDR RAM_BASE 34 : #endif 35 : 36 : #define ROM_END_ADDR (ROM_ADDR + ROM_SIZE) 37 : #define DEVNULL_SIZE CONFIG_LINKER_DEVNULL_MEMORY_SIZE 38 : #define ROM_DEVNULL_END_ADDR (ROM_END_ADDR + DEVNULL_SIZE) 39 : #define MAX_ADDR UINT32_MAX 40 : 41 : /* Determine where to put the devnull region. It should be adjacent to the ROM 42 : * region. If ROM starts after RAM or the distance between ROM and RAM is big 43 : * enough to fit the devnull region then devnull region is placed just after 44 : * the ROM region. If it cannot be done then the devnull region is placed before 45 : * the ROM region. It is possible that the devnull region cannot be placed 46 : * adjacent to the ROM (e.g. ROM starts at 0 and RAM follows ROM). In that 47 : * case compilation fails and the devnull region is not supported in that 48 : * configuration. 49 : */ 50 : #if !defined(CONFIG_XIP) 51 : 52 : #if RAM_ADDR >= DEVNULL_SIZE 53 : #define DEVNULL_ADDR (RAM_ADDR - DEVNULL_SIZE) 54 : #else 55 : #define DEVNULL_ADDR (RAM_ADDR + RAM_SIZE) 56 : #endif 57 : 58 : #else /* CONFIG_XIP */ 59 : 60 : #if ((ROM_ADDR > RAM_ADDR) && ((MAX_ADDR - ROM_END_ADDR) >= DEVNULL_SIZE)) || \ 61 : ((ROM_END_ADDR + DEVNULL_SIZE) <= RAM_ADDR) 62 : #define DEVNULL_ADDR ROM_END_ADDR 63 : #elif ROM_ADDR > DEVNULL_SIZE 64 : #define DEVNULL_ADDR (ROM_ADDR - DEVNULL_SIZE) 65 : #else 66 : #error "Cannot place devnull segment adjacent to ROM region." 67 : #endif 68 : 69 : #endif /* CONFIG_XIP */ 70 : 71 : #define DEVNULL_REGION DEVNULL_ROM 72 : 73 : #endif /* CONFIG_LINKER_DEVNULL_MEMORY */ 74 : 75 : #endif /* ZEPHYR_INCLUDE_LINKER_LINKER_DEVNULL_H_ */