/* $ gdb qemu-e2k (gdb) start timer_test 100000 The program being debugged has been started already. Start it from the beginning? (y or n) y Temporary breakpoint 3 at 0x555555bbae5d: file ../linux-user/main.c, line 632. Starting program: /home/andreiw/src/e2k/qemu-e2k/build/qemu-e2k timer_test 100000 [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". [New Thread 0x7ffff34ff700 (LWP 1275)] Thread 1 "qemu-e2k" hit Temporary breakpoint 3, main (argc=3, argv=0x7fffffffe4d8, envp=0x7fffffffe4f8) at ../linux-user/main.c:632 632 { (gdb) c Continuing. Establishing handler for signal 14 +++++-+++--+--+---+----+-----+----+-----+----+----+----+-----+----+-----+-----+----+---+-----+-----+----+-----+----+-----+---+----+-----+-----+----+-----+----+---+-----+----+-----+----+-----+----+----+----+/home/andreiw/src/e2k/qemu-e2k/include/qemu/bswap.h:301:5: runtime error: load of null pointer of type 'unsigned int' Thread 1 "qemu-e2k" received signal SIGSEGV, Segmentation fault. 0x0000555555b776e9 in ldl_he_p (ptr=0x0) at /home/andreiw/src/e2k/qemu-e2k/include/qemu/bswap.h:301 301 __builtin_memcpy(&r, ptr, sizeof(r)); (gdb) bt #0 0x0000555555b776e9 in ldl_he_p (ptr=0x0) at /home/andreiw/src/e2k/qemu-e2k/include/qemu/bswap.h:301 #1 0x0000555555b77adb in ldl_le_p (ptr=0x0) at /home/andreiw/src/e2k/qemu-e2k/include/qemu/bswap.h:334 #2 0x0000555555b78e27 in cpu_ldl_code (env=0x62e000008720, ptr=0) at ../accel/tcg/user-exec.c:453 #3 0x0000555555b76ed5 in translator_ldl_swap (env=0x62e000008720, dcbase=0x7fffffffcdd0, pc=0, do_swap=false) at ../accel/tcg/translator.c:178 #4 0x0000555555a10974 in translator_ldl (env=0x62e000008720, dcbase=0x7fffffffcdd0, pc=0) at /home/andreiw/src/e2k/qemu-e2k/include/exec/translator.h:186 #5 0x0000555555a31e4a in unpack_bundle (env=0x62e000008720, ctx=0x7fffffffcdd0) at ../target/e2k/translate.c:712 #6 0x0000555555a75800 in do_decode (ctx=0x7fffffffcdd0, cs=0x62e000000400) at ../target/e2k/translate.c:7728 #7 0x0000555555a78305 in e2k_tr_translate_insn (db=0x7fffffffcdd0, cs=0x62e000000400) at ../target/e2k/translate.c:8150 #8 0x0000555555b7619e in translator_loop (ops=0x555555ea1420 , db=0x7fffffffcdd0, cpu=0x62e000000400, tb=0x7fffeae12ac0 , max_insns=512) at ../accel/tcg/translator.c:103 #9 0x0000555555a7909d in gen_intermediate_code (cs=0x62e000000400, tb=0x7fffeae12ac0 , max_insns=512) at ../target/e2k/translate.c:8234 #10 0x0000555555b70f27 in tb_gen_code (cpu=0x62e000000400, pc=0, cs_base=0, flags=1, cflags=0) at ../accel/tcg/translate-all.c:1447 #11 0x0000555555b5b866 in cpu_exec (cpu=0x62e000000400) at ../accel/tcg/cpu-exec.c:982 #12 0x00005555559ccbe8 in cpu_loop (env=0x62e000008720) at ../linux-user/e2k/cpu_loop.c:70 #13 0x0000555555bbc5b1 in main (argc=3, argv=0x7fffffffe4d8, envp=0x7fffffffe4f8) at ../linux-user/main.c:909 (gdb) */ #include #include #include #include #include #include #define CLOCKID CLOCK_MONOTONIC #define SIG SIGALRM #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \ } while (0) sigset_t sigset; timer_t timerid; struct itimerspec its; static void handler(int sig, siginfo_t *si, void *uc) { write (STDIN_FILENO, "+", 1); fsync(STDIN_FILENO); if (timer_settime(timerid, 0, &its, NULL) == -1) { errExit("timer_settime"); } } static void loop_fn(void) { write (STDIN_FILENO, "-", 1); fsync(STDIN_FILENO); } int main(int argc, char *argv[]) { struct sigevent sev; long long freq_nanosecs; sigset_t mask; struct sigaction sa; sigemptyset (&sigset); sigaddset (&sigset, SIGALRM); if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(EXIT_FAILURE); } /* Establish handler for timer signal. */ printf("Establishing handler for signal %d\n", SIG); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = handler; sigemptyset(&sa.sa_mask); if (sigaction(SIG, &sa, NULL) == -1) { errExit("sigaction"); } /* Create the timer. */ sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIG; sev.sigev_value.sival_ptr = &timerid; if (timer_create(CLOCKID, &sev, &timerid) == -1) { errExit("timer_create"); } /* Start the timer. */ freq_nanosecs = atoll(argv[1]); its.it_value.tv_sec = freq_nanosecs / 1000000000; its.it_value.tv_nsec = freq_nanosecs % 1000000000; its.it_interval.tv_sec = 0; its.it_interval.tv_nsec = 0; if (timer_settime(timerid, 0, &its, NULL) == -1) { errExit("timer_settime"); } while (1) { loop_fn(); } exit(EXIT_SUCCESS); }