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

📄 arch_int.c

📁 newos is new operation system
💻 C
字号:
/*** Copyright 2001-2004, Travis Geiselbrecht. All rights reserved.** Distributed under the terms of the NewOS License.*/#include <boot/stage2.h>#include <arch/sh4/vcpu.h>#include <arch/sh4/sh4.h>#include <kernel/debug.h>#include <kernel/int.h>#include <kernel/thread.h>#include <kernel/vm_priv.h>#include <kernel/faults_priv.h>#include <kernel/syscalls.h>#include <kernel/arch/sh4/cpu.h>#define MAX_ARGS 16struct vector *vector_table;bool arch_int_are_interrupts_enabled(void){	PANIC_UNIMPLEMENTED();	return false;}void arch_int_enable_io_interrupt(int irq){	return;}void arch_int_disable_io_interrupt(int irq){	return;}static int sh4_handle_exception(void *_frame)//static int sh4_handle_exception(unsigned int code, unsigned int pc, unsigned int trap, unsigned int page_fault_addr){	struct iframe *frame = (struct iframe *)_frame;	int ret;	// NOTE: not safe to do anything that may involve the FPU before	// it is certain it is not an fpu exception//	dprintf("sh4_handle_exception: frame 0x%x code 0x%x, pc 0x%x, ssr 0x%x, sr 0x%x, pr 0x%x\n",//		frame, frame->excode, frame->spc, frame->ssr, get_sr(), frame->pr);//	dprintf("regs: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",//		frame->r0, frame->r1, frame->r2, frame->r3, frame->r4, frame->r5, frame->r6, frame->r7,//		frame->r8, frame->r9, frame->r10, frame->r11, frame->r12, frame->r13, frame->r14, frame->sgr);	switch(frame->excode) {		case 0:  // reset		case 1:  // manual reset		case 7:  // data address error (read)		case 8:  // data address error (write)		case 10: // TLB multi hit		case 12: // illegal instruction		case 13: // slot illegal instruction			dprintf("about to gpf at pc 0x%x, excode %d, TEA 0x%x\n", frame->spc, frame->excode, *(addr_t *)TEA);			dprintf("\tframe %p code 0x%x, spc 0x%x, ssr 0x%x, sgr 0x%x, sr 0x%x, pr 0x%x\n",				frame, frame->excode, frame->spc, frame->ssr, frame->sgr, get_sr(), frame->pr);			dprintf("\tregs: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",				frame->r0, frame->r1, frame->r2, frame->r3, frame->r4, frame->r5, frame->r6, frame->r7,				frame->r8, frame->r9, frame->r10, frame->r11, frame->r12, frame->r13, frame->r14, frame->sgr);			ret = general_protection_fault(frame->excode);			break;		case 11:  { // TRAPA#if 0			/*			** arg layout:			** r4-r7:  arg 1 - 4			** r0-r3:  arg 5 - 8			** r8-r13: arg 8 - 13			*/			unsigned int *trap = (unsigned int *)0xff000020;			uint64 retcode;			unsigned int args[MAX_ARGS];			int_enable_interrupts();			thread_atkernel_entry();			// XXX redo this to be stack-based			args[0] = frame->r4;			args[1] = frame->r5;			args[2] = frame->r6;			args[3] = frame->r7;			args[4] = frame->r0;			args[5] = frame->r1;			args[6] = frame->r2;			args[7] = frame->r3;			args[8] = frame->r8;			ret = syscall_dispatcher(*trap >> 2, args, &retcode);			frame->r0 = retcode & 0xffffffff;			frame->r1 = retcode >> 32;#else			panic("implement syscall stuff\n");#endif			break;		}		case 9: { // FPU exception			int fpu_fault_code;			switch(frame->fpscr & 0x0003f000) {				case 0x1000:					fpu_fault_code = FPU_FAULT_CODE_INEXACT;					break;				case 0x2000:					fpu_fault_code = FPU_FAULT_CODE_UNDERFLOW;					break;				case 0x4000:					fpu_fault_code = FPU_FAULT_CODE_OVERFLOW;					break;				case 0x8000:					fpu_fault_code = FPU_FAULT_CODE_DIVBYZERO;					break;				case 0x10000:					fpu_fault_code = FPU_FAULT_CODE_INVALID_OP;					break;				case 0x20000:					fpu_fault_code = FPU_FAULT_CODE_UNKNOWN;					break;				default:					// XXX handle better					fpu_fault_code = FPU_FAULT_CODE_UNKNOWN;			}			ret = fpu_fault(fpu_fault_code);			break;		}		case 64: // FPU disable exception		case 65: // Slot FPU disable exception			ret = fpu_disable_fault();			break;		case 5:  // TLB protection violation (read)		case 6:  // TLB protection violation (write)			// make these faults act like a page fault			frame->page_fault_addr = *(addr_t *)TEA;			frame->excode = (frame->excode == 5) ? EXCEPTION_PAGE_FAULT_READ : EXCEPTION_PAGE_FAULT_WRITE;		case EXCEPTION_PAGE_FAULT_READ:		case EXCEPTION_PAGE_FAULT_WRITE: {			addr_t newip;			if((frame->ssr & 0x000000f0) == 0) {//				dprintf("page_fault: enabling interrupts\n");				int_enable_interrupts();			}			ret = vm_page_fault(frame->page_fault_addr, frame->spc,				frame->excode == EXCEPTION_PAGE_FAULT_WRITE, (frame->ssr & 0x40000000) == 0, &newip);			if(newip != 0)				frame->spc = newip;			break;		}		default:			ret = int_io_interrupt_handler(frame->excode);	}	if(ret == INT_RESCHEDULE) {		int_disable_interrupts();		GRAB_THREAD_LOCK();		thread_resched();		RELEASE_THREAD_LOCK();		int_restore_interrupts();	}	if(!(frame->ssr & 0x40000000) || (frame->excode == 11)) {		thread_atkernel_exit();	}//	dprintf("sh4_handle_exception: exit\n");	return 0;}int arch_int_init(kernel_args *ka){	int i;	dprintf("arch_int_init: entry\n");	vector_table = (struct vector *)ka->arch_args.vcpu->vt;	dprintf("arch_int_init: vector table 0x%x\n", vector_table);	// set up the vectors	// handle all of them	for(i=0; i<256; i++)		vector_table[i].func = &sh4_handle_exception;	return 0;}int arch_int_init2(kernel_args *ka){	return 0;}

⌨️ 快捷键说明

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