Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 44 additions & 16 deletions clang/lib/Basic/Targets/RISCV.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,21 +223,44 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
}

// Macros for use with the set and get permissions builtins.
Builder.defineMacro("__CHERI_CAP_PERMISSION_GLOBAL__", Twine(1<<0));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_EXECUTE__",
Twine(1<<1));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD__", Twine(1<<2));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE__", Twine(1<<3));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD_CAPABILITY__",
Twine(1<<4));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_CAPABILITY__",
Twine(1<<5));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__",
Twine(1<<6));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_SEAL__", Twine(1<<7));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_INVOKE__", Twine(1<<8));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_UNSEAL__", Twine(1<<9));
Builder.defineMacro("__CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__", Twine(1<<10));
if (ISAInfo->hasExtension("y")) {
Builder.defineMacro("__CHERI_CAP_PERMISSION_WRITE__", Twine(1 << 0));
Builder.defineMacro("__CHERI_CAP_PERMISSION_LOAD_MUTABLE__",
Twine(1 << 1));
Builder.defineMacro("__CHERI_CAP_PERMISSION_LOAD_GLOBAL__",
Twine(1 << 2));
Builder.defineMacro("__CHERI_CAP_PERMISSION_STORE_LOCAL__",
Twine(1 << 3));
Builder.defineMacro("__CHERI_CAP_PERMISSION_CAPABILITY_GLOBAL__",
Twine(1 << 4));
Builder.defineMacro("__CHERI_CAP_PERMISSION_CAPABILITY__", Twine(1 << 5));
Builder.defineMacro("__CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__",
Twine(1 << 16));
Builder.defineMacro("__CHERI_CAP_PERMISSION_EXECUTE__", Twine(1 << 17));
Builder.defineMacro("__CHERI_CAP_PERMISSION_READ__", Twine(1 << 18));
} else {
Builder.defineMacro("__CHERI_CAP_PERMISSION_GLOBAL__", Twine(1 << 0));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_EXECUTE__",
Twine(1 << 1));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD__",
Twine(1 << 2));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE__",
Twine(1 << 3));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_LOAD_CAPABILITY__",
Twine(1 << 4));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_CAPABILITY__",
Twine(1 << 5));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_STORE_LOCAL__",
Twine(1 << 6));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_SEAL__",
Twine(1 << 7));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_INVOKE__",
Twine(1 << 8));
Builder.defineMacro("__CHERI_CAP_PERMISSION_PERMIT_UNSEAL__",
Twine(1 << 9));
Builder.defineMacro("__CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__",
Twine(1 << 10));
}

Builder.defineMacro("__riscv_clen", Twine(getCHERICapabilityWidth()));
// TODO: _MIPS_CAP_ALIGN_MASK equivalent?
Expand All @@ -249,6 +272,11 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
// Defines to allow software to detect a ISAv9 compiler vs. an older v8 one.
Builder.defineMacro("__riscv_xcheri_tag_clear");
Builder.defineMacro("__riscv_xcheri_no_relocation");
// Define macros for compatibility.
if (ISAInfo->hasExtension("y"))
Builder.defineMacro("__riscv_zcheripurecap", "9000");
if (ISAInfo->hasExtension("zyhybrid"))
Builder.defineMacro("__riscv_zcherihybrid", "9000");
}

