void *tanger_stm_realloc(void *ptr, size_t size) { /* TODO to ITM_imize */ void *p; #ifdef EXPLICIT_TX_PARAMETER struct stm_tx * tx = stm_current_tx(); #endif /* EXPLICIT_TX_PARAMETER */ if (ptr == NULL) { /* Equivalent to malloc */ return tanger_stm_malloc(size); } if (size == 0) { /* Equivalent to free */ tanger_stm_free(ptr); return NULL; } /* Allocate new region */ p = tanger_stm_malloc(size); /* Copy old content to new region */ stm_load_bytes(TX_PARAM ptr, p, malloc_usable_size(ptr)); /* Free old region */ tanger_stm_free(ptr); return p; }
TANGER_LOADSTORE_ATTR void tanger_stm_loadregion(tanger_stm_tx_t* tx, uint8_t *src, uintptr_t bytes, uint8_t *dest) { #ifdef STACK_CHECK if (on_stack(src)) memcpy(dest, src, bytes); #endif /* STACK_CHECK */ stm_load_bytes(TX_PARAM src, dest, bytes); }
uint16_t stm_load_u16(TXPARAMS volatile uint16_t *addr) { if (((uintptr_t)addr & 0x01) != 0) { uint16_t val; stm_load_bytes(TXARGS (volatile uint8_t *)addr, (uint8_t *)&val, sizeof(uint16_t)); return val; } else if (sizeof(stm_word_t) == 4) { convert_32_t val; val.u32 = (uint32_t)stm_load(TXARGS (volatile stm_word_t *)((uintptr_t)addr & ~(uintptr_t)0x03)); return val.u16[((uintptr_t)addr & 0x03) >> 1]; } else {
static INLINE uint16_t int_stm_load_u16(volatile uint16_t *addr) { TX_GET; if (unlikely(((uintptr_t)addr & 0x01) != 0)) { uint16_t val; stm_load_bytes((volatile uint8_t *)addr, (uint8_t *)&val, sizeof(uint16_t)); return val; } else if (sizeof(stm_word_t) == 4) { convert_32_t val; val.u32 = (uint32_t)TM_LOAD((volatile stm_word_t *)((uintptr_t)addr & ~(uintptr_t)0x03)); return val.u16[((uintptr_t)addr & 0x03) >> 1]; } else {