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

📄 cp0.c

📁 32cpu的代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#include <stdio.h>
#include "cpu.h"

int  Watchhi_G;
int  Watchhi_ASID;

exception_answer(){
	int i;
	char temp_end;
			//	  printf("pc_address_dp=%08x\n",pc_address_dp);
			//          printf("pc_address_ip=%08x\n",pc_address_ip);
	              //判断一下这里还是否需要?
/*	                if((pc_address_ip&(0xfff00000))==0xbfc00000){
	                 //      instruction_dp=(pc_ip==0)? instr_out[pc_ip] : instr_out[pc_ip];   //未定
	                 //      instruction_ip=instr_out[pc_ip+1];
	                      instruction_dp=icache(pc_address_ip,0);
	                     instruction_ip=icache(pc_address_ip+4,0);
	                }else if((pc_address_ip&(0xf0000000))==0x90000000){
	                 //     instruction_dp=(pc_ip==0)? instr_out_1[pc_ip] : instr_out_1[pc_ip];   //未定
	                 //     instruction_ip=instr_out_1[pc_ip+1];
	                      instruction_dp=icache(pc_address_ip,0);
	                       instruction_ip=icache(pc_address_ip+4,0);
			 }else if((pc_address_ip&(0xfff00000))==0x40400000){
			       instruction_dp=icache(pc_address_ip,0);
			       instruction_ip=icache(pc_address_ip+4,0);
	                }else{
			       instruction_dp=icache(pc_address_ip,0);
			       instruction_ip=icache(pc_address_ip+4,0);
	                     //  printf("error,pc not in 0xbfc0  or  0x9000 \n");
	                  }*/
	                  
	                  
	                  
	                  
/*                 if(trap_flag){
                 	//永远不会执行,trap已经放入异常中
	                  trap_flag=0;   
	                  pc_address_ip=0xbfc00280;
	                  exception_invalid_instr_flag=4;
			  instruction_dp=(pc_ip==0)? icache(pc_address_ip,0) : icache(pc_address_dp,0);
			  instruction_ip=(pc_ip==0)? icache(pc_address_ip+4,0) : icache(pc_address_ip,0);
	                                	
                  }else{*/
                          switch(exception_flag)
                         {case 1 :   //Reset
                                   exception_flag=0;
                                   exception_invalid_instr_flag=0;
                                   pc_address_dp=0xbfc00000;
                                   pc_address_ip=0xbfc00004;
                                   pc_dp=0;
                                   pc_ip=1;
			           Random=15;
			           CPR[1]=15;
			           Wired=0;
			           CPR[6]=0;
			            if(tlb_fm_flag == 0){
			                // TLB	
			           	Config=0x80050082;
			           	CPR[16]=0x80050082;
			              }else{
			                 //FM
			                Config=0xa4050182;
			                CPR[16]=0xa4050182;
			              }
			           Status=Status|(0x00400004);
			           Status=Status&(0xf7c7ffff);
			           CPR[12]=Status;
			           Watchlo=Watchlo&(0xfffffff8);
			           CPR[18]=Watchlo;
			           if(branch_flag_wp == 1){
			           	//ErrorEPC=pc_address_wp;
			           	//CPR[30]=pc_address_wp;
			           	ErrorEPC=pc_address_wp - 4;
			           	CPR[30]=pc_address_wp - 4;
			             }else{
			                //ErrorEPC=pc_address_mp;
			                //CPR[30]=pc_address_mp;
			                ErrorEPC=pc_address_wp;
			                CPR[30]=pc_address_wp;
			                
			             }
			             for(i=0;i<32;i++){
			             	GPR[i]=0;
			              }
			          printf("pc_address_dp=%08x\n",pc_address_dp);
			          printf("pc_address_ip=%08x\n",pc_address_ip);
			           instruction_dp=icache(pc_address_dp,0);
			           instruction_ip=icache(pc_address_ip,0);
                                   break;
                   	  case 2 :    //Soft Reset
                   	           exception_flag=0;
                   	           exception_invalid_instr_flag=0;
                                   pc_address_dp=0xbfc00000;
                                   pc_address_ip=0xbfc00004;
                                   pc_dp=0;
                                   pc_ip=1;
			           Status=Status|(0x00500004);
			           Status=Status&(0xffd7ffff);
			           CPR[12]=Status;
			           if(branch_flag_wp == 1){
			           	//ErrorEPC=pc_address_wp;
			           	//CPR[30]=pc_address_wp;
			           	ErrorEPC=pc_address_wp - 4;
			           	CPR[30]=pc_address_wp - 4;
			             }else{
			                //ErrorEPC=pc_address_mp;
			                //CPR[30]=pc_address_mp;
			                ErrorEPC=pc_address_wp;
			                CPR[30]=pc_address_wp;
			                
			             }
			             for(i=0;i<32;i++){
			             	GPR[i]=0;
			             	}
			           instruction_dp=icache(pc_address_dp,0);
			           instruction_ip=icache(pc_address_ip,0);
                   	           break;
                   	  //case 3 :break;
                   	  //case 4 :break;
                   	  case 5 :  //NMI
                   	          exception_flag=0;
                   	           exception_invalid_instr_flag=0;
                                   pc_address_dp=0xbfc00000;
                                   pc_address_ip=0xbfc00004;
                                   pc_dp=0;
                                   pc_ip=1;
			           Status=Status|(0x00480004);
			           Status=Status&(0xffcfffff);
			           CPR[12]=Status;
			           if(branch_flag_wp == 1){
			           	//ErrorEPC=pc_address_wp;
			           	//CPR[30]=pc_address_wp;
			           	ErrorEPC=pc_address_wp - 4;
			           	CPR[30]=pc_address_wp - 4;
			             }else{
			                //ErrorEPC=pc_address_mp;
			                //CPR[30]=pc_address_mp;
			                ErrorEPC=pc_address_wp;
			                CPR[30]=pc_address_wp;
			                
			             }
			             for(i=0;i<32;i++){
			             	GPR[i]=0;
			              }
			            Cause=(Cause&(0xffffff03))|(0x00000000);   //Exc Code  in Cause is 0
			            CPR[13]=Cause;
			           instruction_dp=icache(pc_address_dp,0);
			           instruction_ip=icache(pc_address_ip,0);
                   	          break;
                   	  case 6 :   //  Machine check
                   	          exception_flag=0;
                   	          exception_invalid_instr_flag=5;
                   	    //Entryhi=vpn2,asid
                   	    //Context=(Context&(0xff80000f))|((Entryhi>>9)&(0x007ffff0));
                   	   // Cause=set(exccode,ce)
                   	   // Badvaddr=vaddress
                   	           if(((Status>>22)&(0x00000001)) == 0){
                   	          	 if(((Status>>1)&(0x00000001)) == 0){
                   	          	       pc_address_ip=0x80000000;
                   	          	 }else{
                   	          	       pc_address_ip=0x80000180;
                   	          	 }

                   	            }else{
                   	          	 if(((Status>>1)&(0x00000001)) == 0){
                   	          	       pc_address_ip=0xbfc00200;
                   	          	 }else{
                   	          	       pc_address_ip=0xbfc00380;
                   	          	 }
                   	            }
                   	            if(branch_flag_wp == 1){
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	         /*  if((Status&(0x00000004)) == 0){
			           	         	  //ERL == 0
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	            }else{
			           	                 //ERL == 1
			           	                ErrorEPC=pc_address_wp - 4;
			           	                CPR[30]=pc_address_wp - 4;
			           	            }*/
                   	            	
                    	          	 if(((Status>>1)&(0x00000001)) == 0){
                    	          	 	//EPC=pc_address_wp;
                   	          	       //EPC=pc_address_wp - 4;
                   	          	       Cause=Cause|(0x80000000);
                   	          	       Status=Status|(0x00000002);
                   	          	       //CPR[14]=EPC;
                   	          	       CPR[12]=Status;
                   	          	       CPR[13]=Cause;
                   	          	 }else{
                                               Status=Status|(0x00000002);
                                               CPR[12]=Status;
                   	          	 }
                   	            }else{
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	          /* if((Status&(0x00000004)) == 0){
			           	         	    //ERL == 0
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
                   	            
                   	          	 if(((Status>>1)&(0x00000001)) == 0){
                   	          	 	//EPC=pc_address_mp;
                   	          	       //EPC=pc_address_wp;
                   	          	       Cause=Cause&(0x7fffffff);
                   	          	       Status=Status|(0x00000002);
                   	          	       //CPR[14]=EPC;
                   	          	       CPR[12]=Status;
                   	          	       CPR[13]=Cause;
                   	          	 }else{
                   	          	       Status=Status|(0x00000002);
                   	          	       CPR[12]=Status;
                   	          	 }
                   	            }
			            Cause=(Cause&(0xffffff03))|(0x00000060);   //Exc Code  in Cause is 24
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	          break;
                   	  case 7 :  //Interrupt
                   	            //            BEV                                EXL                                  IV
                   	           exception_flag=0;
                   	          exception_invalid_instr_flag=5;
                   	          if((((Status>>22)&(0x00000001)) == 0) && (((Status>>1)&(0x00000001)) == 0) && (((Cause>>23)&(0x00000001)) == 0)){
                   	          	    pc_address_ip=0x80000180;
                   	          	}else if((((Status>>22)&(0x00000001)) == 0) && (((Status>>1)&(0x00000001)) == 0) && (((Cause>>23)&(0x00000001)) == 1)){
                   	          	    pc_address_ip=0x80000200;
                   	          	}else if((((Status>>22)&(0x00000001)) == 1) && (((Status>>1)&(0x00000001)) == 0) && (((Cause>>23)&(0x00000001)) == 0)){
                   	          	    pc_address_ip=0xbfc00380;
                   	          	}else if((((Status>>22)&(0x00000001)) == 1) && (((Status>>1)&(0x00000001)) == 0) && (((Cause>>23)&(0x00000001)) == 1)){
                   	          	    pc_address_ip=0xbfc00400;
                   	          	}else{
                   	          	   // Interrupt is disabled
                   	          	    pc_address_ip=pc_address_ip + 4;
                   	          	}
                   	             if((Status&(0x00000002)) == 0){
			                   if(branch_flag_wp == 1){
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	      /*     if((Status&(0x00000004)) == 0){
			           	         	  //ERL == 0
			           	                EPC=pc_address_wp - 4;
			           	                CPR[14]=pc_address_wp - 4;
			           	            }else{
			           	                 //ERL == 1
			           	                ErrorEPC=pc_address_wp - 4;
			           	                CPR[30]=pc_address_wp - 4;
			           	            }*/

			                    }else{
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	       /*    if((Status&(0x00000004)) == 0){
			           	         	    //ERL == 0

⌨️ 快捷键说明

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