📄 cache.c
字号:
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 + -