// #include // #include #include #include #include #include "riscv_test.h" // void free(void *ptr); // void *malloc(size_t size); void free(void * __capability ptr); void * __capability malloc(size_t size); 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, 15); // *((char *__capability)csp1) = 'Z'; // char val = *((char *__capability)csp1); // char val1 = *((char *__capability)csp1); // if (val != 'Z') { // while (1); // } // return 0; // } int main(void) { int * __capability a = malloc(30); char * __capability b = malloc(16); // if (!a || !b) return -1; a[0] = 1; a[1] = 'C'; b[0] = 'B'; b[10] = 'D'; // This will fault (out-of-bounds) // a[20] = 'X'; if (a[0] != 1) { while (1); } if (b[10] != 'D') { while (1); } free(a); // b = NULL; // if (b[0] == 'B') { // while (1); // } // char * __capability c = malloc(16); // if (c[0] != 'B') { // while (1); // } return 0; }