I have been porting the Morello compartments demo to Debian linux, cross-compiling with g++ and link with LLVM lld.
I have noticed this attempts to use cheri_pcc_get() to build a capability with same bounds/permissions/tag/flag as the PCC, however in Linux hybrid-cap for me this will only read the address part.
Is this the expected behaviour of cheri_pcc_get() in hybrid?This built-in is being compiled to ADRP <reg> by the gcc compiler. According to the Morello architecture reference, in hybrid then ADRP will only read the offset or value which would seem to make sense. A quick check with clang suggests the builtin is being compiled in the same way.So, this would mean that one of the following is true:
What say you?
ThanksPete(P.S: The port was made to work by using cheri_ddc_get() since that also covers the whole memory range, although that seems a bit of a cludge)
There aren't many ways to read the full PCC from hybrid (or rather A64). For me, clang compiles cheri_pcc_get() to something like this:
ADR x8, #0 CVTP c0, x8
Registers will vary, of course. I've not updated my clang for a month or so (18d3bd9b) and I've not tried g++.
My first guess would be that the toolchains are wrong, but it's weird for them _both_ to be wrong. Have you reproduced this in a standalone example, to rule out any complication from the compartments demo build system or similar?
No Jacob you are right, Clang does it properly... apologies, the problem was that to check what clang produced I simply compiled the C code and then used objdump to view the assembly. Unfortunately, as objdump not updated for Morello, the CVTP instruction was not interpreted and so from a quick look the instruction was ADR x8, <value> which I took to be the same as gcc! Did not investigate it further at that time, sorry again for confusion!