#include #include #include #include #include typedef void ir_func_t(void *); struct intr_request { struct intr_request *ir_next; ir_func_t *ir_func; void *ir_arg; u_long ir_vec; }; struct intr_vector { void *iv_func; void *iv_arg; u_long iv_pri; u_long iv_pad; }; struct pcpu { struct intr_request *pc_irhead; struct intr_request **pc_irtail; struct intr_request *pc_irfree; }; register struct pcpu *pcpu __asm("%g7"); struct pcpu __pcpu; struct intr_request irfree[1]; struct intr_vector intr_vectors[32]; sigset_t sigmask; extern void intr_dequeue(void); extern void intr_enqueue(u_long vec); extern void panic(char *s); void irhand(void *); int main(void) { struct intr_request *ir; struct intr_vector *iv; struct sigaction osa; struct sigaction sa; int i; iv = &intr_vectors[SIGINT]; iv->iv_func = irhand; iv->iv_arg = 0x0; iv->iv_pri = SIGUSR1; sigemptyset(&sigmask); sigaddset(&sigmask, SIGINT); bzero(&sa, sizeof(sa)); bzero(&osa, sizeof(osa)); sa.sa_sigaction = (void *)intr_dequeue; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); sigaction(SIGUSR1, &sa, &osa); bzero(&sa, sizeof(sa)); bzero(&osa, sizeof(osa)); sa.sa_sigaction = (void *)intr_enqueue; sa.sa_flags = SA_SIGINFO; sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGUSR1); sigaction(SIGINT, &sa, &osa); pcpu = &__pcpu; pcpu->pc_irtail = &pcpu->pc_irhead; for (i = 0; i < sizeof irfree / sizeof *irfree; i++) { ir = &irfree[i]; ir->ir_next = pcpu->pc_irfree; pcpu->pc_irfree = ir; } for (;;) ; } void irhand(void *arg) { printf("irhand: arg=%p\n", arg); } void panic(char *s) { errx(1, "%s", s); }