16bf436cfSPeter Maydell /* 26bf436cfSPeter Maydell * ARMv7M NVIC object 36bf436cfSPeter Maydell * 46bf436cfSPeter Maydell * Copyright (c) 2017 Linaro Ltd 56bf436cfSPeter Maydell * Written by Peter Maydell <peter.maydell@linaro.org> 66bf436cfSPeter Maydell * 76bf436cfSPeter Maydell * This code is licensed under the GPL version 2 or later. 86bf436cfSPeter Maydell */ 96bf436cfSPeter Maydell 106bf436cfSPeter Maydell #ifndef HW_ARM_ARMV7M_NVIC_H 116bf436cfSPeter Maydell #define HW_ARM_ARMV7M_NVIC_H 126bf436cfSPeter Maydell 136bf436cfSPeter Maydell #include "target/arm/cpu.h" 146bf436cfSPeter Maydell #include "hw/sysbus.h" 15ff68dacbSPeter Maydell #include "hw/timer/armv7m_systick.h" 166bf436cfSPeter Maydell 176bf436cfSPeter Maydell #define TYPE_NVIC "armv7m_nvic" 186bf436cfSPeter Maydell 196bf436cfSPeter Maydell #define NVIC(obj) \ 206bf436cfSPeter Maydell OBJECT_CHECK(NVICState, (obj), TYPE_NVIC) 216bf436cfSPeter Maydell 226bf436cfSPeter Maydell /* Highest permitted number of exceptions (architectural limit) */ 236bf436cfSPeter Maydell #define NVIC_MAX_VECTORS 512 246bf436cfSPeter Maydell 256bf436cfSPeter Maydell typedef struct VecInfo { 266bf436cfSPeter Maydell /* Exception priorities can range from -3 to 255; only the unmodifiable 276bf436cfSPeter Maydell * priority values for RESET, NMI and HardFault can be negative. 286bf436cfSPeter Maydell */ 296bf436cfSPeter Maydell int16_t prio; 306bf436cfSPeter Maydell uint8_t enabled; 316bf436cfSPeter Maydell uint8_t pending; 326bf436cfSPeter Maydell uint8_t active; 336bf436cfSPeter Maydell uint8_t level; /* exceptions <=15 never set level */ 346bf436cfSPeter Maydell } VecInfo; 356bf436cfSPeter Maydell 366bf436cfSPeter Maydell typedef struct NVICState { 376bf436cfSPeter Maydell /*< private >*/ 386bf436cfSPeter Maydell SysBusDevice parent_obj; 396bf436cfSPeter Maydell /*< public >*/ 406bf436cfSPeter Maydell 416bf436cfSPeter Maydell ARMCPU *cpu; 426bf436cfSPeter Maydell 436bf436cfSPeter Maydell VecInfo vectors[NVIC_MAX_VECTORS]; 446bf436cfSPeter Maydell uint32_t prigroup; 456bf436cfSPeter Maydell 466bf436cfSPeter Maydell /* vectpending and exception_prio are both cached state that can 476bf436cfSPeter Maydell * be recalculated from the vectors[] array and the prigroup field. 486bf436cfSPeter Maydell */ 496bf436cfSPeter Maydell unsigned int vectpending; /* highest prio pending enabled exception */ 506bf436cfSPeter Maydell int exception_prio; /* group prio of the highest prio active exception */ 516bf436cfSPeter Maydell 526bf436cfSPeter Maydell MemoryRegion sysregmem; 53*f104919dSPeter Maydell MemoryRegion sysreg_ns_mem; 546bf436cfSPeter Maydell MemoryRegion container; 556bf436cfSPeter Maydell 566bf436cfSPeter Maydell uint32_t num_irq; 576bf436cfSPeter Maydell qemu_irq excpout; 586bf436cfSPeter Maydell qemu_irq sysresetreq; 59ff68dacbSPeter Maydell 60ff68dacbSPeter Maydell SysTickState systick; 616bf436cfSPeter Maydell } NVICState; 626bf436cfSPeter Maydell 636bf436cfSPeter Maydell #endif 64