2 * Jailhouse, a Linux-based partitioning hypervisor
4 * Copyright (c) Siemens AG, 2013
7 * Jan Kiszka <jan.kiszka@siemens.com>
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
13 #ifndef _JAILHOUSE_CELL_CONFIG_H
14 #define _JAILHOUSE_CELL_CONFIG_H
16 #define JAILHOUSE_CELL_NAME_MAXLEN 31
18 #define JAILHOUSE_CELL_PASSIVE_COMMREG 0x00000001
20 struct jailhouse_cell_desc {
21 char name[JAILHOUSE_CELL_NAME_MAXLEN+1];
25 __u32 num_memory_regions;
27 __u32 pio_bitmap_size;
28 __u32 num_pci_devices;
30 } __attribute__((packed));
32 #define JAILHOUSE_MEM_READ 0x0001
33 #define JAILHOUSE_MEM_WRITE 0x0002
34 #define JAILHOUSE_MEM_EXECUTE 0x0004
35 #define JAILHOUSE_MEM_DMA 0x0008
36 #define JAILHOUSE_MEM_COMM_REGION 0x0010
37 #define JAILHOUSE_MEM_LOADABLE 0x0020
39 #define JAILHOUSE_MEM_VALID_FLAGS (JAILHOUSE_MEM_READ | \
40 JAILHOUSE_MEM_WRITE | \
41 JAILHOUSE_MEM_EXECUTE | \
43 JAILHOUSE_MEM_COMM_REGION | \
44 JAILHOUSE_MEM_LOADABLE)
46 struct jailhouse_memory {
51 } __attribute__((packed));
53 struct jailhouse_irqchip {
57 } __attribute__((packed));
59 #define JAILHOUSE_PCI_TYPE_DEVICE 0x01
60 #define JAILHOUSE_PCI_TYPE_BRIDGE 0x02
62 struct jailhouse_pci_device {
71 __u16 num_msix_vectors;
72 __u16 msix_region_size;
74 } __attribute__((packed));
76 #define JAILHOUSE_PCICAPS_WRITE 0x0001
78 struct jailhouse_pci_capability {
83 } __attribute__((packed));
85 #define JAILHOUSE_MAX_DMAR_UNITS 8
87 struct jailhouse_system {
88 struct jailhouse_memory hypervisor_memory;
92 __u8 mmconfig_end_bus;
94 __u16 pm_timer_address;
95 __u64 dmar_unit_base[JAILHOUSE_MAX_DMAR_UNITS];
96 } __attribute__((packed)) x86;
97 } __attribute__((packed)) platform_info;
99 __u32 interrupt_limit;
100 struct jailhouse_cell_desc root_cell;
101 } __attribute__((packed));
104 jailhouse_cell_config_size(struct jailhouse_cell_desc *cell)
106 return sizeof(struct jailhouse_cell_desc) +
108 cell->num_memory_regions * sizeof(struct jailhouse_memory) +
109 cell->num_irqchips * sizeof(struct jailhouse_irqchip) +
110 cell->pio_bitmap_size +
111 cell->num_pci_devices * sizeof(struct jailhouse_pci_device) +
112 cell->num_pci_caps * sizeof(struct jailhouse_pci_capability);
116 jailhouse_system_config_size(struct jailhouse_system *system)
118 return sizeof(*system) - sizeof(system->root_cell) +
119 jailhouse_cell_config_size(&system->root_cell);
122 static inline const unsigned long *
123 jailhouse_cell_cpu_set(const struct jailhouse_cell_desc *cell)
125 return (const unsigned long *)((const void *)cell +
126 sizeof(struct jailhouse_cell_desc));
129 static inline const struct jailhouse_memory *
130 jailhouse_cell_mem_regions(const struct jailhouse_cell_desc *cell)
132 return (const struct jailhouse_memory *)
133 ((void *)jailhouse_cell_cpu_set(cell) + cell->cpu_set_size);
136 static inline const struct jailhouse_irqchip *
137 jailhouse_cell_irqchips(const struct jailhouse_cell_desc *cell)
139 return (const struct jailhouse_irqchip *)
140 ((void *)jailhouse_cell_mem_regions(cell) +
141 cell->num_memory_regions * sizeof(struct jailhouse_memory));
144 static inline const __u8 *
145 jailhouse_cell_pio_bitmap(const struct jailhouse_cell_desc *cell)
147 return (const __u8 *)((void *)jailhouse_cell_irqchips(cell) +
148 cell->num_irqchips * sizeof(struct jailhouse_irqchip));
151 static inline const struct jailhouse_pci_device *
152 jailhouse_cell_pci_devices(const struct jailhouse_cell_desc *cell)
154 return (const struct jailhouse_pci_device *)
155 ((void *)jailhouse_cell_pio_bitmap(cell) +
156 cell->pio_bitmap_size);
159 static inline const struct jailhouse_pci_capability *
160 jailhouse_cell_pci_caps(const struct jailhouse_cell_desc *cell)
162 return (const struct jailhouse_pci_capability *)
163 ((void *)jailhouse_cell_pci_devices(cell) +
164 cell->num_pci_devices * sizeof(struct jailhouse_pci_device));
167 #endif /* !_JAILHOUSE_CELL_CONFIG_H */