#include #include #include #include #include #include #include #include "umrbus.h" #include #include "boardaccess.h" #include "trap.h" #include #include #include #include "file.h" #include "run.h" extern UMR_HANDLE addr_handle; extern UMR_HANDLE data1_handle; extern UMR_HANDLE data2_handle; extern UMR_HANDLE reset_handle; extern int buffer_Mask; extern int read_buffer_Adress; void trap_exit() { unsigned long adresse, tmpadr, exitcode; unsigned long readbuffer[2]; adresse=0x208; tmpadr=adresse/8; read_data(&tmpadr,readbuffer); exitcode = readbuffer[0]; printf("programm exited with exit code %lx\n", exitcode); reset(1); printf("Reset set to 1!\n"); } void trap_open() { unsigned long adresse, tmpadr, argument3, flags, mode, result, errorno; unsigned long readbuffer[2], clear, pfadpointer; int i; char *pfad; pfad = malloc(512); adresse=0x208; tmpadr=adresse/8; read_data(&tmpadr,readbuffer); argument3 = readbuffer[0]; pfadpointer = readbuffer[1]; ///Pfadnamen kopieren read_buffer_Adress=-1; for(i=0;i<512;i++){ pfad[i]=read_Byte(pfadpointer+i); } tmpadr++; read_data(&tmpadr,readbuffer); flags = readbuffer[0]; if (argument3) mode = readbuffer[1]; if (argument3) result = open(pfad, flags, mode); else result = open(pfad, flags); printf("open trap: (ret=%lx, errno=%d(%s))\n", result, errno, strerror(errno)); errorno=errno; clear=0x0; adresse=0x208; tmpadr=adresse/8; write_data(&errorno,&errorno,&tmpadr,15); tmpadr--; write_data(&result,&clear,&tmpadr,255); } void trap_close() { unsigned long adresse, tmpadr, filedescriptor, result, errorno; unsigned long readbuffer[2], clear; adresse=0x208; tmpadr=adresse/8; read_data(&tmpadr,readbuffer); filedescriptor = readbuffer[0]; result = close(filedescriptor); printf("close trap: (ret=%lx, errno=%d(%s))\n", result, errno, strerror(errno)); errorno=errno; clear=0x0; adresse=0x208; tmpadr=adresse/8; write_data(&errorno,&errorno,&tmpadr,15); tmpadr--; write_data(&result,&clear,&tmpadr,255); } void trap_read() { unsigned long adresse, tmpadr, filedescriptor, size, result; unsigned long pointer, readbuffer[2], errorno, clear; char *buf; int i, tmpbuf; adresse=0x208; tmpadr=adresse/8; read_data(&tmpadr,readbuffer); filedescriptor = readbuffer[0]; pointer = readbuffer[1]; tmpadr++; read_data(&tmpadr,readbuffer); size = readbuffer[0]; buf = malloc(size); result = read(filedescriptor, buf, size); buffer_Mask=0; flush_Buffer(); for(i=0;i> 3; write_data(&errorno,&errorno,&tmpadr,15); tmpadr--; write_data(&result,&clear,&tmpadr,255); } void trap_interrupt(){ unsigned long adresse=0x430; unsigned long tmpadr, readbuffer[2], help, clear; int interrupt_number, j, select; char* spr_name[9]={"SR","ESR","ECA","EPC","EDPC","EDATA","RM","IEEEf","FCC"}; char* cause_name[12]={"reset","ill","mal","ipf","dpf","trap","ovf","FPUovf","FPUunf","FPUinx","FPUdiv0","FPUunimpl"}; tmpadr = adresse >> 3 ; read_data(&tmpadr,readbuffer); interrupt_number = readbuffer[0]; if ( interrupt_number < 12){ printf("Interrupt no.%d ( %s )occured!\n\n", interrupt_number, cause_name[interrupt_number]);} else { printf(" Unknown Interrupt number %d !\n", interrupt_number);} printf("Registerfile:\n\n"); tmpadr= 0x300 >> 3; for (j=0;j<16;j++) { read_data(&tmpadr,readbuffer); printf("r%d : 0x%08lx \t r%d : 0x%08lx \n",2*j,readbuffer[0],(2*j)+1,readbuffer[1]); tmpadr++;} printf("\n Floatingpoint Registerfile:\n\n"); for (j=0;j<16;j++) { read_data(&tmpadr,readbuffer); printf("f%d : %f \t f%d : %f \n",2*j,*(float*)&readbuffer[0],(2*j)+1,*(float*)&readbuffer[1]); help=readbuffer[0]; readbuffer[0]=readbuffer[1]; readbuffer[1]=help; printf("f%d : %g\n",2*j,*(double*)readbuffer); tmpadr++;} printf("\n Special Registerfile:\n\n"); for (j=0;j<4;j++) { read_data(&tmpadr,readbuffer); printf("%s : 0x%08lx \t %s : 0x%08lx \n",spr_name[2*j],readbuffer[0],spr_name[(2*j)+1],readbuffer[1]); tmpadr++;} read_data(&tmpadr,readbuffer); printf("%s : 0x%08lx \n",spr_name[2*j],readbuffer[0]); fflush(stdin); printf("\n\nReturn für weiter : "); scanf("%i",&select); clear=0x0; adresse=0x208; tmpadr=adresse >> 3; write_data(&clear,&clear,&tmpadr,15); tmpadr--; write_data(&clear,&clear,&tmpadr,255); } void handle_trap(unsigned long trap_id) { int trapno = trap_id; switch(trapno) { case 0: trap_exit(); break; case 1: trap_open(); break; case 2: trap_close(); break; case 3: trap_read(); break; case 4: trap_write(); break; case 5: trap_interrupt(); break; default: printf(" Unknown or unimplemented trap ID 0x%x \n", trapno); break; } }