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

📄 cp0.c

📁 32cpu的代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			           	                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))|(0x00000000);   //Exc Code  in Cause is 0
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	          break;
                   	  //case 8 :break;
                   	  //case 9 :break;
                   	  case 10 :  //Watch  instr
                   	            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))|(0x0000005c);   //Exc Code  in Cause is 23
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4;  
                   	             break;
                   	  case 11 :  //AdEl   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))|(0x00000010);   //Exc Code  in Cause is 4
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	           break;
                   	  case 12 :   //TLBL
                   	          exception_flag=0;
                   	          exception_invalid_instr_flag=5;
                   	          Entryhi=Entryhi;  //需要在异常发生时设置
                   	          Badvaddr=Badvaddr; //需要在异常发生时设置
                   	          Context=(Context&(0xff80000f))|((Entryhi>>9)&(0x007ffff0));
                   	          Cause=Cause|(0x00000008); //set exccode  每一种不同
                   	          Cause=Cause&(0xcfffffff); //set ce
                   	          CPR[10]=Entryhi;
                   	          CPR[4]=Context;
                   	          CPR[13]=Cause;
                   	          CPR[8]=Badvaddr;
                   	    //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))|(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 13 :   //IBE   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))|(0x00000018);   //Exc Code  in Cause is 6
			            CPR[13]=Cause;
                   	            instruction_dp=instruction_ip; 
                   	            instruction_ip=icache(pc_address_ip,0);
                   	            pc_ip=(pc_address_ip&(0x0000ffff))/4; 
                   	           break;
                   	  //case 14 :break;
                   	  case 15 :  //SYS   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;

⌨️ 快捷键说明

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