📄 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -