⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arch_int.c

📁 newos is new operation system
💻 C
字号:
/*** Copyright 2001, Travis Geiselbrecht. All rights reserved.** Distributed under the terms of the NewOS License.*/#include <boot/stage2.h>#include <kernel/int.h>#include <kernel/vm.h>#include <kernel/vm_priv.h>#include <kernel/timer.h>#include <kernel/thread.h>#include <kernel/time.h>#include <string.h>// defined in arch_exceptions.Sextern int __irqvec_start;extern int __irqvec_end;void arch_int_enable_io_interrupt(int irq){	return;}void arch_int_disable_io_interrupt(int irq){	return;}static void print_iframe(struct iframe *frame){	dprintf("iframe at %p:\n", frame);	dprintf("r0-r3:   0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", frame->r0, frame->r1, frame->r2, frame->r3);	dprintf("r4-r7:   0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", frame->r4, frame->r5, frame->r6, frame->r7);	dprintf("r8-r11:  0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", frame->r8, frame->r9, frame->r10, frame->r11);	dprintf("r12-r15: 0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", frame->r12, frame->r13, frame->r14, frame->r15);	dprintf("r16-r19: 0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", frame->r16, frame->r17, frame->r18, frame->r19);	dprintf("r20-r23: 0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", frame->r20, frame->r21, frame->r22, frame->r23);	dprintf("r24-r27: 0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", frame->r24, frame->r25, frame->r26, frame->r27);	dprintf("r28-r31: 0x%08lx 0x%08lx 0x%08lx 0x%08lx\n", frame->r28, frame->r29, frame->r30, frame->r31);	dprintf("     ctr 0x%08lx        xer 0x%08lx\n", frame->ctr, frame->xer);	dprintf("      cr 0x%08lx         lr 0x%08lx\n", frame->cr, frame->lr);	dprintf("   dsisr 0x%08lx        dar 0x%08lx\n", frame->dsisr, frame->dar);	dprintf("    srr1 0x%08lx       srr0 0x%08lx\n", frame->srr1, frame->srr0);}void ppc_exception_entry(int vector, struct iframe *iframe);void ppc_exception_entry(int vector, struct iframe *iframe){	int ret = INT_NO_RESCHEDULE;	if(vector != 0x900)		dprintf("ppc_exception_entry: time %Ld vector 0x%x, iframe %p\n", system_time(), vector, iframe);	switch(vector) {		case 0x100: // system reset			panic("system reset exception\n");			break;		case 0x200: // machine check			panic("machine check exception\n");			break;		case 0x300: // DSI		case 0x400: { // ISI			addr_t newip;			ret = vm_page_fault(iframe->dar, iframe->srr0,				iframe->dsisr & (1 << 25), // store or load				iframe->srr1 & (1 << 14), // was the system in user or supervisor				&newip);			if(newip != 0) {				// the page fault handler wants us to modify the iframe to set the				// IP the cpu will return to to be this ip				iframe->srr0 = newip;			} 			break;		}		case 0x500: // external interrupt			panic("external interrrupt exception: unimplemented\n");			break;		case 0x600: // alignment exception			panic("alignment exception: unimplemented\n");			break;		case 0x700: // program exception			panic("program exception: unimplemented\n");			break;		case 0x800: // FP unavailable exception			panic("FP unavailable exception: unimplemented\n");			break;		case 0x900: // decrementer exception			ret = timer_interrupt();			break;		case 0xc00: // system call			panic("system call exception: unimplemented\n");			break;		case 0xd00: // trace exception			panic("trace exception: unimplemented\n");			break;		case 0xe00: // FP assist exception			panic("FP assist exception: unimplemented\n");			break;		case 0xf00: // performance monitor exception			panic("performance monitor exception: unimplemented\n");			break;		case 0xf20: // alitivec unavailable exception			panic("alitivec unavailable exception: unimplemented\n");			break;		case 0x1000:		case 0x1100:		case 0x1200:			panic("TLB miss exception: unimplemented\n");			break;		case 0x1300: // instruction address exception			panic("instruction address exception: unimplemented\n");			break;		case 0x1400: // system management exception			panic("system management exception: unimplemented\n");			break;		case 0x1600: // altivec assist exception			panic("altivec assist exception: unimplemented\n");			break;		case 0x1700: // thermal management exception			panic("thermal management exception: unimplemented\n");			break;		default:			dprintf("unhandled exception type 0x%x\n", vector);			print_iframe(iframe);			panic("unhandled exception type\n");	}	if(ret == INT_RESCHEDULE) {		int_disable_interrupts();		GRAB_THREAD_LOCK();		thread_resched();		RELEASE_THREAD_LOCK();		int_restore_interrupts();	}}int arch_int_init(kernel_args *ka){	return 0;}int arch_int_init2(kernel_args *ka){	region_id exception_region;	void *ex_handlers;	// create a region to map the irq vector code into (physical addres 0x0)	ex_handlers = (void *)ka->arch_args.exception_handlers.start;	exception_region = vm_create_anonymous_region(vm_get_kernel_aspace_id(), "exception_handlers",		&ex_handlers, REGION_ADDR_EXACT_ADDRESS,		ka->arch_args.exception_handlers.size, REGION_WIRING_WIRED_ALREADY, LOCK_RW|LOCK_KERNEL);	if(exception_region < 0)		panic("arch_int_init2: could not create exception handler region\n");	dprintf("exception handlers at %p\n", ex_handlers);	// copy the handlers into this area	memcpy(ex_handlers, &__irqvec_start, ka->arch_args.exception_handlers.size);	arch_cpu_sync_icache(0, 0x3000);	// make sure the IP bit isn't set (putting the exceptions at 0x0)	setmsr(getmsr() & ~MSR_IP);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -