mirror of https://gitee.com/openkylin/qemu.git
spapr: Consolidate cpu init code into a routine
Factor out bits of sPAPR specific CPU initialization code into a separate routine so that it can be called from CPU hotplug path too. Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
0da6f3fef9
commit
bab99ea098
|
@ -1408,6 +1408,34 @@ static void spapr_boot_set(void *opaque, const char *boot_device,
|
||||||
machine->boot_order = g_strdup(boot_device);
|
machine->boot_order = g_strdup(boot_device);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void spapr_cpu_init(sPAPRMachineState *spapr, PowerPCCPU *cpu)
|
||||||
|
{
|
||||||
|
CPUPPCState *env = &cpu->env;
|
||||||
|
|
||||||
|
/* Set time-base frequency to 512 MHz */
|
||||||
|
cpu_ppc_tb_init(env, TIMEBASE_FREQ);
|
||||||
|
|
||||||
|
/* PAPR always has exception vectors in RAM not ROM. To ensure this,
|
||||||
|
* MSR[IP] should never be set.
|
||||||
|
*/
|
||||||
|
env->msr_mask &= ~(1 << 6);
|
||||||
|
|
||||||
|
/* Tell KVM that we're in PAPR mode */
|
||||||
|
if (kvm_enabled()) {
|
||||||
|
kvmppc_set_papr(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cpu->max_compat) {
|
||||||
|
if (ppc_set_compat(cpu, cpu->max_compat) < 0) {
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
xics_cpu_setup(spapr->icp, cpu);
|
||||||
|
|
||||||
|
qemu_register_reset(spapr_cpu_reset, cpu);
|
||||||
|
}
|
||||||
|
|
||||||
/* pSeries LPAR / sPAPR hardware init */
|
/* pSeries LPAR / sPAPR hardware init */
|
||||||
static void ppc_spapr_init(MachineState *machine)
|
static void ppc_spapr_init(MachineState *machine)
|
||||||
{
|
{
|
||||||
|
@ -1417,7 +1445,6 @@ static void ppc_spapr_init(MachineState *machine)
|
||||||
const char *kernel_cmdline = machine->kernel_cmdline;
|
const char *kernel_cmdline = machine->kernel_cmdline;
|
||||||
const char *initrd_filename = machine->initrd_filename;
|
const char *initrd_filename = machine->initrd_filename;
|
||||||
PowerPCCPU *cpu;
|
PowerPCCPU *cpu;
|
||||||
CPUPPCState *env;
|
|
||||||
PCIHostState *phb;
|
PCIHostState *phb;
|
||||||
int i;
|
int i;
|
||||||
MemoryRegion *sysmem = get_system_memory();
|
MemoryRegion *sysmem = get_system_memory();
|
||||||
|
@ -1502,30 +1529,7 @@ static void ppc_spapr_init(MachineState *machine)
|
||||||
fprintf(stderr, "Unable to find PowerPC CPU definition\n");
|
fprintf(stderr, "Unable to find PowerPC CPU definition\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
env = &cpu->env;
|
spapr_cpu_init(spapr, cpu);
|
||||||
|
|
||||||
/* Set time-base frequency to 512 MHz */
|
|
||||||
cpu_ppc_tb_init(env, TIMEBASE_FREQ);
|
|
||||||
|
|
||||||
/* PAPR always has exception vectors in RAM not ROM. To ensure this,
|
|
||||||
* MSR[IP] should never be set.
|
|
||||||
*/
|
|
||||||
env->msr_mask &= ~(1 << 6);
|
|
||||||
|
|
||||||
/* Tell KVM that we're in PAPR mode */
|
|
||||||
if (kvm_enabled()) {
|
|
||||||
kvmppc_set_papr(cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cpu->max_compat) {
|
|
||||||
if (ppc_set_compat(cpu, cpu->max_compat) < 0) {
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
xics_cpu_setup(spapr->icp, cpu);
|
|
||||||
|
|
||||||
qemu_register_reset(spapr_cpu_reset, cpu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kvm_enabled()) {
|
if (kvm_enabled()) {
|
||||||
|
|
Loading…
Reference in New Issue