@@ -65,6 +65,28 @@ const int armv7m_msp_reg_map[ARMV7M_NUM_CORE_REGS] = {
6565 ARMV7M_XPSR ,
6666};
6767
68+ static struct reg_data_type_bitfield armv8m_vpr_bits [] = {
69+ { 0 , 15 , REG_TYPE_UINT },
70+ { 16 , 19 , REG_TYPE_UINT },
71+ { 20 , 23 , REG_TYPE_UINT },
72+ };
73+
74+ static struct reg_data_type_flags_field armv8m_vpr_fields [] = {
75+ { "P0" , armv8m_vpr_bits + 0 , armv8m_vpr_fields + 1 , },
76+ { "MASK01" , armv8m_vpr_bits + 1 , armv8m_vpr_fields + 2 , },
77+ { "MASK23" , armv8m_vpr_bits + 2 , NULL },
78+ };
79+
80+ static struct reg_data_type_flags armv8m_vpr_flags [] = {
81+ { 4 , armv8m_vpr_fields },
82+ };
83+
84+ static struct reg_data_type armv8m_flags_vpr [] = {
85+ { REG_TYPE_ARCH_DEFINED , "vpr_reg" , REG_TYPE_CLASS_FLAGS ,
86+ { .reg_type_flags = armv8m_vpr_flags },
87+ },
88+ };
89+
6890/*
6991 * These registers are not memory-mapped. The ARMv7-M profile includes
7092 * memory mapped registers too, such as for the NVIC (interrupt controller)
@@ -158,6 +180,8 @@ static const struct {
158180 { ARMV7M_D15 , "d15" , 64 , REG_TYPE_IEEE_DOUBLE , "float" , "org.gnu.gdb.arm.vfp" , NULL , },
159181
160182 { ARMV7M_FPSCR , "fpscr" , 32 , REG_TYPE_INT , "float" , "org.gnu.gdb.arm.vfp" , NULL , },
183+
184+ { ARMV8M_VPR , "vpr" , 32 , REG_TYPE_INT , "float" , "org.gnu.gdb.arm.m-profile-mve" , armv8m_flags_vpr , },
161185};
162186
163187#define ARMV7M_NUM_REGS ARRAY_SIZE(armv7m_regs)
@@ -273,6 +297,9 @@ uint32_t armv7m_map_id_to_regsel(unsigned int arm_reg_id)
273297 case ARMV7M_FPSCR :
274298 return ARMV7M_REGSEL_FPSCR ;
275299
300+ case ARMV8M_VPR :
301+ return ARMV8M_REGSEL_VPR ;
302+
276303 case ARMV7M_D0 ... ARMV7M_D15 :
277304 return ARMV7M_REGSEL_S0 + 2 * (arm_reg_id - ARMV7M_D0 );
278305
0 commit comments