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 #include <asm/control.h>
14 #include <asm/irqchip.h>
15 #include <asm/percpu.h>
16 #include <asm/platform.h>
17 #include <asm/setup.h>
18 #include <asm/sysregs.h>
19 #include <jailhouse/control.h>
20 #include <jailhouse/entry.h>
21 #include <jailhouse/paging.h>
22 #include <jailhouse/string.h>
24 unsigned int cache_line_size;
26 static int arch_check_features(void)
31 arm_read_sysreg(ID_PFR1_EL1, pfr1);
36 arm_read_sysreg(CTR_EL0, ctr);
37 /* Extract the minimal cache line size */
38 cache_line_size = 4 << (ctr >> 16 & 0xf);
43 int arch_init_early(void)
47 if ((err = arch_check_features()) != 0)
50 err = arch_mmu_cell_init(&root_cell);
54 err = arch_map_device(UART_BASE_PHYS, UART_BASE_VIRT, PAGE_SIZE);
59 int arch_cpu_init(struct per_cpu *cpu_data)
62 unsigned long hcr = HCR_VM_BIT | HCR_IMO_BIT | HCR_FMO_BIT
65 cpu_data->psci_mbox.entry = 0;
66 cpu_data->virt_id = cpu_data->cpu_id;
69 * Copy the registers to restore from the linux stack here, because we
70 * won't be able to access it later
72 memcpy(&cpu_data->linux_reg, (void *)cpu_data->linux_sp, NUM_ENTRY_REGS
73 * sizeof(unsigned long));
75 err = switch_exception_level(cpu_data);
80 * Save pointer in the thread local storage
81 * Must be done early in order to handle aborts and errors in the setup
84 arm_write_sysreg(TPIDR_EL2, cpu_data);
86 /* Setup guest traps */
87 arm_write_sysreg(HCR, hcr);
89 err = arch_spin_init();
93 err = arch_mmu_cpu_cell_init(cpu_data);
101 err = irqchip_cpu_init(cpu_data);
106 int arch_init_late(void)
108 /* Setup the SPI bitmap */
109 irqchip_cell_init(&root_cell);
111 return map_root_memory_regions();
114 void arch_cpu_activate_vmm(struct per_cpu *cpu_data)
116 /* Return to the kernel */
117 cpu_return_el1(cpu_data);
122 void arch_cpu_restore(struct per_cpu *cpu_data)
126 // catch missing symbols
127 void arch_shutdown_cpu(unsigned int cpu_id) {}
128 void arch_shutdown(void) {}