#include #include void test() { void *__capability c1; // Set address c1 = (void *__capability)0x80001009; c1 = cheri_bounds_set(c1, 8); } // Add delta value for TLB translation static inline void * __capability add_delta(void * __capability cap, int offset) { void * __capability result; asm volatile ( "candperm %0, %1, %2" : "=C" (result) // Output: %0 (result) : "C" (cap), // Input: %1 (original cap) "r" (offset) // Input: %2 (offset register) : // No clobbered registers ); return result; } int main(void) { void *__capability csp1; void *__capability base = cheri_ddc_get(); uintptr_t addr = 0x80001000; // must be valid RAM in your system csp1 = cheri_address_set(base, addr); csp1 = cheri_bounds_set(csp1, 16); csp1 = add_delta(csp1, 3); *((char *__capability)csp1) = 'Z'; char val = *((char *__capability)csp1); char val1 = *((char *__capability)csp1); if (val != 'Z') { while (1); } return 0; }