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

📄 cache.c

📁 32cpu的代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	           printf("read_invalidate_flag error when call dcache function!\n");
	       }
	}


long load_data(unsigned long virtual_addr,unsigned data_width){
//	if(icache_data[(virtual_addr>>4)&(0x000000ff)].valid != 1){
//		
//	}else{
//	
//	}

        int  i, load_flag;
        long  data_out;
        long  data_in;
        load_flag=0;
	    if((data_width == 2)&&((virtual_addr&(0x00000001)) != 0)){
	  	    exception_flag_mp=22; 
	  	    Badvaddr=virtual_addr;
	  	    CPR[8]=Badvaddr;
		                    ErrorEPC=pc_address_mp;
		                    EPC=pc_address_mp;
		                    CPR[30]=pc_address_mp;
		                    CPR[14]=pc_address_mp;
	       }
/*	     if((data_width == 4)&&((virtual_addr&(0x00000003)) != 0)){
	  	    Badvaddr=virtual_addr;
	  	    CPR[8]=Badvaddr;
		    exception_flag_mp=22; 
		                    ErrorEPC=pc_address_mp;
		                    EPC=pc_address_mp;
		                    CPR[30]=pc_address_mp;
		                    CPR[14]=pc_address_mp;
		}*/
    if((virtual_addr >= 0xa0000000)&&(virtual_addr <= 0xbfffffff)){
    	//uncache address
                       sysad_addr=addr_translate(virtual_addr,1);
                       biu(0);
                     if((virtual_addr&(0x0000000c)) == 0){
                     	data_out=sysad_data[0];
                     	//printf("   data_out=%08x\n",data_out);
                     	load_flag=1;
                     }else if((virtual_addr&(0x0000000c)) == 4){
                     	data_out=sysad_data[1];
                     	load_flag=1;
                     }else if((virtual_addr&(0x0000000c)) == 8){
                     	data_out=sysad_data[2];
                     	load_flag=1;
                     }else if((virtual_addr&(0x0000000c)) == 12){
                     	data_out=sysad_data[3];
                     	load_flag=1;
                     }else{

                      printf("load unexist data\n");
			//		  printf("ttt%08x\n",virtual_addr&(0x0000000c));
                     }
    	
    	
    }else{
       //cache address
       
              if((dcache_data[(unsigned long)(virtual_addr>>4)&(0x000000ff)].pa == ((addr_translate(virtual_addr,1)>>12)&(0x000fffff)))&&(dcache_data[(unsigned long)(virtual_addr>>4)&(0x000000ff)].valid == 15)){
	         printf("dcache hit!  0x%08x \n",virtual_addr);
	          if((virtual_addr&(0x0000000c)) == 0x00000000){
        	     data_out=dcache_data[((virtual_addr>>4)&(0x000000ff))].word0;
        	     #ifdef DEBUG
        	     printf("data_out=%08x\n",data_out);
        	     #endif
        	     load_flag=1;
                  }else if((virtual_addr&(0x0000000c)) == 0x00000004){
        	     data_out=dcache_data[(virtual_addr>>4)&(0x000000ff)].word1;
        	     load_flag=1;	
                  }else if((virtual_addr&(0x0000000c)) == 0x00000008){
        	     data_out=dcache_data[(virtual_addr>>4)&(0x000000ff)].word2;
        	     load_flag=1;	
                  }else if((virtual_addr&(0x0000000c)) == 0x0000000c){
        	     data_out=dcache_data[(virtual_addr>>4)&(0x000000ff)].word3;
        	     load_flag=1;
                  }else{
                     printf("load unexist data\n");
                  }
                  printf("data_out=%08x\n",data_out);
                	             
               }else{
                 printf("dcache miss!  0x%08x \n",virtual_addr);
                       sysad_addr=addr_translate(virtual_addr,1);
                       biu(0);
                       #ifdef DEBUG
                       printf("sysad_data[0]=%08x\n",sysad_data[0]);
                       printf("%08x\n%08x\n%08x\n%08x\n%08x\n",sysad_addr,sysad_data[0],sysad_data[1],sysad_data[2],sysad_data[3]);
                       #endif
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].word0=sysad_data[0];
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].word1=sysad_data[1];
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].word2=sysad_data[2];
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].word3=sysad_data[3];
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].pa=((addr_translate(virtual_addr,1)>>12)&(0x000fffff));
           	       dcache_data[(virtual_addr>>4)&(0x000000ff)].valid=15;
                     if((virtual_addr&(0x0000000c)) == 0){
                     	data_out=sysad_data[0];
                     	load_flag=1;
                     }else if((virtual_addr&(0x0000000c)) == 4){
                     	data_out=sysad_data[1];
                     	load_flag=1;
                     }else if((virtual_addr&(0x0000000c)) == 8){
                     	data_out=sysad_data[2];
                     	load_flag=1;
                     }else if((virtual_addr&(0x0000000c)) == 12){
                     	data_out=sysad_data[3];
                     	load_flag=1;
                     }else{

                      printf("load unexist data\n");
			//		  printf("ttt%08x\n",virtual_addr&(0x0000000c));
                     }
                     
           }
       
     }
        

        
