rtos: chibios: fix version display
The field 'struct chibios_chdebug::ch_version' is 16 bits wide, so using le_to_h_u32() and be_to_h_u32() overflows in the following fields of the struct. Restrict the endianness conversion to 16 bits and use the target endianness dependent target_buffer_get_u16(). Convert the 'struct chibios_chdebug::ch_version' to an array of uint8_t. Change-Id: Iaa80e9cb1a65c27512919398b8ffbf14e5c240cd Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/8473 Tested-by: jenkins
This commit is contained in:
parent
1173473f66
commit
8edfdb02ed
|
@ -31,7 +31,7 @@ struct chibios_chdebug {
|
||||||
char ch_identifier[4]; /**< @brief Always set to "main". */
|
char ch_identifier[4]; /**< @brief Always set to "main". */
|
||||||
uint8_t ch_zero; /**< @brief Must be zero. */
|
uint8_t ch_zero; /**< @brief Must be zero. */
|
||||||
uint8_t ch_size; /**< @brief Size of this structure. */
|
uint8_t ch_size; /**< @brief Size of this structure. */
|
||||||
uint16_t ch_version; /**< @brief Encoded ChibiOS/RT version. */
|
uint8_t ch_version[2]; /**< @brief Encoded ChibiOS/RT version. */
|
||||||
uint8_t ch_ptrsize; /**< @brief Size of a pointer. */
|
uint8_t ch_ptrsize; /**< @brief Size of a pointer. */
|
||||||
uint8_t ch_timesize; /**< @brief Size of a @p systime_t. */
|
uint8_t ch_timesize; /**< @brief Size of a @p systime_t. */
|
||||||
uint8_t ch_threadsize; /**< @brief Size of a @p Thread struct. */
|
uint8_t ch_threadsize; /**< @brief Size of a @p Thread struct. */
|
||||||
|
@ -171,13 +171,7 @@ static int chibios_update_memory_signature(struct rtos *rtos)
|
||||||
" expected. Assuming compatibility...");
|
" expected. Assuming compatibility...");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert endianness of version field */
|
const uint16_t ch_version = target_buffer_get_u16(rtos->target, signature->ch_version);
|
||||||
const uint8_t *versiontarget = (const uint8_t *)
|
|
||||||
&signature->ch_version;
|
|
||||||
signature->ch_version = rtos->target->endianness == TARGET_LITTLE_ENDIAN ?
|
|
||||||
le_to_h_u32(versiontarget) : be_to_h_u32(versiontarget);
|
|
||||||
|
|
||||||
const uint16_t ch_version = signature->ch_version;
|
|
||||||
LOG_INFO("Successfully loaded memory map of ChibiOS/RT target "
|
LOG_INFO("Successfully loaded memory map of ChibiOS/RT target "
|
||||||
"running version %i.%i.%i", GET_CH_KERNEL_MAJOR(ch_version),
|
"running version %i.%i.%i", GET_CH_KERNEL_MAJOR(ch_version),
|
||||||
GET_CH_KERNEL_MINOR(ch_version), GET_CH_KERNEL_PATCH(ch_version));
|
GET_CH_KERNEL_MINOR(ch_version), GET_CH_KERNEL_PATCH(ch_version));
|
||||||
|
|
Loading…
Reference in New Issue