#ifndef TARGET_CORTEXM_H
#define TARGET_CORTEXM_H
#include "target.h"
#include "adiv5.h"
#include "cortex.h"
extern unsigned cortexm_wait_timeout;
#define CORTEXM_PPB_BASE 0xe0000000U
#define CORTEXM_SCS_BASE (CORTEXM_PPB_BASE + 0xe000U)
#define CORTEXM_CPUID (CORTEXM_SCS_BASE + 0xd00U)
#define CORTEXM_AIRCR (CORTEXM_SCS_BASE + 0xd0cU)
#define CORTEXM_CFSR (CORTEXM_SCS_BASE + 0xd28U)
#define CORTEXM_HFSR (CORTEXM_SCS_BASE + 0xd2cU)
#define CORTEXM_DFSR (CORTEXM_SCS_BASE + 0xd30U)
#define CORTEXM_CPACR (CORTEXM_SCS_BASE + 0xd88U)
#define CORTEXM_DHCSR (CORTEXM_SCS_BASE + 0xdf0U)
#define CORTEXM_DCRSR (CORTEXM_SCS_BASE + 0xdf4U)
#define CORTEXM_DCRDR (CORTEXM_SCS_BASE + 0xdf8U)
#define CORTEXM_DEMCR (CORTEXM_SCS_BASE + 0xdfcU)
#define CORTEXM_CLIDR (CORTEXM_SCS_BASE + 0xd78U)
#define CORTEXM_CTR (CORTEXM_SCS_BASE + 0xd7cU)
#define CORTEXM_CCSIDR (CORTEXM_SCS_BASE + 0xd80U)
#define CORTEXM_CSSELR (CORTEXM_SCS_BASE + 0xd84U)
#define CORTEXM_ICIALLU (CORTEXM_SCS_BASE + 0xf50U)
#define CORTEXM_DCCMVAC (CORTEXM_SCS_BASE + 0xf68U)
#define CORTEXM_DCCIMVAC (CORTEXM_SCS_BASE + 0xf70U)
#define CORTEXM_FPB_BASE (CORTEXM_PPB_BASE + 0x2000U)
#define CORTEXM_FPB_CTRL (CORTEXM_FPB_BASE + 0x000U)
#define CORTEXM_FPB_REMAP (CORTEXM_FPB_BASE + 0x004U)
#define CORTEXM_FPB_COMP(i) (CORTEXM_FPB_BASE + 0x008U + (4U * (i)))
#define CORTEXM_DWT_BASE (CORTEXM_PPB_BASE + 0x1000U)
#define CORTEXM_DWT_CTRL (CORTEXM_DWT_BASE + 0x000U)
#define CORTEXM_DWT_COMP(i) (CORTEXM_DWT_BASE + 0x020U + (0x10U * (i)))
#define CORTEXM_DWT_MASK(i) (CORTEXM_DWT_BASE + 0x024U + (0x10U * (i)))
#define CORTEXM_DWT_FUNC(i) (CORTEXM_DWT_BASE + 0x028U + (0x10U * (i)))
#define CORTEXM_AIRCR_VECTKEY (0x05faU << 16U)
#define CORTEXM_AIRCR_ENDIANESS (1U << 15U)
#define CORTEXM_AIRCR_PRIGROUP (7U << 8U)
#define CORTEXM_AIRCR_SYSRESETREQ (1U << 2U)
#define CORTEXM_AIRCR_VECTCLRACTIVE (1U << 1U)
#define CORTEXM_AIRCR_VECTRESET (1U << 0U)
#define CORTEXM_HFSR_DEBUGEVT (1U << 31U)
#define CORTEXM_HFSR_FORCED (1U << 30U)
#define CORTEXM_HFSR_VECTTBL (1U << 1U)
#define CORTEXM_DFSR_RESETALL 0x1fU
#define CORTEXM_DFSR_EXTERNAL (1U << 4U)
#define CORTEXM_DFSR_VCATCH (1U << 3U)
#define CORTEXM_DFSR_DWTTRAP (1U << 2U)
#define CORTEXM_DFSR_BKPT (1U << 1U)
#define CORTEXM_DFSR_HALTED (1U << 0U)
#define CORTEXM_DHCSR_DBGKEY 0xa05f0000U
#define CORTEXM_DHCSR_S_RESET_ST (1U << 25U)
#define CORTEXM_DHCSR_S_RETIRE_ST (1U << 24U)
#define CORTEXM_DHCSR_S_LOCKUP (1U << 19U)
#define CORTEXM_DHCSR_S_SLEEP (1U << 18U)
#define CORTEXM_DHCSR_S_HALT (1U << 17U)
#define CORTEXM_DHCSR_S_REGRDY (1U << 16U)
#define CORTEXM_DHCSR_C_SNAPSTALL (1U << 5U)
#define CORTEXM_DHCSR_C_MASKINTS (1U << 3U)
#define CORTEXM_DHCSR_C_STEP (1U << 2U)
#define CORTEXM_DHCSR_C_HALT (1U << 1U)
#define CORTEXM_DHCSR_C_DEBUGEN (1U << 0U)
#define CORTEXM_DCRSR_REGWnR 0x00010000U
#define CORTEXM_DCRSR_REGSEL_MASK 0x0000001fU
#define CORTEXM_DCRSR_REGSEL_XPSR 0x00000010U
#define CORTEXM_DCRSR_REGSEL_MSP 0x00000011U
#define CORTEXM_DCRSR_REGSEL_PSP 0x00000012U
#define CORTEXM_DEMCR_TRCENA (1U << 24U)
#define CORTEXM_DEMCR_MON_REQ (1U << 19U)
#define CORTEXM_DEMCR_MON_STEP (1U << 18U)
#define CORTEXM_DEMCR_VC_MON_PEND (1U << 17U)
#define CORTEXM_DEMCR_VC_MON_EN (1U << 16U)
#define CORTEXM_DEMCR_VC_HARDERR (1U << 10U)
#define CORTEXM_DEMCR_VC_INTERR (1U << 9U)
#define CORTEXM_DEMCR_VC_BUSERR (1U << 8U)
#define CORTEXM_DEMCR_VC_STATERR (1U << 7U)
#define CORTEXM_DEMCR_VC_CHKERR (1U << 6U)
#define CORTEXM_DEMCR_VC_NOCPERR (1U << 5U)
#define CORTEXM_DEMCR_VC_MMERR (1U << 4U)
#define CORTEXM_DEMCR_VC_CORERESET (1U << 0U)
#define CORTEXM_FPB_CTRL_KEY (1U << 1U)
#define CORTEXM_FPB_CTRL_ENABLE (1U << 0U)
#define CORTEXM_DWT_MASK_BYTE (0U)
#define CORTEXM_DWT_MASK_HALFWORD (1U)
#define CORTEXM_DWT_MASK_WORD (2U)
#define CORTEXM_DWT_MASK_DWORD (3U)
#define CORTEXM_DWT_FUNC_MATCHED (1U << 24U)
#define CORTEXM_DWT_FUNC_DATAVSIZE_WORD (2U << 10U)
#define CORTEXM_DWT_FUNC_FUNC_READ (5U << 0U)
#define CORTEXM_DWT_FUNC_FUNC_WRITE (6U << 0U)
#define CORTEXM_DWT_FUNC_FUNC_ACCESS (7U << 0U)
#define CORTEXM_XPSR_THUMB (1U << 24U)
#define CORTEXM_XPSR_EXCEPTION_MASK 0x0000001fU
#define CORTEXM_TOPT_INHIBIT_NRST (1U << 2U)
bool cortexm_attach(target_s *t);
void cortexm_detach(target_s *t);
void cortexm_halt_resume(target_s *t, bool step);
bool cortexm_run_stub(target_s *t, uint32_t loadaddr, uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3);
int cortexm_mem_write_sized(target_s *t, target_addr_t dest, const void *src, size_t len, align_e align);
#endif