fprintf(sysad_trace_fp,"0x%x\t0x%08x\t0x%08x\n",pc_address_mp,addr_translate(virtual_addr,1),data_out);      

        if(load_flag){
        	 data_in=data_out;
                 data_out=load_align(virtual_addr,data_in,data_width);
                 
        	     return(data_out);
        }else{
            printf("load unexist data! \n");
        }

}

long store_data(unsigned long virtual_addr,long data_in,unsigned data_width){

        int  i,j, store_flag;
        long  data_out;
        long  data_old_in;
          if(tlb_dirty_bit_flag == 1){
          	   exception_flag_mp=26;
          	}
        store_flag=0;
        sysad_addr=addr_translate(virtual_addr,1);
                biu(0);
                #ifdef DEBUG
                     printf("%08x\n%08x\n%08x\n%08x\n%08x\n",sysad_addr,sysad_data[0],sysad_data[1],sysad_data[2],sysad_data[3]);
                  #endif
	    if((data_width == 2)&&((virtual_addr&(0x00000001)) != 0)){
	  	    exception_flag_mp=23; 
	  	    Badvaddr=virtual_addr;
	  	    CPR[8]=Badvaddr;
		                    ErrorEPC=pc_address_mp;
		                    EPC=pc_address_mp;
		                    CPR[30]=pc_address_mp;
		                    CPR[14]=pc_address_mp;
	       }
/*	     if((data_width == 4)&&((virtual_addr&(0x00000003)) != 0)){
	  	    Badvaddr=virtual_addr;
	  	    CPR[8]=Badvaddr;
		    exception_flag_mp=23;
		                    ErrorEPC=pc_address_mp;
		                    EPC=pc_address_mp;
		                    CPR[30]=pc_address_mp;
		                    CPR[14]=pc_address_mp; 
		}*/
        if((virtual_addr&(0x0000000c)) == 0){
        	data_out=sysad_data[0];
        }else if((virtual_addr&(0x0000000c)) == 4){
        	data_out=sysad_data[1];	
        }else if((virtual_addr&(0x0000000c)) == 8){
        	data_out=sysad_data[2];	
        }else if((virtual_addr&(0x0000000c)) == 12){
        	data_out=sysad_data[3];
        }else{
         printf("store unexist data\n");
        }
//fprintf(sysad_trace_fp,"0x%x\t0x%08x\t0x%08x\n",pc_address_mp,addr_translate(virtual_addr,1),data_in); 
                    data_old_in=data_out;
               data_out=store_align(virtual_addr,data_in,data_old_in,data_width);

fprintf(sysad_trace_fp,"0x%x\t0x%08x\t0x%08x\n",pc_address_mp,addr_translate(virtual_addr,1),data_out); 
                             //    printf("%08x\n%08x\n%08x\n%08x\n%08x\n",sysad_addr,sysad_data[0],sysad_data[1],sysad_data[2],sysad_data[3]);

 //              printf("%08x\n%08x\n%08x\n%08x\n%08x\n",sysad_addr,sysad_data[0],sysad_data[1],sysad_data[2],sysad_data[3]);
        if((virtual_addr&(0x0000000c)) == 0){
        	sysad_data[0]=data_out;
        }else if((virtual_addr&(0x0000000c)) == 4){
        	sysad_data[1]=data_out;	
        }else if((virtual_addr&(0x0000000c)) == 8){
        	sysad_data[2]=data_out;	
        }else if((virtual_addr&(0x0000000c)) == 12){
        	sysad_data[3]=data_out;
        }else{
         printf("store unexist data\n");
        }
            #ifdef DEBUG
                 printf("%08x\n%08x\n%08x\n%08x\n%08x\n",sysad_addr,sysad_data[0],sysad_data[1],sysad_data[2],sysad_data[3]);
            #endif
         sysad_addr=addr_translate(virtual_addr,1);
           biu(1);  
//           printf("8888888888888888888888888888888888888888888888888888\n");
           if((virtual_addr < (unsigned long)(0xa0000000))||(virtual_addr > (unsigned long)(0xbfffffff))){
//printf("8888888888888888888888888888888888888888888888888888\n");
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].word0=sysad_data[0];
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].word1=sysad_data[1];
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].word2=sysad_data[2];
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].word3=sysad_data[3];
                       dcache_data[(virtual_addr>>4)&(0x000000ff)].pa=((addr_translate(virtual_addr,1)>>12)&(0x000fffff));
           	       dcache_data[(virtual_addr>>4)&(0x000000ff)].valid=15; 
                       #ifdef DEBUG
                       printf("dcache_data[(virtual_addr>>4)&(0x000000ff)].pa=%08x",((addr_translate(virtual_addr,1)>>12)&(0x000fffff)));
           	       #endif
           	}
           
                #ifdef DEBUG
                  printf("%08x\n%08x\n%08x\n%08x\n%08x\n",sysad_addr,sysad_data[0],sysad_data[1],sysad_data[2],sysad_data[3]);
                #endif
     return(data_out);
}

//unsigned long addr_translate(unsigned long virtual_addr){
//	return(virtual_addr);
//	}

⌨️ 快捷键说明

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