/* * ARMv7M CPU object * * Copyright (c) 2017 Linaro Ltd * Written by Peter Maydell * * This code is licensed under the GPL version 2 or later. */ #ifndef HW_ARM_ARMV7M_H #define HW_ARM_ARMV7M_H #include "hw/sysbus.h" #include "hw/intc/armv7m_nvic.h" #include "hw/misc/armv7m_ras.h" #include "target/arm/idau.h" #include "qom/object.h" #include "hw/clock.h" #define TYPE_BITBAND "ARM-bitband-memory" OBJECT_DECLARE_SIMPLE_TYPE(BitBandState, BITBAND) struct BitBandState { /*< private >*/ SysBusDevice parent_obj; /*< public >*/ AddressSpace source_as; MemoryRegion iomem; uint32_t base; MemoryRegion *source_memory; }; #define TYPE_ARMV7M "armv7m" OBJECT_DECLARE_SIMPLE_TYPE(ARMv7MState, ARMV7M) #define ARMV7M_NUM_BITBANDS 2 /* ARMv7M container object. * + Unnamed GPIO input lines: external IRQ lines for the NVIC * + Named GPIO output SYSRESETREQ: signalled for guest AIRCR.SYSRESETREQ. * If this GPIO is not wired up then the NVIC will default to performing * a qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET). * + Property "cpu-type": CPU type to instantiate * + Property "num-irq": number of external IRQ lines * + Property "memory": MemoryRegion defining the physical address space * that CPU accesses see. (The NVIC, bitbanding and other CPU-internal * devices will be automatically layered on top of this view.) * + Property "idau": IDAU interface (forwarded to CPU object) * + Property "init-svtor": secure VTOR reset value (forwarded to CPU object) * + Property "init-nsvtor": non-secure VTOR reset value (forwarded to CPU object) * + Property "vfp": enable VFP (forwarded to CPU object) * + Property "dsp": enable DSP (forwarded to CPU object) * + Property "enable-bitband": expose bitbanded IO * + Property "mpu-ns-regions": number of Non-Secure MPU regions (forwarded * to CPU object pmsav7-dregion property; default is whatever the default * for the CPU is) * + Property "mpu-s-regions": number of Secure MPU regions (default is * whatever the default for the CPU is; must currently be set to the same * value as mpu-ns-regions if the CPU implements the Security Extension) * + Clock input "refclk" is the external reference clock for the systick timers * + Clock input "cpuclk" is the main CPU clock */ struct ARMv7MState { /*< private >*/ SysBusDevice parent_obj; /*< public >*/ NVICState nvic; BitBandState bitband[ARMV7M_NUM_BITBANDS]; ARMCPU *cpu; ARMv7MRAS ras; SysTickState systick[M_REG_NUM_BANKS]; /* MemoryRegion we pass to the CPU, with our devices layered on * top of the ones the board provides in board_memory. */ MemoryRegion container; /* * MemoryRegion which passes the transaction to either the S or the * NS systick device depending on the transaction attributes */ MemoryRegion systickmem; /* * MemoryRegion which enforces the S/NS handling of the systick * device NS alias region and passes the transaction to the * NS systick device if appropriate. */ MemoryRegion systick_ns_mem; /* Ditto, for the sysregs region provided by the NVIC */ MemoryRegion sysreg_ns_mem; /* MR providing default PPB behaviour */ MemoryRegion defaultmem; Clock *refclk; Clock *cpuclk; /* Properties */ char *cpu_type; /* MemoryRegion the board provides to us (with its devices, RAM, etc) */ MemoryRegion *board_memory; Object *idau; uint32_t init_svtor; uint32_t init_nsvtor; uint32_t mpu_ns_regions; uint32_t mpu_s_regions; bool enable_bitband; bool start_powered_off; bool vfp; bool dsp; }; #endif