int syscall_handler(int num, struct syscall_arguments *args) { interrupt_unmask(); switch (num) { case ADDPROCESS: interrupt_mask(); process_add((void (*)())args->arg1); interrupt_unmask(); break; case YIELD: interrupt_sleepinsyscall(); break; case UDPSEND: return udp_output(args->arg1, (struct sockaddr*)args->arg2, (char *)args->arg3, args->arg4); break; case UDPRECV: return udp_recvfrom(args->arg1, (struct sockaddr*)args->arg2, (char *)args->arg3, args->arg4); break; case UDPSOCKET: return udp_socket(); break; case UDPBIND: return udp_bind(args->arg1, (struct sockaddr*)args->arg2); break; case UDPCLOSE: return udp_close(args->arg1); break; case TCPCONNECT: return tcp_connect(args->arg1, (struct sockaddr*)args->arg2); break; case TCPSEND: return tcp_send(args->arg1, (char *)args->arg2, args->arg3); break; case TCPRECV: return tcp_recv(args->arg1, (char *)args->arg2, args->arg3); break; case TCPSOCKET: return tcp_socket(); break; case TCPBIND: return tcp_bind(args->arg1, (struct sockaddr*)args->arg2); break; case TCPCLOSE: return tcp_close(args->arg1); break; case TCPLISTEN: return tcp_listen(args->arg1); break; } return 0; }
int aipc_ISR( u32_t irq , void *data ) { int n = MAX_HANDLE_CNT; u32_t fid; interrupt_mask( irq ); deassert( AIPC_CPU_INT_IP ); while(1) { if( !aipc_int_cpu_hiq_empty() ){ //handle elements in hi queue for( ; n>0 ; n-- ) { if( !aipc_int_cpu_hiq_empty() ){ //For hi queue //Get element from hi queue if( OK == aipc_int_cpu_hiq_dequeue( &fid )) ;//aipc_exec_callback( fid , data ); //Run callback else break; } } } if( !aipc_int_cpu_lowq_empty() ){ //handle elements in low queue for( ; n>0 ; n-- ) { if( !aipc_int_cpu_lowq_empty() ){ //For low queue //Get element from low queue if( OK == aipc_int_cpu_lowq_dequeue( &fid ) ) ;//aipc_exec_callback( fid , data ); //Run callback else break; } } } if( read_register( AIPC_CPU_INT_IP ) ) deassert( AIPC_CPU_INT_IP ); else break; } interrupt_unmask( irq ); return IRQ_HANDLED; }
int interrupt_register(int irq, int type, void (*callback)(struct irq_regs *)) { if (type == INTERRUPT_NONE) return -EINVAL; if (irq < 0 || irq > MAX_IRQ_NUMBER) return -EINVAL; if (interrupt_entries[irq].type != INTERRUPT_NONE) return -EEXIST; interrupt_entries[irq].type = type; interrupt_entries[irq].callback = callback; interrupt_unmask(irq); return 0; }
void enable_clock(void) { interrupt_unmask(TIMER0_IRQ); }