00001 #include<linux/kernel.h>
00002 #include<linux/sched.h>
00003 #include<spldef.h>
00004 #include<asm/bitops.h>
00005 #include<system_data_cells.h>
00006
00007
00008
00009
00010
00011
00012
00013
00014 #undef SPINDEB
00015 #define SPINDEB
00016
00017 #ifdef SPINDEB
00018 static int spinc = 0;
00019 long spin[1024];
00020 #endif
00021
00022
00023
00024
00025
00026
00027
00028
00029 inline int smp_acquire(struct _spl * spl) {
00030
00031 #ifdef SPINDEB
00032 long * l = &spl;
00033 spin[spinc++]=l[-1];
00034 spin[spinc++]=spl;
00035 spin[spinc++]=ctl_gl_pcb;
00036 spin[spinc++]=l;
00037 spin[spinc++]=smp_processor_id();
00038 spin[spinc++]=spl->spl_l_own_cnt;
00039 spin[spinc++]=ctl_gl_pcb->psl_ipl;
00040 spin[spinc++]=0;
00041 if(spinc>1000) spinc=0;
00042 #endif
00043
00044
00045
00046 again:
00047 {}
00048
00049 int bit = test_and_set_bit(0,&spl->spl_l_spinlock);
00050 if (bit) {
00051
00052
00053 if (spl->spl_l_own_cpu==smp$gl_cpu_data[ctl$gl_pcb->pcb$l_cpu_id]) {
00054
00055 spl->spl_l_own_cnt++;
00056 } else {
00057
00058 while (test_bit(0,&spl->spl_l_spinlock)) {
00059 }
00060 goto again;
00061 }
00062 } else {
00063
00064
00065 spl->spl_l_own_cpu=smp$gl_cpu_data[ctl$gl_pcb->pcb$l_cpu_id];
00066 #ifdef SPINDEB
00067 if (spl->spl_l_own_cpu==0)
00068 panic("cpu 0\n");
00069 #endif
00070
00071 spl->spl_l_own_cnt++;
00072 #ifdef SPINDEB
00073 if (spl->spl_l_own_cnt==1) {
00074 panic("cnt 1\n");
00075 #endif
00076 }
00077 #if 0
00078
00079 int intr;
00080 local_irq_save(intr);
00081 local_irq_disable();
00082 local_irq_restore(intr);
00083 #endif
00084 }
00085
00086
00087 }
00088
00089
00090
00091
00092
00093
00094
00095
00096 inline int smp_restore(struct _spl * spl) {
00097
00098
00099 spl->spl_l_own_cnt--;
00100
00101 if (spl->spl_l_own_cnt==-1) {
00102
00103 spl->spl_l_own_cpu = 0;
00104
00105 clear_bit(0,&spl->spl_l_spinlock);
00106
00107 }
00108 }
00109
00110