예제 #1
0
파일: syscall.c 프로젝트: rasco/armnet
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;
}
예제 #3
0
파일: interrupt.c 프로젝트: Nakrez/zOS
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;
}
예제 #4
0
파일: clock.c 프로젝트: sgh/aos
void enable_clock(void) {
	interrupt_unmask(TIMER0_IRQ);
}