2 * Jailhouse, a Linux-based partitioning hypervisor
4 * Copyright (c) Siemens AG, 2014-2016
6 * This work is licensed under the terms of the GNU GPL, version 2. See
7 * the COPYING file in the top-level directory.
9 * Alternatively, you can use or redistribute this file under the following
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
33 * THE POSSIBILITY OF SUCH DAMAGE.
35 * Configuration for ${product[0]} ${product[1]}
36 * created with '${argstr}'
38 * NOTE: This config expects the following to be appended to your kernel cmdline
39 * "memmap=${hex(ourmem[1])}$${hex(ourmem[0])}"
42 #include <linux/types.h>
43 #include <jailhouse/cell-config.h>
45 #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
48 struct jailhouse_system header;
49 __u64 cpus[${int((cpucount + 63) / 64)}];
50 struct jailhouse_memory mem_regions[${len(regions)}];
51 struct jailhouse_irqchip irqchips[${len(irqchips)}];
52 __u8 pio_bitmap[0x2000];
53 struct jailhouse_pci_device pci_devices[${len(pcidevices)}];
54 struct jailhouse_pci_capability pci_caps[${len(pcicaps)}];
55 } __attribute__((packed)) config = {
57 .signature = JAILHOUSE_SYSTEM_SIGNATURE,
58 .hypervisor_memory = {
59 .phys_start = ${hex(hvmem[0])},
60 .size = ${hex(hvmem[1])},
65 .platform_info.x86 = {
66 .mmconfig_base = ${hex(mmconfig.base)},
67 .mmconfig_end_bus = ${hex(mmconfig.end_bus)},
68 .pm_timer_address = ${hex(pm_timer_base)},
71 % for unit in iommu_units:
73 .base = ${hex(unit.base_addr)},
74 .size = ${hex(unit.mmio_size)},
75 % if unit.is_amd_iommu:
76 .amd_bdf = ${hex(unit.amd_bdf)},
77 .amd_base_cap = ${hex(unit.amd_base_cap)},
78 .amd_msi_cap = ${hex(unit.amd_msi_cap)},
79 .amd_features = ${hex(unit.amd_features)},
86 .interrupt_limit = 256,
89 .cpu_set_size = sizeof(config.cpus),
90 .num_memory_regions = ARRAY_SIZE(config.mem_regions),
91 .num_irqchips = ARRAY_SIZE(config.irqchips),
92 .pio_bitmap_size = ARRAY_SIZE(config.pio_bitmap),
93 .num_pci_devices = ARRAY_SIZE(config.pci_devices),
94 .num_pci_caps = ARRAY_SIZE(config.pci_caps),
99 % for n in range(int(cpucount / 64)):
102 % if (cpucount % 64):
103 ${'0x%016x,' % ((1 << (cpucount % 64)) - 1)}
110 % for c in r.comments:
114 .phys_start = ${hex(r.start).strip('L')},
115 .virt_start = ${hex(r.start).strip('L')},
116 .size = ${hex(r.size()).strip('L')},
117 .flags = ${r.flagstr('\t\t')},
126 .address = ${hex(i.address)},
127 .id = ${hex(i.irqchip_id())},
128 .pin_bitmap = 0xffffff,
134 [ 0/8 ... 0x3f/8] = -1,
135 [ 0x40/8 ... 0x47/8] = 0xf0, /* PIT */
136 [ 0x48/8 ... 0x5f/8] = -1,
137 [ 0x60/8 ... 0x67/8] = 0xec, /* HACK: NMI status/control */
138 [ 0x68/8 ... 0x6f/8] = -1,
139 [ 0x70/8 ... 0x77/8] = 0xfc, /* RTC */
140 [ 0x78/8 ... 0x7f/8] = -1,
141 [ 0x80/8 ... 0x87/8] = 0xfe, /* Linux: native_io_delay() */
142 [ 0x88/8 ... 0x3af/8] = -1,
143 [ 0x3b0/8 ... 0x3df/8] = 0x00, /* VGA */
144 [ 0x3e0/8 ... 0xcff/8] = -1,
145 [ 0xd00/8 ... 0xffff/8] = 0, /* HACK: PCI bus */
149 % for d in pcidevices:
153 % if d.iommu is not None:
156 .domain = ${hex(d.domain)},
157 .bdf = ${hex(d.bdf())},
159 ${'0x%08x' % d.bars.mask[0]}, ${'0x%08x' % d.bars.mask[1]}, ${'0x%08x' % d.bars.mask[2]},
160 ${'0x%08x' % d.bars.mask[3]}, ${'0x%08x' % d.bars.mask[4]}, ${'0x%08x' % d.bars.mask[5]},
162 .caps_start = ${d.caps_start},
163 .num_caps = ${d.num_caps},
164 .num_msi_vectors = ${d.num_msi_vectors},
165 .msi_64bits = ${d.msi_64bits},
166 .num_msix_vectors = ${d.num_msix_vectors},
167 .msix_region_size = ${hex(d.msix_region_size)},
168 .msix_address = ${hex(d.msix_address).strip('L')},
175 % for comment in c.comments:
179 % if (c.id & 0x8000) != 0:
180 .id = ${hex(c.id & 0x7fff)} | JAILHOUSE_PCI_EXT_CAP,
184 .start = ${hex(c.start)},