PUBLIC void * k_stacks;
FORWARD _PROTOTYPE( void ser_debug, (int c));
+#ifdef CONFIG_SMP
+FORWARD _PROTOTYPE( void ser_dump_proc_cpu, (void));
+#endif
PUBLIC __dead void arch_monitor(void)
{
case '3':
ser_dump_segs();
break;
+#ifdef CONFIG_SMP
+ case '4':
+ ser_dump_proc_cpu();
+ break;
+#endif
#if DEBUG_TRACE
#define TOGGLECASE(ch, flag) \
case ch: { \
serial_debug_active = 0;
}
-
PUBLIC void ser_dump_proc()
{
struct proc *pp;
}
}
+#ifdef CONFIG_SMP
+PRIVATE void ser_dump_proc_cpu(void)
+{
+ struct proc *pp;
+ unsigned cpu;
+
+ for (cpu = 0; cpu < ncpus; cpu++) {
+ printf("CPU %d processes : \n", cpu);
+ for (pp= BEG_USER_ADDR; pp < END_PROC_ADDR; pp++) {
+ if (isemptyp(pp) || pp->p_cpu != cpu)
+ continue;
+ print_proc(pp);
+ }
+ }
+}
+#endif
+
#if SPROFILE
PUBLIC int arch_init_profile_clock(const u32_t freq)
struct proc *depproc = NULL;
endpoint_t dep;
- printf("%d: %s %d prio %d time %d/%d cycles 0x%x%08x cr3 0x%lx rts %s misc %s sched %s ",
- proc_nr(pp), pp->p_name, pp->p_endpoint,
+ printf("%d: %s %d prio %d time %d/%d cycles 0x%x%08x cpu %2d "
+ "cr3 0x%lx rts %s misc %s sched %s ",
+ proc_nr(pp), pp->p_name, pp->p_endpoint,
pp->p_priority, pp->p_user_time,
- pp->p_sys_time, pp->p_cycles.hi, pp->p_cycles.lo, pp->p_seg.p_cr3,
+ pp->p_sys_time, pp->p_cycles.hi, pp->p_cycles.lo, pp->p_cpu,
+ pp->p_seg.p_cr3,
rtsflagstr(pp->p_rts_flags), miscflagstr(pp->p_misc_flags),
schedulerstr(pp->p_scheduler));
if (!proc_is_runnable(p))
goto not_runnable_pick_new;
- TRACE(VF_SCHEDULING, printf("starting %s / %d\n",
- p->p_name, p->p_endpoint););
+ TRACE(VF_SCHEDULING, printf("cpu %d starting %s / %d "
+ "pc 0x%08x\n",
+ cpuid, p->p_name, p->p_endpoint, p->p_reg.pc););
#if DEBUG_TRACE
p->p_schedules++;
#endif
rdy_head = get_cpulocal_var(run_q_head);
for (q=0; q < NR_SCHED_QUEUES; q++) {
if(!(rp = rdy_head[q])) {
- TRACE(VF_PICKPROC, printf("queue %d empty\n", q););
+ TRACE(VF_PICKPROC, printf("cpu %d queue %d empty\n", cpuid, q););
continue;
}
assert(proc_is_runnable(rp));