5 #ifndef OPENTITAN_SW_DEVICE_LIB_BASE_HARDENED_H_
6 #define OPENTITAN_SW_DEVICE_LIB_BASE_HARDENED_H_
10 #include "sw/device/lib/base/hardened_asm.h"
194 inline uint32_t launder32(uint32_t val) {
245 #if OT_BUILD_FOR_STATIC_ANALYZER || OT_DISABLE_HARDENING
252 asm volatile(
"" :
"+r"(val));
267 #if OT_BUILD_FOR_STATIC_ANALYZER || OT_DISABLE_HARDENING
270 asm volatile(
"" :
"+r"(val));
361 inline void barrier32(uint32_t val) {
asm volatile(
"" ::
"r"(val)); }
370 inline void barrierw(uintptr_t val) {
asm volatile(
"" ::
"r"(val)); }
475 return (launder32(c) & a) | (launder32(~c) & b);
551 #ifdef OT_PLATFORM_RV32
554 #define HARDENED_UNIMP_SEQUENCE_() "unimp; unimp; unimp;"
556 #define HARDENED_CHECK_OP_EQ_ "beq"
557 #define HARDENED_CHECK_OP_NE_ "bne"
558 #define HARDENED_CHECK_OP_LT_ "bltu"
559 #define HARDENED_CHECK_OP_GT_ "bgtu"
560 #define HARDENED_CHECK_OP_LE_ "bleu"
561 #define HARDENED_CHECK_OP_GE_ "bgeu"
563 #ifndef OT_DISABLE_HARDENING
565 #define HARDENED_CHECK_(op_, a_, b_) \
567 op_ " %0, %1, .L_HARDENED_%=;" \
568 HARDENED_UNIMP_SEQUENCE_() \
573 #define HARDENED_TRAP_() \
575 asm volatile(HARDENED_UNIMP_SEQUENCE_()); \
578 #else // OT_DISABLE_HARDENING
581 #define HARDENED_CHECK_(op_, a_, b_) \
586 #define HARDENED_TRAP_() \
589 #endif // OT_DISABLE_HARDENING
590 #else // OT_PLATFORM_RV32
593 #define HARDENED_CHECK_OP_EQ_ ==
594 #define HARDENED_CHECK_OP_NE_ !=
595 #define HARDENED_CHECK_OP_LT_ <
596 #define HARDENED_CHECK_OP_GT_ >
597 #define HARDENED_CHECK_OP_LE_ <=
598 #define HARDENED_CHECK_OP_GE_ >=
600 #define HARDENED_CHECK_(op_, a_, b_) assert((uint64_t)(a_)op_(uint64_t)(b_))
602 #define HARDENED_TRAP_() __builtin_trap()
603 #endif // OT_PLATFORM_RV32
609 #define HARDENED_TRAP() HARDENED_TRAP_()
635 #define HARDENED_CHECK_EQ(a_, b_) HARDENED_CHECK_(HARDENED_CHECK_OP_EQ_, a_, b_)
636 #define HARDENED_CHECK_NE(a_, b_) HARDENED_CHECK_(HARDENED_CHECK_OP_NE_, a_, b_)
637 #define HARDENED_CHECK_LT(a_, b_) HARDENED_CHECK_(HARDENED_CHECK_OP_LT_, a_, b_)
638 #define HARDENED_CHECK_GT(a_, b_) HARDENED_CHECK_(HARDENED_CHECK_OP_GT_, a_, b_)
639 #define HARDENED_CHECK_LE(a_, b_) HARDENED_CHECK_(HARDENED_CHECK_OP_LE_, a_, b_)
640 #define HARDENED_CHECK_GE(a_, b_) HARDENED_CHECK_(HARDENED_CHECK_OP_GE_, a_, b_)
644 #endif // __cplusplus
646 #endif // OPENTITAN_SW_DEVICE_LIB_BASE_HARDENED_H_