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

📄 mmu.c

📁 32cpu的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
extern   long Index;
extern   long Random;
extern   long Entrylo0;
extern   long Entrylo1;
extern   long Context;
extern   long Pagemask;
extern   long Wired;
extern   long Badvaddr;
extern   long Count;
extern   long Entryhi;
extern   long Compare;
extern   long Status;
extern   long Cause;
extern   long EPC;
extern   long Processor_Identification;
extern   long Config;
extern   long Config1;
extern   long Load_Linked_Address;
extern   long Watchlo;
extern   long Watchhi;
extern   long Errctl;
extern   long Taglo;
extern   long Datalo;
extern   long ErrorEPC;
extern   long Desave;
extern long GPR[32],CPR[34];
extern int branch_flag_wp;
extern  int  ERL,tlb_fm_flag,exception_flag_mp,exception_flag_ip,pc_address_mp,pc_address_wp,pc_address_ip;
unsigned long tlb_addr_translate(unsigned long virtual_addr,unsigned instr_data_flag);
unsigned long	fm_addr_translate(unsigned long virtual_addr);
int  tlb_dirty_bit_flag;  //use in cause tlb mod exception

struct jtlb_data
{
   unsigned vpn2 : 19;
   unsigned g : 1;
   unsigned asid : 8;
   unsigned v : 1;
   unsigned pfn0 : 20;
   unsigned c0 : 3;
   unsigned d0 : 1;
   unsigned v0 : 1;
   unsigned pfn1 : 20;
   unsigned c1 : 3;
   unsigned d1 : 1;
   unsigned v1 : 1;
}jtlb[16];

struct dtlb_data
{
  unsigned vpn : 20;
  unsigned g : 1;
  unsigned asid : 8;
  unsigned pfn : 20;
  unsigned c_n : 3;
  unsigned d : 1;
  unsigned v : 1;
}dtlb[3];

