/* * trap.c * $Id: trap.c,v 1.15 2005/01/28 16:12:46 obi Exp $ * Christoph Berg * * 011213 */ // TODO open call has to translate the flags from VAMP flags to host flags! #include #include #include #include #include #include "dlx.h" #include "trap.h" void trap_exit() { int *cp; cp = (int *)(state.memory + TRAP_MEMLOC + 0x08); state.stopflag = 1; printf(" Program exited with exit code %d\n", *cp); cp = (int *)(state.memory + TRAP_MEMLOC); *cp++ = 0; } void trap_open() { int *cp, arg3, flags, mode, res; char *path; cp = (int *)(state.memory + TRAP_MEMLOC + 0x08); arg3 = *cp++; path = (char *)(state.memory + *cp++); flags = *cp++; if(arg3) // third argument given mode = *cp++; if(arg3) { res = open(path, flags, mode); printf(" open(\"%s\",%d,%d) = %d\n", path, flags, mode, res); } else { res = open(path, flags); printf(" open(\"%s\",%d) = %d\n", path, flags, res); } if( res==-1 ) printf(" errno = %d (`%s')\n", errno, strerror(errno)); cp = (int *)(state.memory + TRAP_MEMLOC); *cp++ = 0; *cp++ = res; *cp++ = errno; } void trap_close() { int *cp, fd, res; cp = (int *)(state.memory + TRAP_MEMLOC + 0x08); fd = *cp++; res = close(fd); printf(" close(%d) = %d\n", fd, res ); if( res==-1 ) printf(" errno = %d (`%s')\n", errno, strerror(errno)); cp = (int *)(state.memory + TRAP_MEMLOC); *cp++ = 0; *cp++ = res; *cp++ = errno; } void trap_read() { int *cp, fd, size, res; char *buf; cp = (int *)(state.memory + TRAP_MEMLOC + 0x08); fd = *cp; cp++; buf = (char *)(state.memory + *cp); cp++; size = *cp; res = read(fd, buf, size); if (state.tracetrap) { printf(" read(%d,%p,%d) = %d\n", fd, buf, size, res); } if( res==-1 ) printf(" errno = %d (`%s')\n", errno, strerror(errno)); cp = (int *)(state.memory + TRAP_MEMLOC); *cp = 0; cp++; *cp = res; cp++; *cp = errno; } void trap_write() { int *cp, fd, size, res; char *buf; cp = (int *)(state.memory + TRAP_MEMLOC + 0x08); fd = *cp; cp++; buf = (char *)(state.memory + *cp); cp++; size = *cp; res = write(fd, buf, size); if (state.tracetrap) { printf(" write(%d,%p,%d) = %d\n", fd, buf, size, res); } if( res==-1 ) printf(" errno = %d (`%s')\n", errno, strerror(errno)); cp = (int *)(state.memory + TRAP_MEMLOC); *cp = 0; cp++; *cp = res; cp++; *cp = errno; } void trap_interrupt() { int *cp; cp = (int *)(state.memory + 0x430); printf(" Interrupt number %d occurred!\n", *cp ); } void trap_lseek() { int *cp; int fd, offset, whence; int res; cp = (int *)(state.memory + TRAP_MEMLOC + 0x08); fd = *cp++; offset = *cp++; whence = *cp++; res = lseek(fd,offset,whence); if (state.tracetrap) { printf(" lseek(%d,%d,%d) = %d\n", fd,offset,whence,res); } if( res==-1 ) printf(" errno = %d (`%s')\n", errno, strerror(errno)); cp = (int *)(state.memory + TRAP_MEMLOC); *cp++ = 0; *cp++ = res; *cp = errno; } void dlx_host_trap() { int trapno = state.memory[TRAP_MEMLOC + 4]; if (state.tracetrap) { printf(" Trap ID 0x%x at dpc=0x%x.\n", trapno, state.dpc); } switch(trapno) { case 0: state.stopflag |= STOP_TRAP_EXIT; trap_exit(); break; case 1: state.stopflag |= STOP_TRAP_OPEN; trap_open(); break; case 2: state.stopflag |= STOP_TRAP_CLOSE; trap_close(); break; case 3: state.stopflag |= STOP_TRAP_READ; trap_read(); break; case 4: state.stopflag |= STOP_TRAP_WRITE; trap_write(); break; case 5: state.stopflag |= STOP_TRAP_INTERRUPT; trap_interrupt(); break; case 6: // state.stopflag |= STOP_TRAP_INTERRUPT; trap_lseek(); break; default: printf(" Unknown trap ID 0x%x at dpc=0x%x.\n", trapno, state.dpc); break; } if (state.tracetrap) { printf("\n"); } }