/*
* Copyright (c) 2023 Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
typedef unsigned long size_t;
typedef long ssize_t;
typedef _Bool bool;
#include "morello.h"
#define NULL ((void *)0)
size_t cheri_length_get_zero(const void * __capability cap)
{
bool is_null = cap == NULL && cheri_tag_get(cap) == 0ul;
return is_null ? 0ul : cheri_length_get(cap);
}
const void * __capability cheri_get_limit(const void * __capability cap)
{
return cheri_address_set(cap, cheri_base_get(cap)) + cheri_length_get_zero(cap);
}
size_t cheri_get_tail(const void * __capability cap)
{
size_t address = cheri_address_get(cap);
size_t base = cheri_base_get(cap);
size_t limit = cheri_length_get_zero(cap) + base;
if (base <= address && address < limit) {
return limit - address;
} else {
return 0ul;
}
}
bool cheri_in_bounds(const void * __capability cap)
{
size_t address = cheri_address_get(cap);
size_t base = cheri_base_get(cap);
return base <= address && address < (base + cheri_length_get(cap));
}
bool cheri_is_deref(const void * __capability cap)
{
return cheri_is_valid(cap) && cheri_in_bounds(cap) && !cheri_is_sealed(cap);
}
bool cheri_is_local(const void * __capability cap)
{
return !cheri_check_perms(cap, PERM_GLOBAL);
}