X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fhelper%2Fbinarybuffer.h;h=ae0ee9a101b2452b30658129769060a0ae49c71b;hb=be01786186951b42d8aa8b8968ac1615e080a9c7;hp=a51c2e57846e94b785ac11ba5e9087decd9ad49e;hpb=e4ee891759b08d3edb258b34f00b4ae8e3298d06;p=openocd.git diff --git a/src/helper/binarybuffer.h b/src/helper/binarybuffer.h index a51c2e5784..ae0ee9a101 100644 --- a/src/helper/binarybuffer.h +++ b/src/helper/binarybuffer.h @@ -23,16 +23,26 @@ #ifndef BINARYBUFFER_H #define BINARYBUFFER_H -#include "types.h" +#include /** @file * Support functions to access arbitrary bits in a byte array */ -/* inlining this will help show what fn that is taking time during profiling. */ -static inline void buf_set_u32(uint8_t* buffer, - unsigned int first, unsigned int num, uint32_t value) +/** + * Sets @c num bits in @c _buffer, starting at the @c first bit, + * using the bits in @c value. This routine fast-paths writes + * of little-endian, byte-aligned, 32-bit words. + * @param _buffer The buffer whose bits will be set. + * @param first The bit offset in @c _buffer to start writing (0-31). + * @param num The number of bits from @c value to copy (1-32). + * @param value Up to 32 bits that will be copied to _buffer. + */ +static inline void buf_set_u32(void *_buffer, + unsigned first, unsigned num, uint32_t value) { + uint8_t *buffer = (uint8_t *)_buffer; + if ((num == 32) && (first == 0)) { buffer[3] = (value >> 24) & 0xff; buffer[2] = (value >> 16) & 0xff; @@ -48,9 +58,20 @@ static inline void buf_set_u32(uint8_t* buffer, } } } -static inline uint32_t buf_get_u32(const uint8_t* buffer, - unsigned int first, unsigned int num) +/** + * Retrieves @c num bits from @c _buffer, starting at the @c first bit, + * returning the bits in a 32-bit word. This routine fast-paths reads + * of little-endian, byte-aligned, 32-bit words. + * @param _buffer The buffer whose bits will be read. + * @param first The bit offset in @c _buffer to start reading (0-31). + * @param num The number of bits from @c _buffer to read (1-32). + * @returns Up to 32-bits that were read from @c _buffer. + */ +static inline uint32_t buf_get_u32(const void *_buffer, + unsigned first, unsigned num) { + uint8_t *buffer = (uint8_t *)_buffer; + if ((num == 32) && (first == 0)) { return (((uint32_t)buffer[3]) << 24) | (((uint32_t)buffer[2]) << 16) | @@ -67,26 +88,46 @@ static inline uint32_t buf_get_u32(const uint8_t* buffer, } } -/// flip_u32 inverts the bit order inside a 32-bit word (31..0 -> 0..31) -uint32_t flip_u32(uint32_t value, unsigned int num); +/** + * Inverts the ordering of bits inside a 32-bit word (e.g. 31..0 -> 0..31). + * This routine can be used to flip smaller data types by using smaller + * values for @c width. + * @param value The word to flip. + * @param width The number of bits in value (2-32). + * @returns A 32-bit word with @c value in reversed bit-order. + */ +uint32_t flip_u32(uint32_t value, unsigned width); bool buf_cmp(const void *buf1, const void *buf2, unsigned size); bool buf_cmp_mask(const void *buf1, const void *buf2, const void *mask, unsigned size); -uint8_t* buf_cpy(const uint8_t *from, uint8_t *to, int size); -uint8_t* buf_set_ones(uint8_t *buf, int count); -uint8_t* buf_set_buf(const uint8_t *src, int src_start, - uint8_t *dst, int dst_start, int len); +/** + * Copies @c size bits out of @c from and into @c to. Any extra + * bits in the final byte will be set to zero. + * @param from The buffer to copy into @c to. + * @param to The buffer that will receive the copy of @c from. + * @param size The number of bits to copy. + */ +void* buf_cpy(const void *from, void *to, unsigned size); + +/** + * Set the contents of @c buf with @c count bits, all set to 1. + * @param buf The buffer to fill with ones. + * @param size The number of bits. + * @returns The original buffer (@c buf). + */ +void* buf_set_ones(void *buf, unsigned size); + +void* buf_set_buf(const void *src, unsigned src_start, + void *dst, unsigned dst_start, unsigned len); int str_to_buf(const char *str, unsigned len, void *bin_buf, unsigned buf_size, unsigned radix); char* buf_to_str(const void *buf, unsigned size, unsigned radix); -#define CEIL(m, n) (((m) + (n) - 1) / (n)) - /* read a uint32_t from a buffer in target memory endianness */ -static inline uint32_t fast_target_buffer_get_u32(const uint8_t *p, int le) +static inline uint32_t fast_target_buffer_get_u32(const void *p, bool le) { return le ? le_to_h_u32(p) : be_to_h_u32(p); }