// ************************************************************************** // ************************************************************************** // vma <a> int P4_vmaccess(int argc, char* argv[]) { unsigned short int adr, rpt, upt; adr = INTEGER(argv[1]); printf(" = %04x", getMemAdr(adr, 1)-&MEMWORD(0)); printf("\nRPTI:%d(0x%x) UPTI:%d(0x%x) OFFSET:%d(0x%x)", RPTI(adr)/2, RPTI(adr), UPTI(adr)/2, UPTI(adr), FRAMEOFFSET(adr), FRAMEOFFSET(adr)); for (rpt = 0; rpt < 64; rpt+=2) { if (MEMWORD(rpt+TASK_RPT) || MEMWORD(rpt+TASK_RPT+1)) { outPTE(" RPT =", rpt+TASK_RPT); for(upt = 0; upt < 64; upt+=2) { if (DEFINED(MEMWORD(rpt+TASK_RPT)) && (DEFINED(MEMWORD((FRAME(MEMWORD(rpt+TASK_RPT))<<6)+upt)) || PAGED(MEMWORD((FRAME(MEMWORD(rpt+TASK_RPT))<<6)+upt+1)))) { outPTE(" UPT=", (FRAME(MEMWORD(rpt+TASK_RPT))<<6)+upt); } } } } printf("\nPages = %d", nextPage); return 0; } // end P4_vmaccess
// ************************************************************************** // ************************************************************************** // vma <a> int P4_vmaccess(int argc, char* argv[]) { unsigned short int adr, rpt, upt; printf("\nValidate arguments..."); // ?? validate arguments adr = INTEGER(argv[1]); printf(" = %04x", getMemAdr(adr, 1)-&MEMWORD(0)); for (rpt = 0; rpt < 64; rpt+=2) { if (MEMWORD(rpt+TASK_RPT) || MEMWORD(rpt+TASK_RPT+1)) { outPTE(" RPT =", rpt+TASK_RPT); for(upt = 0; upt < 64; upt+=2) { if (DEFINED(MEMWORD(rpt+TASK_RPT)) && (DEFINED(MEMWORD((FRAME(MEMWORD(rpt+TASK_RPT))<<6)+upt)) || PAGED(MEMWORD((FRAME(MEMWORD(rpt+TASK_RPT))<<6)+upt+1)))) { outPTE(" UPT=", (FRAME(MEMWORD(rpt+TASK_RPT))<<6)+upt); } } } } printf("\nPages = %d", nextPage); return 0; } // end P4_vmaccess
// ************************************************************************** // ************************************************************************** // set frames available from sf to ef // flg = 0 -> clear all others // = 1 -> just add bits // void setFrameTableBits(int flg, int sf, int ef) { int i, data; int adr = LC3_FBT-1; // index to frame bit table int fmask = 0x0001; // bit mask // 1024 frames in LC-3 memory for (i=0; i<LC3_FRAMES; i++) { if (fmask & 0x0001) { fmask = 0x8000; adr++; data = (flg)?MEMWORD(adr):0; } else fmask = fmask >> 1; // allocate frame if in range if ( (i >= sf) && (i < ef)) data = data | fmask; MEMWORD(adr) = data; } return; } // end setFrameTableBits
// ************************************************************************** // ************************************************************************** // look at virtual memory location va void lookVM(int va) { unsigned short int rpte1, rpte2, upte1, upte2, pa; // get root page table entry rpte1 = MEMWORD(LC3_RPT + RPTI(va)); rpte2 = MEMWORD(LC3_RPT + RPTI(va) + 1); if (DEFINED(rpte1)) { upte1 = MEMWORD((FRAME(rpte1)<<6) + UPTI(va)); upte2 = MEMWORD((FRAME(rpte1)<<6) + UPTI(va) + 1); } else { // rpte undefined printf("\n RTB[Undefined]"); return; } if (DEFINED(upte1)) { pa = (FRAME(upte1)<<6) + FRAMEOFFSET(va); } else { // upte undefined printf("\n UTB[Undefined]"); return; } printf("\n RPT[0x%04x] = %04x %04x", LC3_RPT + RPTI(va), rpte1, rpte2); if (rpte1&BIT_14_MASK) printf(" D"); if (rpte1&BIT_13_MASK) printf(" R"); if (rpte1&BIT_12_MASK) printf(" P"); printf(" Frame=%d", rpte1&0x03ff); if (DEFINED(rpte2)) printf(" Page=%d", rpte2&0x0fff); printf("\n UPT[0x%04x] = %04x %04x", (FRAME(rpte1)<<6) + UPTI(va), upte1, upte2); if (upte1&BIT_14_MASK) printf(" D"); if (upte1&BIT_13_MASK) printf(" R"); if (upte1&BIT_12_MASK) printf(" P"); printf(" Frame=%d", upte1&0x03ff); if (DEFINED(upte2)) printf(" Page=%d", upte2&0x0fff); printf("\n MEM[0x%04x] = %04x", pa, MEMWORD(pa)); return; } // end lookVM
// ************************************************************************** // get frame from frame bit table (else return -1) int getAvailableFrame() { int i, data; int adr = LC3_FBT - 1; // index to frame bit table int fmask = 0x0001; // bit mask for (i=0; i<LC3_FRAMES; i++) // look thru all frames { if (fmask & 0x0001) { fmask = 0x8000; // move to next word adr++; data = MEMWORD(adr); } else fmask = fmask >> 1; // next frame // deallocate frame and return frame # if (data & fmask) { MEMWORD(adr) = data & ~fmask; return i; } } return -1; } // end getAvailableFrame
// ************************************************************************** // ************************************************************************** // dm <sa> <ea> - dump lc3 memory void dumpMemory(char *s, int sa, int ea) { int i, ma; printf("\n%s", s); for (ma = sa; ma < ea;) { printf("\n0x%04x:", ma); for (i=0; i<8; i++) { printf(" %04x", MEMWORD((ma+i))); } ma+=8; } return; } // end dumpMemory
// ************************************************************************** // ************************************************************************** // display contents of UPT void displayUPT(int rptNum, int uptNum) { unsigned short int rpte, upt, upte1, upte2, uptba; rptNum &= BITS_3_0_MASK; uptNum &= BITS_4_0_MASK; // index to process <rptNum>'s rpt + <uptNum> index rpte = MEMWORD(((LC3_RPT + (rptNum<<6)) + uptNum*2)); // calculate upt's base address uptba = uptNum<<11; if (!DEFINED(rpte)) return; printf("\nUser Page Table %d", FRAME(rpte)); upt = FRAME(rpte)<<6; displayPT(upt, uptba, 1<<6); return; } // end displayUPT
void dump_rpt_and_upt() { int rpt, upt; for (rpt = 0; rpt < 64; rpt+=2) { if (MEMWORD(rpt+TASK_RPT) || MEMWORD(rpt+TASK_RPT+1)) { outPTE(" RPT =", rpt+TASK_RPT); for(upt = 0; upt < 64; upt+=2) { if (DEFINED(MEMWORD(rpt+TASK_RPT)) &&(DEFINED(MEMWORD((FRAME(MEMWORD(rpt+TASK_RPT))<<6)+upt)) || PAGED(MEMWORD((FRAME(MEMWORD(rpt+TASK_RPT))<<6)+upt+1)))) { outPTE(" UPT=", (FRAME(MEMWORD(rpt+TASK_RPT))<<6)+upt); } } } } }