📄 cp0.c
字号:
#include <stdio.h>
#include "cpu.h"
int Watchhi_G;
int Watchhi_ASID;
exception_answer(){
int i;
char temp_end;
// printf("pc_address_dp=%08x\n",pc_address_dp);
// printf("pc_address_ip=%08x\n",pc_address_ip);
//判断一下这里还是否需要?
/* if((pc_address_ip&(0xfff00000))==0xbfc00000){
// instruction_dp=(pc_ip==0)? instr_out[pc_ip] : instr_out[pc_ip]; //未定
// instruction_ip=instr_out[pc_ip+1];
instruction_dp=icache(pc_address_ip,0);
instruction_ip=icache(pc_address_ip+4,0);
}else if((pc_address_ip&(0xf0000000))==0x90000000){
// instruction_dp=(pc_ip==0)? instr_out_1[pc_ip] : instr_out_1[pc_ip]; //未定
// instruction_ip=instr_out_1[pc_ip+1];
instruction_dp=icache(pc_address_ip,0);
instruction_ip=icache(pc_address_ip+4,0);
}else if((pc_address_ip&(0xfff00000))==0x40400000){
instruction_dp=icache(pc_address_ip,0);
instruction_ip=icache(pc_address_ip+4,0);
}else{
instruction_dp=icache(pc_address_ip,0);
instruction_ip=icache(pc_address_ip+4,0);
// printf("error,pc not in 0xbfc0 or 0x9000 \n");
}*/
/* if(trap_flag){
//永远不会执行,trap已经放入异常中
trap_flag=0;
pc_address_ip=0xbfc00280;
exception_invalid_instr_flag=4;
instruction_dp=(pc_ip==0)? icache(pc_address_ip,0) : icache(pc_address_dp,0);
instruction_ip=(pc_ip==0)? icache(pc_address_ip+4,0) : icache(pc_address_ip,0);
}else{*/
switch(exception_flag)
{case 1 : //Reset
exception_flag=0;
exception_invalid_instr_flag=0;
pc_address_dp=0xbfc00000;
pc_address_ip=0xbfc00004;
pc_dp=0;
pc_ip=1;
Random=15;
CPR[1]=15;
Wired=0;
CPR[6]=0;
if(tlb_fm_flag == 0){
// TLB
Config=0x80050082;
CPR[16]=0x80050082;
}else{
//FM
Config=0xa4050182;
CPR[16]=0xa4050182;
}
Status=Status|(0x00400004);
Status=Status&(0xf7c7ffff);
CPR[12]=Status;
Watchlo=Watchlo&(0xfffffff8);
CPR[18]=Watchlo;
if(branch_flag_wp == 1){
//ErrorEPC=pc_address_wp;
//CPR[30]=pc_address_wp;
ErrorEPC=pc_address_wp - 4;
CPR[30]=pc_address_wp - 4;
}else{
//ErrorEPC=pc_address_mp;
//CPR[30]=pc_address_mp;
ErrorEPC=pc_address_wp;
CPR[30]=pc_address_wp;
}
for(i=0;i<32;i++){
GPR[i]=0;
}
printf("pc_address_dp=%08x\n",pc_address_dp);
printf("pc_address_ip=%08x\n",pc_address_ip);
instruction_dp=icache(pc_address_dp,0);
instruction_ip=icache(pc_address_ip,0);
break;
case 2 : //Soft Reset
exception_flag=0;
exception_invalid_instr_flag=0;
pc_address_dp=0xbfc00000;
pc_address_ip=0xbfc00004;
pc_dp=0;
pc_ip=1;
Status=Status|(0x00500004);
Status=Status&(0xffd7ffff);
CPR[12]=Status;
if(branch_flag_wp == 1){
//ErrorEPC=pc_address_wp;
//CPR[30]=pc_address_wp;
ErrorEPC=pc_address_wp - 4;
CPR[30]=pc_address_wp - 4;
}else{
//ErrorEPC=pc_address_mp;
//CPR[30]=pc_address_mp;
ErrorEPC=pc_address_wp;
CPR[30]=pc_address_wp;
}
for(i=0;i<32;i++){
GPR[i]=0;
}
instruction_dp=icache(pc_address_dp,0);
instruction_ip=icache(pc_address_ip,0);
break;
//case 3 :break;
//case 4 :break;
case 5 : //NMI
exception_flag=0;
exception_invalid_instr_flag=0;
pc_address_dp=0xbfc00000;
pc_address_ip=0xbfc00004;
pc_dp=0;
pc_ip=1;
Status=Status|(0x00480004);
Status=Status&(0xffcfffff);
CPR[12]=Status;
if(branch_flag_wp == 1){
//ErrorEPC=pc_address_wp;
//CPR[30]=pc_address_wp;
ErrorEPC=pc_address_wp - 4;
CPR[30]=pc_address_wp - 4;
}else{
//ErrorEPC=pc_address_mp;
//CPR[30]=pc_address_mp;
ErrorEPC=pc_address_wp;
CPR[30]=pc_address_wp;
}
for(i=0;i<32;i++){
GPR[i]=0;
}
Cause=(Cause&(0xffffff03))|(0x00000000); //Exc Code in Cause is 0
CPR[13]=Cause;
instruction_dp=icache(pc_address_dp,0);
instruction_ip=icache(pc_address_ip,0);
break;
case 6 : // Machine check
exception_flag=0;
exception_invalid_instr_flag=5;
//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))|(0x00000060); //Exc Code in Cause is 24
CPR[13]=Cause;
instruction_dp=instruction_ip;
instruction_ip=icache(pc_address_ip,0);
pc_ip=(pc_address_ip&(0x0000ffff))/4;
break;
case 7 : //Interrupt
// BEV EXL IV
exception_flag=0;
exception_invalid_instr_flag=5;
if((((Status>>22)&(0x00000001)) == 0) && (((Status>>1)&(0x00000001)) == 0) && (((Cause>>23)&(0x00000001)) == 0)){
pc_address_ip=0x80000180;
}else if((((Status>>22)&(0x00000001)) == 0) && (((Status>>1)&(0x00000001)) == 0) && (((Cause>>23)&(0x00000001)) == 1)){
pc_address_ip=0x80000200;
}else if((((Status>>22)&(0x00000001)) == 1) && (((Status>>1)&(0x00000001)) == 0) && (((Cause>>23)&(0x00000001)) == 0)){
pc_address_ip=0xbfc00380;
}else if((((Status>>22)&(0x00000001)) == 1) && (((Status>>1)&(0x00000001)) == 0) && (((Cause>>23)&(0x00000001)) == 1)){
pc_address_ip=0xbfc00400;
}else{
// Interrupt is disabled
pc_address_ip=pc_address_ip + 4;
}
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -