This is an automated email from Gerrit. Hsiangkai Wang (hsiang...@gmail.com) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/1280
-- gerrit commit cdbefce784fb39e378d06a1ab0710fea2a29eeba Author: Hsiangkai Wang <hsiang...@gmail.com> Date: Wed Mar 20 19:32:25 2013 +0800 nds32: avoid generating exceptions as updating system registers If target writes reserved value to R/W register fields, it will generate exceptions. To avoid users to set these unexpected values to registers, add a filter to skip the reserved values as updating registers. Change-Id: Ibffabc3dbd0bb00fbca35b097cf82c7a8df8059a Signed-off-by: Hsiangkai Wang <hsiang...@gmail.com> diff --git a/src/target/nds32.c b/src/target/nds32.c index dab8419..0738461 100644 --- a/src/target/nds32.c +++ b/src/target/nds32.c @@ -184,6 +184,10 @@ static int nds32_set_core_reg(struct reg *reg, uint8_t *buf) return ERROR_TARGET_NOT_HALTED; } + /* ignore values that will generate exception */ + if (nds32_reg_exception(reg_arch_info->num, value)) + return ERROR_OK; + buf_set_u32(reg->value, 0, 32, value); /* update registers to take effect right now */ diff --git a/src/target/nds32_reg.c b/src/target/nds32_reg.c index 9c9f0cc..384e9eb 100644 --- a/src/target/nds32_reg.c +++ b/src/target/nds32_reg.c @@ -21,10 +21,18 @@ #include "config.h" #endif +#include <helper/log.h> #include "nds32_reg.h" static bool nds32_reg_init_done; static struct nds32_reg_s nds32_regs[TOTAL_REG_NUM]; +static struct nds32_reg_exception_s nds32_ex_reg_values[] = { + {MR3, 1, 0x7, 0}, + {MR3, 1, 0x7, 4}, + {MR3, 1, 0x7, 6}, + {MR3, 8, 0x7, 3}, + {0, 0, 0, 0}, +}; static inline void nds32_reg_set(uint32_t number, const char *simple_mnemonic, const char *symbolic_mnemonic, uint32_t sr_index, @@ -335,3 +343,28 @@ const char *nds32_reg_symbolic_name(uint32_t number) { return nds32_regs[number].symbolic_mnemonic; } + +bool nds32_reg_exception(uint32_t number, uint32_t value) +{ + int i; + struct nds32_reg_exception_s *ex_reg_value; + uint32_t field_value; + + i = 0; + while (nds32_ex_reg_values[i].reg_num != 0) { + ex_reg_value = nds32_ex_reg_values + i; + + if (ex_reg_value->reg_num == number) { + field_value = (value >> ex_reg_value->ex_value_bit_pos) & ex_reg_value->ex_value_mask; + if (field_value == ex_reg_value->ex_value) { + LOG_WARNING("It will generate exceptions as setting %d to %s", + value, nds32_regs[number].simple_mnemonic); + return true; + } + } + + i++; + } + + return false; +} diff --git a/src/target/nds32_reg.h b/src/target/nds32_reg.h index 425ae78..739a2cb 100644 --- a/src/target/nds32_reg.h +++ b/src/target/nds32_reg.h @@ -303,11 +303,19 @@ struct nds32_reg_s { uint8_t size; }; +struct nds32_reg_exception_s { + uint32_t reg_num; + uint32_t ex_value_bit_pos; + uint32_t ex_value_mask; + uint32_t ex_value; +}; + void nds32_reg_init(void); uint32_t nds32_reg_sr_index(uint32_t number); enum nds32_reg_type_s nds32_reg_type(uint32_t number); uint8_t nds32_reg_size(uint32_t number); const char *nds32_reg_simple_name(uint32_t number); const char *nds32_reg_symbolic_name(uint32_t number); +bool nds32_reg_exception(uint32_t number, uint32_t value); #endif -- ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_mar _______________________________________________ OpenOCD-devel mailing list OpenOCD-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openocd-devel