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

📄 cp0.c

📁 32cpu的代码
💻 C
📖 第 1 页 / 共 5 页
字号:
                   	            }
                   	            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 - 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_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))|(0x0000000c);   //Exc Code  in Cause is 3
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4;  
                   	           break;
                   	  case 26 :  //TLB MOD
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status>>22)&(0x00000001)) == 1){
                   	            	//BEV in Status is one
                   	            	  pc_address_ip=0xbfc00380;
                   	             }else{
                   	               //BEV in Status is zero
                   	                  pc_address_ip=0x80000180;
                   	             }
                   	             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
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }

			             Status=Status|(0x00000002);
			             CPR[12]=Status;
			            Cause=(Cause&(0xffffff03))|(0x00000004);   //Exc Code  in Cause is 1
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	            break;
                   	  case 27 :  //DBE   general exception
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status>>22)&(0x00000001)) == 1){
                   	            	//BEV in Status is one
                   	            	  pc_address_ip=0xbfc00380;
                   	             }else{
                   	               //BEV in Status is zero
                   	                  pc_address_ip=0x80000180;
                   	             }
                   	             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
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }

			             Status=Status|(0x00000002);
			             CPR[12]=Status;
			            Cause=(Cause&(0xffffff03))|(0x0000001c);   //Exc Code  in Cause is 7
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4;  
                   	           break;
                   	  //case 28 :break;
                   	  case 29 : // tlbl   general exception
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status>>22)&(0x00000001)) == 1){
                   	            	//BEV in Status is one
                   	            	  pc_address_ip=0xbfc00380;
                   	             }else{
                   	               //BEV in Status is zero
                   	                  pc_address_ip=0x80000180;
                   	             }
                   	             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
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }

			             Status=Status|(0x00000002);
			             CPR[12]=Status;
			            Cause=(Cause&(0xffffff03))|(0x00000008);   //Exc Code  in Cause is 2
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4;  
                   	            break;
                   	  case 30 : // tlbs   general exception
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status>>22)&(0x00000001)) == 1){
                   	            	//BEV in Status is one
                   	            	  pc_address_ip=0xbfc00380;
                   	             }else{
                   	               //BEV in Status is zero
                   	                  pc_address_ip=0x80000180;
                   	             }
                   	             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
			           	                EPC=pc_address_wp;
			           	                CPR[14]=pc_address_wp;
			           	            }else{
			           	                   //ERL == 1
			           	                ErrorEPC=pc_address_wp;
			           	                CPR[30]=pc_address_wp;
			           	            }*/
			                  }
                   	             }

			             Status=Status|(0x00000002);
			             CPR[12]=Status;
			            Cause=(Cause&(0xffffff03))|(0x0000000c);   //Exc Code  in Cause is 3
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	            break; 
                   	     case 31 : // eret   general exception   
                   	            exception_flag=0;
                   	            exception_invalid_instr_flag=5;
                   	            if(((Status)&(0x00000004)) == 4){
                   	            	pc_address_ip=ErrorEPC;
                   	            	Status=Status&(0xfffffffb);
                   	            	CPR[12]=Status;
                   	            }else{
                   	            printf("\nErrorEPC=0x%08x\n",ErrorEPC);
                   	            printf("\nEPC=0x%08x\n",EPC);
                   	            printf("\nStatus=0x%08x\n",Status);
                   	            	pc_address_ip=EPC;
                   	    

⌨️ 快捷键说明

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