static void ubd_intr2(int irq, void *dev, struct pt_regs *unused) { struct _irp * i; struct _ucb * u; void (*func)(); if (intr_blocked(20)) return; regtrap(REG_INTR,20); setipl(20); /* have to do this until we get things more in order */ i=globali; u=globalu; func=u->ucb$l_fpc; func(i,u); myrei(); }
asmlinkage void sch$sched(int from_sch$resched) { int cpuid = smp_processor_id(); struct _cpu * cpu=smp$gl_cpu_data[cpuid]; struct _pcb *next = 0, *curpcb; int curpri, affinity; unsigned char tmppri; unsigned long qhead = 0; int after, before; curpcb=cpu->cpu$l_curpcb; curpri=cpu->cpu$b_cur_pri; // if (!countme--) { countme=500; printk("."); } if (from_sch$resched == 1) goto skip_lock; #if 0 // NOT YET??? nope,not an interrupt. pushpsl+setipl/vmslock instead? if (intr_blocked(IPL$_SCHED)) return; regtrap(REG_INTR,IPL$_SCHED); #endif int ipl = getipl(); if (ipl != 8 || SPIN_SCHED.spl$l_spinlock == 0) panic("schsch\n"); #if 0 // temp workaround // must avoid nesting, since I do not know how to get out of it setipl(IPL$_SCHED); vmslock(&SPIN_SCHED,-1); #endif /** clear cpu_priority for current pri bit - TODO: where did this come from? */ sch$al_cpu_priority[curpri]=sch$al_cpu_priority[curpri] & (~ cpu->cpu$l_cpuid_mask ); /** skip if ... TODO: from where? */ if (sch$al_cpu_priority[curpri]) goto skip_lock; /** clear active_priority for current pri bit - TODO: where did this come from? */ sch$gl_active_priority=sch$gl_active_priority & (~ (1 << (31-curpri))); //if (spl(IPL$_SCHED)) return; // old=spl(IPL$_SCHED); /** now 4 linux leftovers */ spin_lock_prefetch(&runqueue_lock); if (!curpcb->active_mm) BUG(); release_kernel_lock(curpcb, cpuid); spin_lock_irq(&runqueue_lock); skip_lock: /** reset cpu affinity TODO: from where? */ affinity=0; struct _pcb * aff_next = 0; /** find highest pri comqueue */ tmppri=ffs(sch$gl_comqs); #ifdef DEBUG_SCHED if (mydebug5) printk("ffs %x %x\n",tmppri,sch$gl_comqs); #endif if (!tmppri) { /** if none found, idle */ #if 0 // spot for more vms sched goto sch$idle; #endif go_idle: /** set bit in idle_cpus */ sch$gl_idle_cpus=sch$gl_idle_cpus | (cpu->cpu$l_cpuid_mask); /** store null pcb and -1 pri: MISSING check why */ /** necessary idle_task line from linux */ next=idle_task(cpuid); goto skip_cap; } else {
asmlinkage void sch$resched(void) { int cpuid = smp_processor_id(); struct _cpu * cpu=smp$gl_cpu_data[cpuid]; struct _pcb * curpcb; unsigned long curpri; unsigned long qhead; int before,after; // lock sched db, soon //if (spl(IPL$_SCHED)) return; // old=spl(IPL$_SCHED); // svpctx, do not think we need to do this here #ifdef __x86_64__ if (intr_blocked(IPL$_RESCHED)) return; regtrap(REG_INTR,IPL$_RESCHED); #endif /** spinlock sched and set ipl */ setipl(IPL$_SCHED); vmslock(&SPIN_SCHED,-1); spin_lock_irq(&runqueue_lock); /* eventually change to sched? */ /** get current pcb and priority */ curpcb=cpu->cpu$l_curpcb; release_kernel_lock(curpcb, cpuid); curpri=cpu->cpu$b_cur_pri; /** clear bit in cpu_priority table */ sch$al_cpu_priority[curpri]=sch$al_cpu_priority[curpri] & (~ cpu->cpu$l_cpuid_mask ); /** if no process with this pri on any cpu, clear bit in active_priority table */ if (!sch$al_cpu_priority[curpri]) sch$gl_active_priority=sch$gl_active_priority & (~ (1 << (31-curpri))); /** now some if's remaining from linux - TODO: check if still needed */ if (curpcb == idle_task(curpcb->pcb$l_cpu_id)) goto out; if (curpcb->state==TASK_INTERRUPTIBLE) if (signal_pending(curpcb)) { curpcb->state = TASK_RUNNING; curpcb->pcb$w_state = SCH$C_CUR; } #if 0 if (curpcb->state!=TASK_RUNNING) { curpcb->pcb$w_state=SCH$C_LEF; // use here temporarily } #endif #if 0 if (curpcb->state==TASK_RUNNING) { #endif #ifdef DEBUG_SCHED before=numproc(); // printcom(); //if (curpcb==0xa018c000 && qhead==0xa018c000) // panic("aieeeeeh\n"); mycheckaddr(0); //if (curpcb==qhead) panic(" a panic\n"); #endif /** set pri bit in comqs */ sch$gl_comqs=sch$gl_comqs | (1 << curpri); // curpcb->state=TASK_INTERRUPTIBLE; /* soon SCH$C_COM ? */ /** set state of cur pcb to COM */ curpcb->pcb$w_state=SCH$C_COM; /** insert pcb at tail of comqueue */ #ifdef __i386__ qhead=*(unsigned long *)&sch$aq_comt[curpri]; #else qhead=*(unsigned long *)&sch$aq_comh[curpri][1]; #endif if (!task_on_comqueue(curpcb)) { if (curpcb==qhead) panic(" a panic\n"); insque(curpcb,qhead); } else { panic("something\n"); } #ifdef DEBUG_SCHED mycheckaddr(42); #endif /** linux leftover */ nr_running++; #ifdef DEBUG_SCHED after=numproc(); if(after-before!=1) { //printk("entry qhead %x %x\n",curpcb,qhead); printcom(); panic("insq2 %x %x\n",before,after); } #endif out: /** clear idle_cpus to signal all idle cpus to try to reschedule */ sch$gl_idle_cpus=0; #if 0 } #endif /** go some intro sch$sched */ sch$sched(1); }