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_ */
|