예제 #1
0
void kernel_threads_init()
{
    uint8_t tid;

    tid = init_thread("Idle",
                      THREAD_PRIO_IDLE,
                      idle_thread_entry,
                      NULL,
                      1 * KBYTE);

    if ((THREAD_TID_INVALID == tid) || (THREAD_TID_IDLE != tid)) {
        kernel_panic("cannot create the IDLE thread.");
        return;
    }

    if (!scheduler_add_thread(tid)) {
        kernel_panic("cannot add IDLE to the scheduler.");
    }

    kprintf("kernel threads setup complete.\n");
}
예제 #2
0
void kernel_libs_init()
{
    BOOL resval;
    unsigned i;

    for (i = 0; i < NELEMENTS(libs_init_array); i++) {
        resval = libs_init_array[i]();
        if (!resval) {
            kernel_panic(messages2[i]);
        }
    }

    kprintf("kernel setup complete.\n");
}
예제 #3
0
//! page fault
void _cdecl page_fault (uint32_t eip,uint32_t cs,uint32_t flags,uint32_t err) {

	intstart ();

	int faultAddr=0;

	_asm {
		mov eax, cr2
		mov [faultAddr], eax
	}

	kernel_panic ("Page Fault at 0x%x:0x%x refrenced memory at 0x%x",
		cs, eip, faultAddr);
	for (;;);
}
예제 #4
0
파일: lseek.c 프로젝트: Nakrez/zOS
int vfs_lseek(struct thread *t, int fd, off_t offset, int whence)
{
    struct file *file;
    struct process *process;

    /* Kernel request */
    if (!t)
        process = process_get(0);
    else
        process = t->parent;

    if (!(whence & VFS_SEEK_SET) && !(whence & VFS_SEEK_CUR) &&
        !(whence & VFS_SEEK_END))
        return -EINVAL;

    if (fd < 0 || fd > PROCESS_MAX_OPEN_FD)
        return -EINVAL;

    file = &process->files[fd];

    if (!file->used)
        return -EINVAL;

    if (whence & VFS_SEEK_SET) {
        if (offset < 0)
            return -EINVAL;

        file->offset = offset;
    } else if (whence & VFS_SEEK_CUR) {
        size_t old_off = file->offset;

        file->offset += offset;

        if (offset < 0 && file->offset > old_off) {
            file->offset = old_off;
            return -EINVAL;
        }

        if (offset > 0 && file->offset < old_off) {
            process->files[fd].offset = old_off;
            return -EINVAL;
        }
    } else {
        kernel_panic("VFS_SEEK_END not implemented yet");
    }

    return 0;
}
예제 #5
0
static void kernel_interrupt_others(register_t pending) {
	for(size_t i=0; i<7; i++) {
		if(pending & (1<<i)) {
			if(int_child[i] == 0) {
				KERNEL_ERROR("unknown interrupt %lx", i);
				continue;
			}
			cp0_status_im_disable(1<<i);
			struct reg_frame * frame = kernel_exception_framep + 0;
			frame->mf_v0 = -3;
			frame->mf_a0 = i;
			if(msg_push(int_child[i], 0, NULL, NULL)) {
				kernel_panic("queue full (int)");
			}
		}
	}
}
예제 #6
0
파일: prwait.c 프로젝트: pkgw/iraf
/* PR_ENTER -- Make a new entry in the process table.  Something is very wrong
 * if the table overflows.
 */
void
pr_enter (int pid, int inchan, int outchan)
{
	register struct proctable *pr;
	struct	proctable *pr_findpid();

	extern  int kernel_panic (char *msg);


	if ((pr = pr_findpid (NULL)) == NULL)
	    kernel_panic ("iraf process table overflow");
	else {
	    pr->pr_pid = pid;
	    pr->pr_active = YES;
	    pr->pr_inchan = inchan;
	    pr->pr_outchan = outchan;
	}
}
예제 #7
0
파일: interrupt.c 프로젝트: Nakrez/zOS
void interrupt_dispatch(struct irq_regs *regs)
{
    /*
     * FIXME: we use reg->irq_num and reg->irq_data that must be here
     * for every architecture ....
     */
    interrupt_acnowledge(regs->irq_num);

    if (regs->irq_num >= MAX_IRQ_NUMBER)
        kernel_panic("Invalid IRQ number");

    if (interrupt_entries[regs->irq_num].type == INTERRUPT_CALLBACK)
        interrupt_entries[regs->irq_num].callback(regs);
    else
        console_message(T_INF, "Unhandled IRQ %i fired with data = 0x%x",
                        regs->irq_num, regs->irq_data);

}
예제 #8
0
void task_entry(const char *exe_name) {
	__asm__ ("sti");

	screen_print("spawned new task\n");
	screen_print("loading ");
	screen_print(exe_name);
	screen_put('\n');

	const char *paths[] = {"bin", exe_name};
	auto mData = _kernel_state.fs.GetInode(2, paths);
	if(mData.IsNothing()) { kernel_panic("failed to get inode"); }
	auto data = mData.FromJust();

	_kernel_state.pager->Enable(_kernel_state.task->context);
	ELF elf(data);

	user_enter(elf.entry(), &_kernel_state.task->stack[PAGE_ALLOCATOR_PAGE_SIZE * Task::STACK_PAGES]);

	for(;;) { __asm__ ("hlt"); } // unreachable
}
예제 #9
0
파일: kthread.c 프로젝트: Nakrez/zOS
struct thread *kthread_create(uintptr_t code, int argc, char *argv[])
{
    int tid;
    struct thread *t;

