1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * For Kernel image loading.
4 *
5 * Copyright (C) 2011 Citrix Systems, Inc.
6 */
7 #ifndef __XEN_FDT_KERNEL_H__
8 #define __XEN_FDT_KERNEL_H__
9
10 #include <xen/bootinfo.h>
11 #include <xen/device_tree.h>
12 #include <xen/types.h>
13
14 #if __has_include(<asm/kernel.h>)
15 # include <asm/kernel.h>
16 #endif
17
18 struct kernel_info {
19 struct boot_domain bd;
20
21 void *fdt; /* flat device tree */
22 paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */
23 struct meminfo mem;
24 #ifdef CONFIG_STATIC_SHM
25 struct shared_meminfo shm_mem;
26 #endif
27 struct rangeset *xen_reg_assigned;
28
29 /* kernel entry point */
30 paddr_t entry;
31
32 /* grant table region */
33 paddr_t gnttab_start;
34 paddr_t gnttab_size;
35
36 /* boot blob load addresses */
37 const struct boot_module *dtb;
38 paddr_t dtb_paddr;
39 paddr_t initrd_paddr;
40
41 /* Enable/Disable PV drivers interfaces */
42 uint16_t dom0less_feature;
43
44 /* Interrupt controller phandle */
45 uint32_t phandle_intc;
46
47 /* loader to use for this kernel */
48 void (*load)(struct kernel_info *info);
49
50 /* loader specific state */
51 union {
52 struct {
53 paddr_t kernel_addr;
54 paddr_t len;
55 #if defined(CONFIG_ARM_64) || defined(CONFIG_RISCV_64)
56 paddr_t text_offset; /* 64-bit Image only */
57 #endif
58 paddr_t start; /* Must be 0 for 64-bit Image */
59 } zimage;
60 };
61
62 #if __has_include(<asm/kernel.h>)
63 struct arch_kernel_info arch;
64 #endif
65 };
66
kernel_info_get_mem(struct kernel_info * kinfo)67 static inline struct membanks *kernel_info_get_mem(struct kernel_info *kinfo)
68 {
69 return container_of(&kinfo->mem.common, struct membanks, common);
70 }
71
72 static inline const struct membanks *
kernel_info_get_mem_const(const struct kernel_info * kinfo)73 kernel_info_get_mem_const(const struct kernel_info *kinfo)
74 {
75 return container_of(&kinfo->mem.common, const struct membanks, common);
76 }
77
78 #ifndef KERNEL_INFO_SHM_MEM_INIT
79
80 #ifdef CONFIG_STATIC_SHM
81 #define KERNEL_INFO_SHM_MEM_INIT \
82 .shm_mem.common.max_banks = NR_SHMEM_BANKS, \
83 .shm_mem.common.type = STATIC_SHARED_MEMORY,
84 #else
85 #define KERNEL_INFO_SHM_MEM_INIT
86 #endif
87
88 #endif /* KERNEL_INFO_SHM_MEM_INIT */
89
90 #ifndef KERNEL_INFO_INIT
91
92 #define KERNEL_INFO_INIT \
93 { \
94 .mem.common.max_banks = NR_MEM_BANKS, \
95 .mem.common.type = MEMORY, \
96 KERNEL_INFO_SHM_MEM_INIT \
97 }
98
99 #endif /* KERNEL_INFO_INIT */
100
101 /*
102 * Probe the kernel to detemine its type and select a loader.
103 *
104 * Sets in info:
105 * ->load hook, and sets loader specific variables ->zimage
106 */
107 int kernel_probe(struct kernel_info *info, const struct dt_device_node *domain);
108
109 /*
110 * Loads the kernel into guest RAM.
111 *
112 * Expects to be set in info when called:
113 * ->mem
114 * ->fdt
115 *
116 * Sets in info:
117 * ->entry
118 * ->dtb_paddr
119 * ->initrd_paddr
120 */
121 void kernel_load(struct kernel_info *info);
122
123 int kernel_decompress(struct boot_module *mod, uint32_t offset);
124
125 int kernel_zimage_probe(struct kernel_info *info, paddr_t addr, paddr_t size);
126
127 /*
128 * uImage isn't really used nowadays thereby leave kernel_uimage_probe()
129 * call here just for compatability with Arm code.
130 */
131 #ifdef CONFIG_ARM
132 int kernel_uimage_probe(struct kernel_info *info, struct boot_module *mod);
133 #endif
134
135 #endif /* __XEN_FDT_KERNEL_H__ */
136
137 /*
138 * Local variables:
139 * mode: C
140 * c-file-style: "BSD"
141 * c-basic-offset: 4
142 * indent-tabs-mode: nil
143 * End:
144 */
145