89uint32_t sec_mmio_read32(uint32_t addr) {
90 uint32_t value = abs_mmio_read32(addr);
91 uint32_t masked_value = value ^ kSecMmioMaskVal;
92 barrier32(masked_value);
93 upsert_register(addr, masked_value);
99void sec_mmio_write32(uint32_t addr, uint32_t value) {
100 abs_mmio_write32(addr, value);
101 uint32_t masked_value = value ^ kSecMmioMaskVal;
102 barrier32(masked_value);
103 upsert_register(addr, masked_value);
109void sec_mmio_write32_shadowed(uint32_t addr, uint32_t value) {
111 abs_mmio_write32(addr, value);
112 abs_mmio_write32(addr, value);
113 uint32_t masked_value = value ^ kSecMmioMaskVal;
114 barrier32(masked_value);
115 upsert_register(addr, masked_value);
121void sec_mmio_check_values(uint32_t rnd_offset) {
124 uint32_t offset = ((uint64_t)rnd_offset * (uint64_t)last_index) >> 32;
126 uint32_t i = 0, r = last_index - 1;
127 for (; launder32(i) < last_index && launder32(r) < last_index; ++i, --r) {
132 if (offset >= last_index) {
133 offset -= last_index;
142void sec_mmio_check_values_except_otp(uint32_t rnd_offset, uint32_t otp_base) {
145 uint32_t offset = ((uint64_t)rnd_offset * (uint64_t)last_index) >> 32;
147 uint32_t i = 0, r = last_index - 1;
150 HARDENED_CHECK_NE(otp_base & 0xFFFF0000, 0);
151 for (; launder32(i) < last_index && launder32(r) < last_index; ++i, --r) {
154 if ((address & 0xFFFF0000) != otp_base) {
155 uint32_t read_value = abs_mmio_read32(launder32(address));
162 if (offset >= last_index) {
163 offset -= last_index;