if (ISAInfo->hasExtension("zve32x")) {
Expand Down Expand Up @@ -372,7 +400,7 @@ bool RISCVTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
} else {
ISAInfo = std::move(*ParseResult);
}
if (ISAInfo->hasExtension("xcheri")) {
if (ISAInfo->hasExtension("xcheri") || ISAInfo->hasExtension("y")) {
HasCheri = true;
CapSize = XLen * 2;
}
Expand Down
5 changes: 3 additions & 2 deletions clang/lib/Driver/ToolChains/Arch/RISCV.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ void riscv::getRISCVTargetFeatures(const Driver &D, const llvm::Triple &Triple,
if (Args.hasArg(options::OPT_ffixed_x31))
Features.push_back("+reserve-x31");

bool IsCheri = ISAInfo->hasExtension("xcheri");
bool IsCheri = ISAInfo->hasExtension("xcheri") || ISAInfo->hasExtension("y");

// -mrelax is default, unless -mno-relax is specified.
// For CHERI it's currently not supported, so forbid enabling it and disable
Expand Down Expand Up @@ -208,7 +208,8 @@ void riscv::getRISCVTargetFeatures(const Driver &D, const llvm::Triple &Triple,
if (!IsCheri) {
D.Diag(diag::err_riscv_invalid_abi)
<< A->getValue()
<< "pure capability ABI requires xcheri extension to be specified";
<< "pure capability ABI requires xcheri or y extension to be "
"specified";
return;
}
Features.push_back("+cap-mode");
Expand Down
31 changes: 21 additions & 10 deletions clang/lib/Headers/cheri_init_globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,12 +50,26 @@ struct capreloc {
};
static const __SIZE_TYPE__ function_reloc_flag = (__SIZE_TYPE__)1
<< (__SIZE_WIDTH__ - 1);
static const __SIZE_TYPE__ constant_reloc_flag = (__SIZE_TYPE__)1
<< (__SIZE_WIDTH__ - 2);
static const __SIZE_TYPE__ indirect_reloc_flag = (__SIZE_TYPE__)1
<< (__SIZE_WIDTH__ - 3);
static const __SIZE_TYPE__ code_reloc_flag = (__SIZE_TYPE__)1
<< (__SIZE_WIDTH__ - 4);
#if defined(__riscv_y)
static const __SIZE_TYPE__ function_pointer_permissions_mask =
~(__SIZE_TYPE__)(__CHERI_CAP_PERMISSION_WRITE__);
static const __SIZE_TYPE__ constant_pointer_permissions_mask =
~(__SIZE_TYPE__)(__CHERI_CAP_PERMISSION_WRITE__ |
__CHERI_CAP_PERMISSION_STORE_LOCAL__ |
__CHERI_CAP_PERMISSION_EXECUTE__);
static const __SIZE_TYPE__ global_pointer_permissions_mask =
~(__SIZE_TYPE__)(__CHERI_CAP_PERMISSION_EXECUTE__);
#else
static const __SIZE_TYPE__ function_pointer_permissions_mask =
~(__SIZE_TYPE__)(__CHERI_CAP_PERMISSION_PERMIT_SEAL__ |
__CHERI_CAP_PERMISSION_PERMIT_STORE_CAPABILITY__ |
__CHERI_CAP_PERMISSION_PERMIT_STORE__);
static const __SIZE_TYPE__ constant_reloc_flag = (__SIZE_TYPE__)1
<< (__SIZE_WIDTH__ - 2);
static const __SIZE_TYPE__ constant_pointer_permissions_mask =
~(__SIZE_TYPE__)(__CHERI_CAP_PERMISSION_PERMIT_SEAL__ |
__CHERI_CAP_PERMISSION_PERMIT_STORE_CAPABILITY__ |
Expand All @@ -65,16 +79,13 @@ static const __SIZE_TYPE__ constant_pointer_permissions_mask =
static const __SIZE_TYPE__ global_pointer_permissions_mask =
~(__SIZE_TYPE__)(__CHERI_CAP_PERMISSION_PERMIT_SEAL__ |
__CHERI_CAP_PERMISSION_PERMIT_EXECUTE__);
static const __SIZE_TYPE__ indirect_reloc_flag = (__SIZE_TYPE__)1
<< (__SIZE_WIDTH__ - 3);
static const __SIZE_TYPE__ code_reloc_flag = (__SIZE_TYPE__)1
<< (__SIZE_WIDTH__ - 4);
#endif

__attribute__((weak)) extern struct capreloc __start___cap_relocs[];
__attribute__((weak)) extern struct capreloc __stop___cap_relocs[];
__attribute__((__weak__)) extern struct capreloc __start___cap_relocs;
__attribute__((__weak__)) extern struct capreloc __stop___cap_relocs;

__attribute__((weak)) extern void *__capability __cap_table_start[];
__attribute__((weak)) extern void *__capability __cap_table_end[];
__attribute__((__weak__)) extern void *__capability __cap_table_start;
__attribute__((__weak__)) extern void *__capability __cap_table_end;

/*
* Sandbox data segments are relocated by moving DDC, since they're compiled as
Expand Down
12 changes: 12 additions & 0 deletions clang/lib/Headers/cheriintrin.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,17 @@ typedef long cheri_otype_t;

/* Capability permissions: */
typedef enum __attribute__((flag_enum, enum_extensibility(open))) {
#if defined(__riscv_y)
CHERI_PERM_CAP = __CHERI_CAP_PERMISSION_CAPABILITY__,
CHERI_PERM_WRITE = __CHERI_CAP_PERMISSION_WRITE__,
CHERI_PERM_READ = __CHERI_CAP_PERMISSION_READ__,
CHERI_PERM_EXECUTE = __CHERI_CAP_PERMISSION_EXECUTE__,
CHERI_PERM_SYSTEM_REGS = __CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__,
CHERI_PERM_LOAD_MUTABLE = __CHERI_CAP_PERMISSION_LOAD_MUTABLE__,
CHERI_PERM_LOAD_GLOBAL = __CHERI_CAP_PERMISSION_LOAD_GLOBAL__,
CHERI_PERM_STORE_LOCAL = __CHERI_CAP_PERMISSION_STORE_LOCAL__,
CHERI_PERM_CAPABILITY_GLOBAL = __CHERI_CAP_PERMISSION_CAPABILITY_GLOBAL__,
#else
CHERI_PERM_GLOBAL = __CHERI_CAP_PERMISSION_GLOBAL__,
CHERI_PERM_EXECUTE = __CHERI_CAP_PERMISSION_PERMIT_EXECUTE__,
CHERI_PERM_LOAD = __CHERI_CAP_PERMISSION_PERMIT_LOAD__,
Expand All @@ -81,6 +92,7 @@ typedef enum __attribute__((flag_enum, enum_extensibility(open))) {
CHERI_PERM_INVOKE = __CHERI_CAP_PERMISSION_PERMIT_INVOKE__,
CHERI_PERM_UNSEAL = __CHERI_CAP_PERMISSION_PERMIT_UNSEAL__,
CHERI_PERM_SYSTEM_REGS = __CHERI_CAP_PERMISSION_ACCESS_SYSTEM_REGISTERS__,
#endif
/* TODO: architecture-dependent permissions */
} cheri_perms_t;
#define cheri_perms_get(x) ((cheri_perms_t)(__builtin_cheri_perms_get(x)))
Expand Down
Loading