19 kSecMmioMaskVal = 0x21692436u,
23 kSecMmioValZero = 0x3ca5965a,
24 kSecMmioValOne = 0xc35a69a5,
36 static void upsert_register(uint32_t addr, uint32_t value) {
38 uint32_t i = 0, j = last_index - 1;
39 for (; launder32(i) < last_index && launder32(j) < last_index; ++i, --j) {
61 uint32_t i = 0, r = kEntryCount - 1;
62 for (; launder32(i) < kEntryCount && launder32(r) < kEntryCount; ++i, --r) {
79 for (; launder32(i) < kEntryCount && launder32(r) < kEntryCount; ++i, --r) {
90 uint32_t value = abs_mmio_read32(addr);
91 uint32_t masked_value = value ^ kSecMmioMaskVal;
93 upsert_register(addr, masked_value);
100 abs_mmio_write32(addr, value);
101 uint32_t masked_value = value ^ kSecMmioMaskVal;
103 upsert_register(addr, masked_value);
111 abs_mmio_write32(addr, value);
112 abs_mmio_write32(addr, value);
113 uint32_t masked_value = value ^ kSecMmioMaskVal;
115 upsert_register(addr, masked_value);
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;
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;
184 result ^= expected_check_count;