xref: /llvm-project/lldb/test/API/linux/aarch64/non_address_bit_memory_access/main.c (revision 00a12585933ef63ff1204bf5cd265f0071d04642)
1 #include <linux/mman.h>
2 #include <sys/mman.h>
3 #include <unistd.h>
4 
main(int argc,char const * argv[])5 int main(int argc, char const *argv[]) {
6   size_t page_size = sysconf(_SC_PAGESIZE);
7   // Note that we allocate memory here because if we used
8   // stack or globals lldb might read it in the course of
9   // running to the breakpoint. Before the test can look
10   // for those reads.
11   char *buf = mmap(0, page_size, PROT_READ | PROT_WRITE,
12                    MAP_ANONYMOUS | MAP_SHARED, -1, 0);
13   if (buf == MAP_FAILED)
14     return 1;
15 
16   // Some known values to go in the corefile, since we cannot
17   // write to corefile memory.
18   buf[0] = 'L';
19   buf[1] = 'L';
20   buf[2] = 'D';
21   buf[3] = 'B';
22 
23 #define sign_ptr(ptr) __asm__ __volatile__("pacdza %0" : "=r"(ptr) : "r"(ptr))
24 
25   // Set top byte to something.
26   char *buf_with_non_address = (char *)((size_t)buf | (size_t)0xff << 56);
27   sign_ptr(buf_with_non_address);
28   // Address is now:
29   // <8 bit top byte tag><pointer signature><virtual address>
30 
31   // Uncomment this line to crash and generate a corefile.
32   // Prints so we know what fixed address to look for in testing.
33   // printf("buf: %p\n", buf);
34   // printf("buf_with_non_address: %p\n", buf_with_non_address);
35   // *(char*)0 = 0;
36 
37   return 0; // Set break point at this line.
38 }
39