/* * Test Machine for the IBM PPE42 processor * * Copyright (c) 2025, IBM Corporation. * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "qemu/osdep.h" #include "qemu/units.h" #include "qemu/error-report.h" #include "system/address-spaces.h" #include "hw/boards.h" #include "hw/ppc/ppc.h" #include "system/system.h" #include "system/reset.h" #include "system/kvm.h" #include "qapi/error.h" #define TYPE_PPE42_MACHINE MACHINE_TYPE_NAME("ppe42_machine") typedef MachineClass Ppe42MachineClass; typedef struct Ppe42MachineState Ppe42MachineState; DECLARE_OBJ_CHECKERS(Ppe42MachineState, Ppe42MachineClass, PPE42_MACHINE, TYPE_PPE42_MACHINE) struct Ppe42MachineState { MachineState parent_obj; PowerPCCPU cpu; }; static void main_cpu_reset(void *opaque) { PowerPCCPU *cpu = opaque; cpu_reset(CPU(cpu)); } static void ppe42_machine_init(MachineState *machine) { Ppe42MachineState *pms = PPE42_MACHINE(machine); PowerPCCPU *cpu = &pms->cpu; if (kvm_enabled()) { error_report("machine %s does not support the KVM accelerator", MACHINE_GET_CLASS(machine)->name); exit(EXIT_FAILURE); } if (machine->ram_size > 512 * KiB) { error_report("RAM size more than 512 KiB is not supported"); exit(1); } /* init CPU */ object_initialize_child(OBJECT(pms), "cpu", cpu, machine->cpu_type); if (!qdev_realize(DEVICE(cpu), NULL, &error_fatal)) { return; } qemu_register_reset(main_cpu_reset, cpu); /* This sets the decrementer timebase */ ppc_booke_timers_init(cpu, 37500000, PPC_TIMER_PPE); /* RAM */ memory_region_add_subregion(get_system_memory(), 0xfff80000, machine->ram); } static void ppe42_machine_class_init(ObjectClass *oc, const void *data) { MachineClass *mc = MACHINE_CLASS(oc); static const char * const valid_cpu_types[] = { POWERPC_CPU_TYPE_NAME("PPE42"), POWERPC_CPU_TYPE_NAME("PPE42X"), POWERPC_CPU_TYPE_NAME("PPE42XM"), NULL, }; mc->desc = "PPE42 Test Machine"; mc->init = ppe42_machine_init; mc->default_cpu_type = POWERPC_CPU_TYPE_NAME("PPE42XM"); mc->valid_cpu_types = valid_cpu_types; mc->default_ram_id = "ram"; mc->default_ram_size = 512 * KiB; } static const TypeInfo ppe42_machine_info = { .name = TYPE_PPE42_MACHINE, .parent = TYPE_MACHINE, .instance_size = sizeof(Ppe42MachineState), .class_init = ppe42_machine_class_init, .class_size = sizeof(Ppe42MachineClass), }; static void ppe42_machine_register_types(void) { type_register_static(&ppe42_machine_info); } type_init(ppe42_machine_register_types);