struct itlb_data
{
  unsigned vpn : 20;
  unsigned g : 1;
  unsigned asid : 8;
  unsigned pfn : 20;
  unsigned c_n : 3;
  unsigned d : 1;
  unsigned v : 1;
}itlb[3];
void mmu_machine_check(unsigned tlb_instr_flag)
{  
	unsigned long i,match_flag; 
	long check_temp_data;
	match_flag=0;   
	switch(tlb_instr_flag)
	{case 8 :    printf("tlbp\n");        //tlbp
	         match_flag=0;
	         check_temp_data=(Entryhi>>13)&(0x0007ffff);
	         for(i=0;i<16;i++){
	         	if((jtlb[i].vpn2 == check_temp_data) && ((jtlb[i].g == 1) || (jtlb[i].asid == (Entryhi&(0x000000ff))))){
	         		    match_flag=match_flag + 1;
	         		}
	         	}
	         if((match_flag >= 1)&&(i != Index)){
	         	exception_flag_mp=6;   //Machine check exception
	         	           if(branch_flag_wp == 1){
		                      ErrorEPC=pc_address_wp;
		                      EPC=pc_address_wp;
		                      CPR[30]=pc_address_wp;
		                      CPR[14]=pc_address_wp;
	         	           }else{
		                      ErrorEPC=pc_address_mp;
		                      EPC=pc_address_mp;
		                      CPR[30]=pc_address_mp;
		                      CPR[14]=pc_address_mp;
	         	           }
	         	}
	             break;
	 case 1 :   printf("tlbr\n");    //tlbr
	 	    if((Index<0) || (Index>=16) || (jtlb[Index].v == 0)){
	 	    	         exception_flag_mp=24;
	         	           if(branch_flag_wp == 1){
		                      ErrorEPC=pc_address_wp;
		                      EPC=pc_address_wp;
		                      CPR[30]=pc_address_wp;
		                      CPR[14]=pc_address_wp;
	         	           }else{
		                      ErrorEPC=pc_address_mp;
		                      EPC=pc_address_mp;
		                      CPR[30]=pc_address_mp;
		                      CPR[14]=pc_address_mp;
	         	           }
	 	    	}  
	            break;
	 case 2 :  printf("tlbwi\n");   //tlwi
	         match_flag=0;
	         check_temp_data=(Entryhi>>13)&(0x0007ffff);
	         for(i=0;i<16;i++){
	         	match_flag=0;
	         	if(jtlb[i].vpn2 == check_temp_data){
	         		    match_flag=1;
	         		    break;
	         		}
	                if((match_flag == 1)&&(i != Index)){
	         	       exception_flag_mp=6;
	         	           if(branch_flag_wp == 1){
		                      ErrorEPC=pc_address_wp;
		                      EPC=pc_address_wp;
		                      CPR[30]=pc_address_wp;
		                      CPR[14]=pc_address_wp;
	         	           }else{
		                      ErrorEPC=pc_address_mp;
		                      EPC=pc_address_mp;
		                      CPR[30]=pc_address_mp;
		                      CPR[14]=pc_address_mp;
	         	           }
	         	    }
	         		
	         	}
	         break;
	 case 6 :printf("\n\ntlbwr\n\n");  //tlwr
	         match_flag=0;
	         check_temp_data=(Entryhi>>13)&(0x0007ffff);
	         for(i=0;i<16;i++){
	         	match_flag=0;
	         	if(jtlb[i].vpn2 == check_temp_data){
	         		    match_flag=1;
	         		    break;
	         		}
	                if((match_flag == 1)&&(i != Random)){
	         	       exception_flag_mp=6;
	         	           if(branch_flag_wp == 1){
		                      ErrorEPC=pc_address_wp;
		                      EPC=pc_address_wp;
		                      CPR[30]=pc_address_wp;
		                      CPR[14]=pc_address_wp;
	         	           }else{
		                      ErrorEPC=pc_address_mp;
		                      EPC=pc_address_mp;
		                      CPR[30]=pc_address_mp;
		                      CPR[14]=pc_address_mp;
	         	           }
;
	         	    }
	         		
	         	}
	         break;
	    default: printf("tlb instruction type in mmu error!\n");
		}
	
/*	
	if(ERL == 0){
		 //jtlb  0x40000000  to    0xc0000000
	   
         }else if(ERL == 1){
	        //jtlb  0x00000000  to    0x80000000
         }else{
         printf("ERL=%d, The value is error!\n",ERL);
         }
*/
}


