#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <errno.h>
#include <pthread.h>
int main(void) {
    void *p = mmap(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON, -1, 0);
    printf("rwx anon: %p errno=%d %s\n", p, errno, strerror(errno));
    if (p != MAP_FAILED) {
        /* arm64: mov w0, #42 ; ret */
        unsigned int code[] = {0x52800540, 0xd65f03c0};
        memcpy(p, code, sizeof code);
        __builtin___clear_cache(p, (char*)p+sizeof code);
        int (*f)(void) = (int(*)(void))p;
        printf("call rwx -> %d\n", f());
    }
    void *j = mmap(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANON|MAP_JIT, -1, 0);
    printf("rwx MAP_JIT: %p errno=%d %s\n", j, errno, strerror(errno));
    return 0;
}
