www.pudn.com > LFYOS.zip > system_call.c


#include "kernel.h" 
 
#define FLAG_1	((current.env->system_call_arg1>=0)?TRUE:FALSE) 
#define ABS_1	((current.env->system_call_arg1>=0)		\ 
		?(current.env->system_call_arg1)		\ 
		:(-(current.env->system_call_arg1))) 
 
int system_call_routine(void) 
{ 
	switch(current.env->system_call){ 
	default: 
		current.env->system_call=-1; 
		time_share(current.thread_id); 
		return 0; 
	case 0: 
		current.env->system_call=thread_migrate( 
			current.thread_id, 
			ABS_1,TRUE,FALSE,FLAG_1); 
		break; 
	case 1: 
		current.env->system_call=thread_migrate( 
			current.thread_id, 
			ABS_1,FALSE,FALSE,FLAG_1); 
		break; 
	case 2: 
		{ 
		struct thread_physical_block pb; 
		pb.stack_memory_id=current.env->system_call_arg2; 
		pb.stack_block_id=current.env->system_call_arg3; 
		pb.memory_id	=current.env->system_call_arg4; 
		pb.block_id	=current.env->system_call_arg5; 
		current.env->system_call 
		=thread_migrate_with_physical_block( 
			current.thread_id,ABS_1,FLAG_1,&pb, 
			&(current.par->capability.capability_1)); 
		break; 
		} 
	case 3: 
		current.env->system_call=thread_return( 
			current.thread_id, 
			current.env->system_call_arg1); 
		break; 
	case 4:{ 
		int sem_id,return_value; 
		if(current.env->system_call_arg1!=0){ 
			sem_id=current.env->system_call_arg1; 
			if(sem_id>0) 
				return_value=0; 
			else{ 
				sem_id=0-sem_id; 
				return_value=reset_semaphore_value( 
				sem_id, 
				&(current.par->capability. 
					capability_1)); 
			} 
			if(return_value<0) 
				current.env->system_call_arg1 
				=return_value; 
			else 
				current.env->system_call_arg1 
				=system_call_v( 
				sem_id,&(current.env->system_call_arg2), 
				&(current.par->capability. 
					capability_1)); 
		}; 
 
		if(current.env->system_call_arg3!=0){ 
			sem_id=current.env->system_call_arg3; 
			if(sem_id>0) 
				return_value=0; 
			else{ 
				sem_id=0-sem_id; 
				return_value=reset_semaphore_value( 
				sem_id,&(current.par->capability. 
					capability_2)); 
			} 
			if(return_value<0) 
				current.env->system_call_arg3 
					=return_value; 
			else 
				current.env->system_call_arg3 
				=system_call_p( 
				current.thread_id,sem_id, 
				current.env->system_call_arg4, 
				current.env->system_call_arg5, 
				&(current.par->capability. 
					capability_2)); 
		}; 
 
		if((current.env->system_call_arg1<0) 
		||(current.env->system_call_arg3<0)) 
			current.env->system_call=(-1); 
		} 
		break; 
	case 5: 
		current.env->system_call 
			=set_semaphore_time_and_p_operation( 
			current.thread_id, 
			current.env->system_call_arg1, 
			current.env->system_call_arg2, 
			current.env->system_call_arg3, 
			current.env->system_call_arg4, 
			&(current.par->set_semaphore_time.first_time), 
			&(current.par->set_semaphore_time.step_time), 
			&(current.par->set_semaphore_time. 
				semaphore_capability)); 
		break; 
	case 6: 
		current.env->system_call=create_thread( 
			&(current.t->file[0]), 
			current.env->system_call_arg1, 
			current.rt->current_process, 
			current.t->priority, 
			current.env, 
			&(current.par->capability.capability_1)); 
		break; 
	case 10: 
		current.env->system_call=allocate_resource( 
			&(current.par->process_attribute.process), 
			current.env->system_call_arg1, 
			&(current.par->process_attribute.capability)); 
		break; 
	case 11: 
		current.env->system_call=query_resource( 
			&(current.par->process_attribute.process), 
			current.env->system_call_arg1); 
		break; 
	case 12: 
		current.env->system_call=allocate_semaphore( 
			current.env->system_call_arg1, 
			current.env->system_call_arg2, 
			&(current.par->capability.capability_1), 
			&(current.par->capability.capability_2)); 
		break; 
	case 13: 
		current.env->system_call=release_semaphore(TRUE, 
			current.env->system_call_arg1, 
			&(current.par->capability.capability_1)); 
		break; 
	case 14: 
		current.env->system_call=set_thread_attribute( 
			current.env->system_call_arg1, 
			&(current.par->thread_attribute.exception), 
			&(current.par->thread_attribute.priority), 
			&(current.par->thread_attribute. 
				mandatory_exit_number), 
			&(current.par->thread_attribute. 
				current_process_capability)); 
		break; 
	case 15: 
		if(current.env->system_call_arg1>=0) 
			current.env->system_call=get_thread_attribute( 
				current.env->system_call_arg1, 
				&(current.par->thread_attribute. 
					exception), 
				&(current.par->thread_attribute. 
					priority), 
				&(current.par->thread_attribute. 
					return_stack_top), 
				&(current.par->thread_attribute. 
					process), 
				&(current.par->thread_attribute. 
					current_process), 
				&(current.par->thread_attribute. 
					current_process_capability)); 
		else{ 
			current.env->system_call=current.t->semaphore; 
			current.env->system_call_arg1 
				=current.t->process; 
			current.env->system_call_arg2 
				=current.rt->current_process; 
			current.env->system_call_arg3 
				=current.t->return_stack_top; 
			current.env->system_call_arg4 
				=current.t->priority; 
			current.env->system_call_arg5 
				=current.rt->exception.flag; 
		} 
		break; 
	case 20: 
		if((current.env->system_call=get_memory_amount( 
				current.env->system_call_arg1))>=0) 
			current.env->system_call_arg1 
				=(int)get_block_base( 
				current.env->system_call_arg1,0); 
		break; 
	case 21: 
		current.env->system_call=set_process_file_capability( 
			current.rt->current_process, 
			current.env->system_call_arg1, 
			current.env->system_call_arg2, 
			current.env->system_call_arg3, 
			&(current.par->capability.capability_1), 
			current.env->system_call_arg4, 
			current.env->system_call_arg5); 
		if(current.env->system_call>=0) 
			current.cpu_info->last.thread_id=(-1); 
		break; 
	case 22: 
		current.env->system_call=set_thread_file_capability( 
			current.thread_id, 
			current.env->system_call_arg1, 
			current.env->system_call_arg2, 
			current.env->system_call_arg3, 
			&(current.par->capability.capability_1), 
			current.env->system_call_arg4, 
			current.env->system_call_arg5); 
		if(current.env->system_call>=0) 
			current.cpu_info->last.thread_id=(-1); 
		break; 
	case 23: 
		current.env->system_call=can_access_file( 
			current.thread_id, 
			current.rt->current_process, 
			current.env->system_call_arg1, 
			&(current.env->system_call_arg2), 
			&(current.env->system_call_arg3), 
			&(current.env->system_call_arg4)); 
		break; 
	} 
	return 1; 
}