106bf3b15SRichard Henderson #include <assert.h> 206bf3b15SRichard Henderson #include <sys/prctl.h> 3b6407281SAlex Bennée #include <stdio.h> 406bf3b15SRichard Henderson 506bf3b15SRichard Henderson #ifndef PR_PAC_RESET_KEYS 606bf3b15SRichard Henderson #define PR_PAC_RESET_KEYS 54 706bf3b15SRichard Henderson #define PR_PAC_APDAKEY (1 << 2) 806bf3b15SRichard Henderson #endif 906bf3b15SRichard Henderson 10b6407281SAlex Bennée #define TESTS 1000 11b6407281SAlex Bennée main()1206bf3b15SRichard Hendersonint main() 1306bf3b15SRichard Henderson { 14b6407281SAlex Bennée int x, i, count = 0; 1506bf3b15SRichard Henderson void *p0 = &x, *p1, *p2; 16b6407281SAlex Bennée float perc; 1706bf3b15SRichard Henderson 18b6407281SAlex Bennée for (i = 0; i < TESTS; i++) { 1906bf3b15SRichard Henderson asm volatile("pacdza %0" : "=r"(p1) : "0"(p0)); 2006bf3b15SRichard Henderson prctl(PR_PAC_RESET_KEYS, PR_PAC_APDAKEY, 0, 0, 0); 2106bf3b15SRichard Henderson asm volatile("pacdza %0" : "=r"(p2) : "0"(p0)); 2206bf3b15SRichard Henderson 23b6407281SAlex Bennée if (p1 != p0) { 24b6407281SAlex Bennée count++; 25b6407281SAlex Bennée } 26b6407281SAlex Bennée if (p1 != p2) { 27b6407281SAlex Bennée count++; 28b6407281SAlex Bennée } 29b6407281SAlex Bennée } 30b6407281SAlex Bennée 31b6407281SAlex Bennée perc = (float) count / (float) (TESTS * 2); 32*e2d30df9SRichard Henderson printf("Ptr Check: %0.2f%%\n", perc * 100.0); 33b6407281SAlex Bennée assert(perc > 0.95); 3406bf3b15SRichard Henderson return 0; 3506bf3b15SRichard Henderson } 36