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)
This is a bug in GCC. I think clang's codegen is correct. So either you can try to use clang or you can temporarily work around this using inline asm until GCC's codegen is fixed.
Thanks a lot for reporting this. Hope that helps.
Hi Alex, thanks. Let me know if you want me to raise a ticket (somewhere) to record the issue.