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