/* * Copyright (C) NAKAMURA Minoru */ #include #include #include #include #include #include #ifdef __ia64__ struct fdesc { long code; long gp; }; # define get_fdesc(fdesc,func) (fdesc = *(struct fdesc *) &(func)) # define get_funcp(fdesc) ((template_t) &(fdesc)) # define get_gp(fdesc) ((fdesc).gp) #endif typedef void (*functype)(int); void print_message(int a) { printf("invoke print_message : arg = %d\n", a); } void cause_null_exception(int a) { *(int*)0 = 0; } void generated(functype f, int a) { f(a); } void (*funcp)(functype f, int a); void test(void) { int i; long pagesize = sysconf(_SC_PAGESIZE); char* p = (char*)mmap(0, pagesize, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); assert(p != MAP_FAILED); #if defined(__ia64__) const int generated_size = 0xa0; // IA-64 は関数ポインタが直接命令アドレスを指すのではなく、 // struct fdesc のような関数ディスクリプタをさしているため // 少し工夫が必要。 memcpy(p, ((long*)generated)[0], 0xa0); // コードをフラッシュしないとダメ for (i=0 ; i