00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include<linux/linkage.h>
00012 #include<linux/sched.h>
00013 #include<linux/vmalloc.h>
00014 #include<acbdef.h>
00015 #include<pridef.h>
00016 #include<ipldef.h>
00017 #include<ipl.h>
00018 #include<internals.h>
00019 #include<system_data_cells.h>
00020 #include<cwpsdef.h>
00021 #include<cdrpdef.h>
00022 #include<rddef.h>
00023 #include<ssdef.h>
00024 #include <linux/slab.h>
00025 #include <exe_routines.h>
00026 #include <misc_routines.h>
00027 #include <sch_routines.h>
00028 #include <scs_routines.h>
00029
00030 asmlinkage int exe_exit(unsigned int code);
00031
00032
00033
00034
00035
00036 asmlinkage int exe_forcex(unsigned int *pidadr, void *prcnam, unsigned int code){
00037 struct _pcb *p;
00038 struct _acb *a;
00039 struct _pcb * retpcb;
00040 unsigned long ipid, epid;
00041 int sts;
00042 #if 0
00043 if (pidadr && ((*pidadr)&0x80000000))
00044 return cwps_forcex(pidadr,prcnam,code);
00045 #endif
00046
00047 sts=exe_nampid(current,pidadr,prcnam,&retpcb,&ipid,&epid);
00048 p=retpcb;
00049
00050 if (sts==SS__REMOTE_PROC)
00051 return cwps_forcex(pidadr,prcnam,code);
00052
00053 vmsunlock(&SPIN_SCHED,0);
00054
00055 if (!p) return 0;
00056
00057 p->pcb_l_sts|=PCB$M_FORCPEN;
00058 a=kmalloc(sizeof(struct _acb),GFP_KERNEL);
00059 memset(a,0,sizeof(struct _acb));
00060 a->acb_l_pid=p->pcb$l_pid;
00061 a->acb_l_ast=&exe$exit;
00062 a->acb_l_astprm=code;
00063
00064 return sch_qast(p->pcb$l_pid,PRI$_RESAVL,a);
00065
00066
00067 }
00068
00069 forcex_msg(){}
00070 forcex_dg(){}
00071 forcex_err(){}
00072
00073 int cwps_forcex(unsigned int *pidadr, void *prcnam, unsigned int code){
00074 struct _cdrp * c=vmalloc(sizeof(struct _cdrp));
00075 struct _scs_rd *r;
00076 struct _cdt * cdt;
00077 struct _cwpssrv * cwpssrv=vmalloc(sizeof(struct _cwpssrv)+100);
00078 struct _cwpsfex * cwpsfex=((unsigned long)cwpssrv)+sizeof(struct _cwpssrv);
00079 cwpssrv->cwpssrv_b_subtype=CWPSSRV$K_FORCEX;
00080 if (pidadr) cwpssrv->cwpssrv_l_sought_epid=*pidadr&0x7fffffff;
00081 cwpsfex->cwpsfex_l_code=code;
00082 memset(c,0,sizeof(struct _cdrp));
00083 c->cdrp_l_rwcptr=0;
00084 c->cdrp_l_rspid=scs_std$alloc_rspid(0,0,c,0);
00085 scs_std_find_rdte( c->cdrp$l_rspid, &r);
00086 r->rd_l_cdrp=c;
00087
00088 cdt=find_a_cdt(forcex_msg);
00089 if (cdt==0) {
00090 printk("no forcex_msg\n");
00091 return 0;
00092 }
00093
00094 c->cdrp_l_cdt=cdt;
00095 c->cdrp_w_cdrpsize=sizeof(struct _cwpssrv);
00096 c->cdrp_l_msg_buf=cwpssrv;
00097 c->cdrp_l_xct_len=100+sizeof(struct _cwpssrv);
00098 scs_std_senddg(0,100+sizeof(struct _cwpssrv),c);
00099 vfree(c);
00100 vfree(cwpssrv);
00101 return 0;
00102 }
00103