/** Initialize an answerbox structure. * * @param box Answerbox structure to be initialized. * @param task Task to which the answerbox belongs. * */ void ipc_answerbox_init(answerbox_t *box, task_t *task) { irq_spinlock_initialize(&box->lock, "ipc.box.lock"); irq_spinlock_initialize(&box->irq_lock, "ipc.box.irqlock"); waitq_initialize(&box->wq); list_initialize(&box->connected_phones); list_initialize(&box->calls); list_initialize(&box->dispatched_calls); list_initialize(&box->answers); list_initialize(&box->irq_notifs); list_initialize(&box->irq_list); box->task = task; }
/** Initialize physical memory management. * */ void frame_init(void) { if (config.cpu_active == 1) { zones.count = 0; irq_spinlock_initialize(&zones.lock, "frame.zones.lock"); mutex_initialize(&mem_avail_mtx, MUTEX_ACTIVE); condvar_initialize(&mem_avail_cv); } /* Tell the architecture to create some memory */ frame_low_arch_init(); if (config.cpu_active == 1) { frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)), SIZE2FRAMES(config.kernel_size)); frame_mark_unavailable(ADDR2PFN(KA2PA(config.stack_base)), SIZE2FRAMES(config.stack_size)); for (size_t i = 0; i < init.cnt; i++) frame_mark_unavailable(ADDR2PFN(init.tasks[i].paddr), SIZE2FRAMES(init.tasks[i].size)); if (ballocs.size) frame_mark_unavailable(ADDR2PFN(KA2PA(ballocs.base)), SIZE2FRAMES(ballocs.size)); /* * Blacklist first frame, as allocating NULL would * fail in some places */ frame_mark_unavailable(0, 1); } frame_high_arch_init(); }
/** Initialize CPUs * * Initialize kernel CPUs support. * */ void cpu_init(void) { #ifdef CONFIG_SMP if (config.cpu_active == 1) { #endif /* CONFIG_SMP */ cpus = (cpu_t *) malloc(sizeof(cpu_t) * config.cpu_count, FRAME_ATOMIC); if (!cpus) panic("Cannot allocate CPU structures."); /* Initialize everything */ memsetb(cpus, sizeof(cpu_t) * config.cpu_count, 0); size_t i; for (i = 0; i < config.cpu_count; i++) { cpus[i].stack = (uint8_t *) frame_alloc(STACK_FRAMES, FRAME_LOWMEM | FRAME_KA | FRAME_ATOMIC); cpus[i].id = i; irq_spinlock_initialize(&cpus[i].lock, "cpus[].lock"); unsigned int j; for (j = 0; j < RQ_COUNT; j++) { irq_spinlock_initialize(&cpus[i].rq[j].lock, "cpus[].rq[].lock"); list_initialize(&cpus[i].rq[j].rq); } } #ifdef CONFIG_SMP } #endif /* CONFIG_SMP */ CPU = &cpus[config.cpu_active - 1]; CPU->active = true; CPU->tlb_active = true; CPU->idle = false; CPU->last_cycle = get_cycle(); CPU->idle_cycles = 0; CPU->busy_cycles = 0; cpu_identify(); cpu_arch_init(); }
/** Initialize one IRQ structure. * * @param irq Pointer to the IRQ structure to be initialized. * */ void irq_initialize(irq_t *irq) { memsetb(irq, sizeof(irq_t), 0); link_initialize(&irq->link); irq_spinlock_initialize(&irq->lock, "irq.lock"); irq->inr = -1; irq->devno = -1; irq_initialize_arch(irq); }