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