/* * Copyright (c) 2023 Arm Limited. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include #include "cmpt.h" #include "morello.h" // This function will run inside compartment static void *fun(void *arg) { printf("inside...\n"); printf("csp: %s\n", cap_to_str(NULL, cheri_csp_get())); printf("cid: %s\n", cap_to_str(NULL, cheri_cid_get())); printf("pcc: %s\n", cap_to_str(NULL, cheri_pcc_get())); *((int *)arg) = 0; return arg; } int main(int argc, char const *argv[]) { init_cmpt_manager(1000); // Create compartment for the "fun" function cmpt_flags_t flags = { .pcc_system_reg = false, .stack_store_local = false, .stack_mutable_load = true }; cmpt_fun_t *fun_in_cmpt = create_cmpt(fun, 4 /* pages */, &flags); if (!fun_in_cmpt) { perror("create_cmpt"); return 1; } int arg = 9; // Stack before: printf("before...\n"); printf("csp: %s\n", cap_to_str(NULL, cheri_csp_get())); printf("cid: %s\n", cap_to_str(NULL, cheri_cid_get())); printf("pcc: %s\n", cap_to_str(NULL, cheri_pcc_get())); // Invoke function in the compartment int *res = fun_in_cmpt(&arg); // Stack after: printf("after...\n"); printf("csp: %s\n", cap_to_str(NULL, cheri_csp_get())); printf("cid: %s\n", cap_to_str(NULL, cheri_cid_get())); printf("pcc: %s\n", cap_to_str(NULL, cheri_pcc_get())); return *res; }