void mmu(unsigned tlb_instr_flag)
{  
	unsigned long i,match_flag; 
	long temp_data;
	char  temp_end;
	match_flag=0;   
	switch(tlb_instr_flag)
	{case 8 :    printf("tlbp\n");        //tlbp
	          Index=Index|(0x80000000);
	          for(i=0;i<16;i++){
	          	//if(((Entryhi>>13)&(0x0007ffff)) == jtlb[i].vpn2){
	          	if((((Entryhi>>13)&(0x0007ffff)) == jtlb[i].vpn2)&&((Entryhi&(0x000000ff)) == jtlb[i].asid)){
	          		Index=i;
	          		match_flag=1;
	          		//break;
	          	    }
	          	}
	         break;
	 case 1 :  printf("tlbr\n");    //tlbr
	         //read to  Entryhi register

	                 temp_data=jtlb[Index].asid;
        	         Entryhi=temp_data&(0x000000ff);
        	         temp_data=jtlb[Index].vpn2;
        	         temp_data=(temp_data<<13)&(0xffffe000);
        	         Entryhi=Entryhi|temp_data;
        	         Entryhi=Entryhi&(0xffffe0ff);
        	         //read to  Entrylo0 register
        	         temp_data=jtlb[Index].pfn0;
        	         temp_data=(temp_data<<6)&(0x03ffffc0);
        	         Entrylo0=temp_data;
        	         temp_data=jtlb[Index].c0;
        	         temp_data=(temp_data<<3)&(0x00000038);
        	         temp_data=(jtlb[Index].d0 == 1)? (temp_data|(0x00000004)):(temp_data&(0xfffffffb));
        	         temp_data=(jtlb[Index].v0 == 1)? (temp_data|(0x00000002)):(temp_data&(0xfffffffd));
        	         temp_data=(jtlb[Index].g == 1)? (temp_data|(0x00000001)):(temp_data&(0xfffffffe));
        	         Entrylo0=Entrylo0|(temp_data&(0x0000003f));
        	         //read to  Entrylo1 register
        	         temp_data=jtlb[Index].pfn1;
        	         temp_data=(temp_data<<6)&(0x03ffffc0);
        	         Entrylo1=temp_data;
        	         temp_data=jtlb[Index].c1;
        	         temp_data=(temp_data<<3)&(0x00000038);
        	         temp_data=(jtlb[Index].d1 == 1)? (temp_data|(0x00000004)):(temp_data&(0xfffffffb));
        	         temp_data=(jtlb[Index].v1 == 1)? (temp_data|(0x00000002)):(temp_data&(0xfffffffd));
        	         temp_data=(jtlb[Index].g == 1)? (temp_data|(0x00000001)):(temp_data&(0xfffffffe));
        	         Entrylo1=Entrylo1|(temp_data&(0x0000003f));
        	         Pagemask=0;
	         break;
	 case 2 :  printf("tlbwi\n");   //tlwi

	                  jtlb[Index].vpn2=(Entryhi>>13)&(0x0007ffff);
	                  jtlb[Index].g=(((Entrylo0&(0x00000001))&(Entrylo0&(0x00000001))) == 1)? 1 : 0;
	                  jtlb[Index].asid=Entryhi&(0x000000ff);
	                  jtlb[Index].v=1;
	                  jtlb[Index].pfn0=(Entrylo0>>6)&(0x000fffff);
	                  jtlb[Index].c0=(Entrylo0>>3)&(0x00000007);
	                  jtlb[Index].d0=(Entrylo0>>2)&(0x00000001);
	                  jtlb[Index].v0=(Entrylo0>>1)&(0x00000001);
	                  jtlb[Index].pfn1=(Entrylo1>>6)&(0x000fffff);
	                  jtlb[Index].c1=(Entrylo1>>3)&(0x00000007);
	                  jtlb[Index].d1=(Entrylo1>>2)&(0x00000001);
	                  jtlb[Index].v1=(Entrylo1>>1)&(0x00000001);
	                  itlb[0].v=0;
	                  itlb[1].v=0;
	                  itlb[2].v=0;
	                  dtlb[0].v=0;
	                  dtlb[1].v=0;
	                  dtlb[2].v=0;
                //use in debug 
                #ifdef DEBUG
	        printf("Entryhi=%08x\n",Entryhi);
	        printf("jtlb[Index].vpn2=%x  Index=%08x  jtlb[Index].pfn0=%x\n",jtlb[Index].vpn2,Index,jtlb[Index].pfn0);
	        #endif
	         break;
	 case 6 :printf("\n\ntlbwr\n\n");  //tlwr

	                  jtlb[Random].vpn2=(Entryhi>>13)&(0x0007ffff);
	                  jtlb[Random].g=(((Entrylo0&(0x00000001))&(Entrylo0&(0x00000001))) == 1)? 1 : 0;
	                  jtlb[Random].asid=Entryhi&(0x000000ff);
	                  jtlb[Random].v=1;
	                  jtlb[Random].pfn0=(Entrylo0>>6)&(0x000fffff);
	                  jtlb[Random].c0=(Entrylo0>>3)&(0x00000007);
	                  jtlb[Random].d0=(Entrylo0>>2)&(0x00000001);
	                  jtlb[Random].v0=(Entrylo0>>1)&(0x00000001);
	                  jtlb[Random].pfn1=(Entrylo1>>6)&(0x000fffff);
	                  jtlb[Random].c1=(Entrylo1>>3)&(0x00000007);
	                  jtlb[Random].d1=(Entrylo1>>2)&(0x00000001);

⌨️ 快捷键说明

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