    tid = thread_create(kproc, code, argc, argv,
                        THREAD_CREATEF_NOSTART_THREAD);
    if (tid < 0)
        return NULL;

    t = thread_get(kproc, tid);

    /* XXX: I am not sure this is possible, will see while testing. If this
     * happens it will be worth recovering
     */
    if (!t)
        kernel_panic("Thread get == NULL after thread_create()");

    return t;
}
예제 #10
0
void thread_suspend()
{
    thread_t *prev, *next;

    prev = scheduler_running_thread();

    if (!scheduler_suspend_thread()) {
        kernel_panic("cannot suspend a thread.\n");
        return;
    }

    schedule_thread();

    next = scheduler_running_thread();

    /* No one to wait for */
    if (prev == next) {
        return;
    }

    switch_context(prev->context, next->context);
}
예제 #11
0
/* No Maskable interrupt trap */
void interrupt _cdecl nmi_trap(uint32_t cs,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("NMI trap");
	for (;;);
}
예제 #12
0
/* Single step	*/
void interrupt _cdecl single_step_trap(uint32_t cs,uint32_t eip,uint32_t eflags) {
	kernel_panic("Single step");
	for (;;);
}
예제 #13
0
/* FPU Single Instruction Multiple Data (SIMD) error */
void interrupt _cdecl simd_fpu_fault(uint32_t cs,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("FPU SIMD fault");
	for (;;);
}
예제 #14
0
/* Machine Check */
void interrupt _cdecl machine_check_abort(uint32_t cs,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Machine Check");
	for (;;);
}
예제 #15
0
//! bounds check
void _cdecl bounds_check_fault (uint32_t cs, uint32_t  eip, uint32_t flags) {

	intstart ();
	kernel_panic ("Bounds check fault at physical address [0x%x:0x%x] EFLAGS [0x%x]",cs,eip, flags);
	for (;;);
}
예제 #16
0
/* Device not available */
void interrupt _cdecl no_device_fault(uint32_t cs,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Device not found");
	for (;;);
}
예제 #17
0
/* Bounds check */
void interrupt _cdecl bounds_check_fault(uint32_t cs,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Bounds check fault");
	for (;;);
}
예제 #18
0
/* Segment not present */
void interrupt _cdecl no_segment_fault(uint32_t cs,uint32_t err,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Invalid segment");
	for (;;);
}
예제 #19
0
/* Double Fault */
void interrupt _cdecl double_fault_abort(uint32_t cs,uint32_t err,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Double fault");
	for (;;);
}
예제 #20
0
//! double fault
void _cdecl double_fault_abort (uint32_t eip,uint32_t cs,uint32_t flags,uint32_t err)  {

	intstart ();
	kernel_panic ("Double fault at physical address [0x%x:0x%x] EFLAGS [0x%x]",cs,eip, flags);
	for (;;);
}
예제 #21
0
//! device not available
void _cdecl no_device_fault (uint32_t cs, uint32_t eip, uint32_t flags) {

	intstart ();
	kernel_panic ("Device not found fault at physical address [0x%x:0x%x] EFLAGS [0x%x]",cs,eip, flags);
	for (;;);
}
예제 #22
0
//! invalid opcode / instruction
void _cdecl invalid_opcode_fault (uint32_t cs, uint32_t  eip, uint32_t flags) {

	intstart ();
	kernel_panic ("Invalid opcode at physical address [0x%x:0x%x] EFLAGS [0x%x]",cs,eip, flags);
	for (;;);
}
예제 #23
0
/* Breakpoint hit */
void interrupt _cdecl breakpoint_trap(uint32_t cs,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Breakpoint trap");
	for (;;);
}
예제 #24
0
/* Stack fault */
void interrupt _cdecl stack_fault(uint32_t cs,uint32_t err,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Stack fault");
	for (;;);
}
예제 #25
0
/* Overflow trap */
void interrupt _cdecl overflow_trap(uint32_t cs,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Overflow trap");
	for (;;);
}
예제 #26
0
/* General Protection Fault */
void interrupt _cdecl general_protection_fault(uint32_t cs,uint32_t err,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("General Protection Fault");
	for (;;);
}
예제 #27
0
/* invalid opcode instruction */
void interrupt _cdecl invalid_opcode_fault(uint32_t cs,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Invalid opcode");
	for (;;);
}
예제 #28
0
/* Alignment Check */
void interrupt _cdecl alignment_check_fault(uint32_t cs,uint32_t err,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Alignment Check");
	for (;;);
}
예제 #29
0
/* Invalid TSS */
void interrupt _cdecl invalid_tss_fault(uint32_t cs,uint32_t err,uint32_t eip,uint32_t eflags) {
	intstart ();
	kernel_panic("Invalid TSS");
	for (;;);
}
예제 #30
0
//! overflow
void _cdecl overflow_trap (uint32_t cs, uint32_t eip, uint32_t flags) {

	intstart ();
	kernel_panic ("Overflow trap at physical address [0x%x:0x%x] EFLAGS [0x%x]",cs,eip, flags);
	for (;;);
}