// CFLAGS = -march=armv8.5-a+memtag #include #include #include #include #include #define TAG_SHIFT 56 #ifndef PROT_MTE #define PROT_MTE 0x20 #endif #ifndef PR_SET_TAGGED_ADDR_CTRL #define PR_SET_TAGGED_ADDR_CTRL 55 #define PR_GET_TAGGED_ADDR_CTRL 56 #define PR_TAGGED_ADDR_ENABLE 1UL #endif #ifndef PR_MTE_TCF_SYNC #define PR_MTE_TCF_SYNC 2UL #define PR_MTE_TAG_SHIFT 3 #endif int main() { if (prctl(PR_SET_TAGGED_ADDR_CTRL, PR_TAGGED_ADDR_ENABLE|PR_MTE_TCF_SYNC|(0xffff << PR_MTE_TAG_SHIFT), 0, 0, 0)) abort(); unsigned long *a = mmap(0, 1<<12, PROT_READ|PROT_WRITE|PROT_MTE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); if (a == MAP_FAILED) abort(); // tag ptr a a = (void*)((unsigned long)a|(1UL<