void prefetch_abort_handler(struct trapframe *tf) { vaddr_t pc; struct proc *p; struct lwp *l; /* Enable interrupts if they were enabled before the trap. */ if ((tf->tf_r15 & R15_IRQ_DISABLE) == 0) int_on(); /* * XXX Not done yet: * Check if the page being requested is already present. If * so, call the undefined instruction handler instead (ARM3 ds * p15). */ uvmexp.traps++; l = curlwp; if (l == NULL) l = &lwp0; p = l->l_proc; if ((tf->tf_r15 & R15_MODE) == R15_MODE_USR) { l->l_addr->u_pcb.pcb_tf = tf; LWP_CACHE_CREDS(l, p); } if ((tf->tf_r15 & R15_MODE) != R15_MODE_USR) { #ifdef DDB db_printf("Prefetch abort in kernel mode\n"); kdb_trap(T_FAULT, tf); #else #ifdef DEBUG printf("Prefetch abort:\n"); printregs(tf); #endif panic("prefetch abort in kernel mode"); #endif } /* User-mode prefetch abort */ pc = tf->tf_r15 & R15_PC; do_fault(tf, l, &p->p_vmspace->vm_map, pc, VM_PROT_EXECUTE); userret(l); }
void prefetch_abort_handler(struct trapframe *tf) { struct lwp * const l = curlwp; struct proc * const p = l->l_proc; /* Enable interrupts if they were enabled before the trap. */ if ((tf->tf_r15 & R15_IRQ_DISABLE) == 0) int_on(); /* * XXX Not done yet: * Check if the page being requested is already present. If * so, call the undefined instruction handler instead (ARM3 ds * p15). */ curcpu()->ci_data.cpu_ntrap++; if (TRAP_USERMODE(tf)) { lwp_settrapframe(l, tf); LWP_CACHE_CREDS(l, p); } else { #ifdef DDB db_printf("Prefetch abort in kernel mode\n"); kdb_trap(T_FAULT, tf); #else #ifdef DEBUG printf("Prefetch abort:\n"); printregs(tf); #endif panic("prefetch abort in kernel mode"); #endif } /* User-mode prefetch abort */ vaddr_t pc = tf->tf_r15 & R15_PC; do_fault(tf, l, &p->p_vmspace->vm_map, pc, VM_PROT_EXECUTE); userret(l); }
void prefetch_abort_handler(struct trapframe *tf) { vaddr_t pc; struct proc *p; /* Enable interrupts if they were enabled before the trap. */ if ((tf->tf_r15 & R15_IRQ_DISABLE) == 0) int_on(); /* * XXX Not done yet: * Check if the page being requested is already present. If * so, call the undefined instruction handler instead (ARM3 ds * p15). */ uvmexp.traps++; p = curproc; if (p == NULL) p = &proc0; if ((tf->tf_r15 & R15_MODE) == R15_MODE_USR) p->p_addr->u_pcb.pcb_tf = tf; if ((tf->tf_r15 & R15_MODE) != R15_MODE_USR) { #ifdef DEBUG printf("Prefetch abort:\n"); printregs(tf); #endif panic("prefetch abort in kernel mode"); } /* User-mode prefetch abort */ pc = tf->tf_r15 & R15_PC; do_fault(tf, p, &p->p_vmspace->vm_map, pc, VM_PROT_EXECUTE); userret(p); }
int main() { //allocate memory for registers and program data byte reg[16]; byte mem[4096]; //unsigned int offset = (unsigned int)mem - 0x200; word I = 0x200; int i; printf("Initialize registers\n"); seti(reg+0x0,0); seti(reg+0x1,2); seti(reg+0x2,3); seti(reg+0x3,255); printregs(stdout,reg); shl(reg+0x3,reg+0xF); printf("Shift V3 left,V3 = 254,VF = 1\n"); printregs(stdout,reg); shl(reg+0x1,reg+0xF); printf("Shift V1 left,V1 = 4,VF = 0\n"); printregs(stdout,reg); shr(reg+0x1,reg+0xF); printf("Shift V1 right,V1 = 2,VF = 0\n"); printregs(stdout,reg); seti(reg+0x4,255); seti(reg+0x5,7); and(reg+0x4,reg+0x5); printf("V4 = 255,V5 = 7, V4 = V4 & V5 -> 7\n"); printregs(stdout,reg); seti(reg+0x6,15); seti(reg+0x7,240); or(reg+0x6,reg+0x7); printf("V6 = 15, V7 = 240,V6 = V6 | V7 -> 255\n"); printregs(stdout,reg); seti(reg+0x8,0xF0); seti(reg+0x9,0x0F); xor(reg+0x8,reg+0x9); printf("V8 = 0xF0,V9 = 0x0F, V8 = V8 ^ V9 -> FF\n"); printregs(stdout,reg); return 0; }
int main() { //allocate memory for registers and program data byte reg[16]; byte mem[4096]; //unsigned int offset = (unsigned int)mem - 0x200; word I = 0x200; int i; //printf("Hello World!\n"); //printf("Char size: %u\n",CHAR_BIT); //printf("Char min: %u\n",CHAR_MIN); //printf("Char max: %u\n",UCHAR_MAX); //printf("mem start: %p\n",mem); //printf("mem + 1: %p\n",mem+1); //fill registers to make the string "Hello World", //print it with printf, save it to memory, then //load it again seti(reg+0x0,0x48); seti(reg+0x1,0x65); seti(reg+0x2,0x6C); seti(reg+0x3,0x6C); seti(reg+0x4,0x6F); seti(reg+0x5,0x20); seti(reg+0x6,0x57); seti(reg+0x7,0x6F); seti(reg+0x8,0x72); seti(reg+0x9,0x6C); seti(reg+0xA,0x64); seti(reg+0xB,0x0); //print string printf("%s\n",reg); printf("Register contents after setting\n"); printregs(stdout,reg); printf("Memory contents before doing anythong\n"); printmem(stdout,mem,0x200,0x20F); //printf("Store register contents in memory"); stor(reg,0xB,mem,&I); //printmem(stdout,mem,0x200,0x20F); //zero all the registers memset(reg,0,REG_COUNT); printf("Memory after saving\n"); printmem(stdout,mem,0x200,0x20F); printf("Read memory as a string, line below should read \"Hello World\"\n"); printf("%s\n",mem+0x200); printf("Registers should all be 0\n"); printregs(stdout,reg); printf("Registers should now hold just the 2nd word\n"); I = 0x206; load(reg,0x5,mem,&I); //should load "World" printregs(stdout,reg); printf("%s\n",reg); //test the other opcodes printf("Clear registers\n"); memset(reg,0,REG_COUNT); printregs(stdout,reg); seti(reg+0x0,0x1); printf("set V0 to 1\n"); printregs(stdout,reg); set(reg+0x1,reg+0x0); printf("Set V1 to V0 (1)\n"); printregs(stdout,reg); addi(reg+0x0,0x2); printf("Added 2 to V0,should now be 3\n"); printregs(stdout,reg); add(reg+0x0,reg+0x1,reg+0xF); printf("Add V0 and V1, store answer in V0\n"); printregs(stdout,reg); addi(reg+0x2,0xFF); add(reg+0x0,reg+0x2,reg+0xF); printf("Testing carry flag, add 255 to V2 and add V2 to V0 (sets CF)\n"); printregs(stdout,reg); subyx(reg+0x0,reg+0x2,reg+0xF); printf("V0 - V2, V0 should be 0xFC, VF = 0\n"); printregs(stdout,reg); subxy(reg+0x1,reg+0x2,reg+0xF); printf("V2 (0xFF) - V1 (0x1) -> V1 (0xFE),VF = 1\n"); printregs(stdout,reg); }
docommand() { register char *p; register int i; register ADDR addr, bkaddr; struct proct *procp; char s[4]; cntval = 1; adrflg = 0; errflg = 0; if (scallf) { doscall(); setcur(1); lastcom = NOCOM; return; } if (reflag) { /* search for regular expression */ dore(); lastcom = PRCOM; return; } if (cmd == '\0') { if (integ != 0 && var[0] != '\0') { error("Invalid command (1)"); return; } if (integ != 0) { /* print line number */ ffind(integ); fprint(); lastcom = PRCOM; return; } if (var[0] != 0) { printf("Unexpected null command\n"); return; } } switch (cmd) { case 'Y': debug = !debug; break; case 'V': version(); break; case 'M': if (args[0]) { setmap(args); } else { printmap("? map", &txtmap); printmap("/ map", &datmap); } break; case 'x': printregs(); break; case 'X': printpc(); break; case 'a': if (integ) { cpstr(args, "l\n"); } else if (proc[0]) { cpall(args, "T\n"); } else { error("Bad arguments"); break; } goto setbrk; break; case 'l': setcur(1); lastcom = NOCOM; break; case 'T': prfrx(1); lastcom = NOCOM; break; case 't': prframe(); lastcom = NOCOM; break; case 'e': p = args; if (*p == '\0') { #ifndef FLEXNAMES printf("%.16s() in \"%s\"\n", curproc()->pname, curfile); #else printf("%s() in \"%s\"\n", curproc()->pname, curfile); #endif break; } while (*p != '\0') if (*p++ == '.') goto l1; /* argument is procedure name */ procp = findproc(args); if ((procp->pname[0] != '\0') && (procp->sfptr != badfile)) { finit(adrtofilep(procp->paddr)->sfilename); ffind(procp->lineno); } else printf("Can't find %s\n", args); #ifndef FLEXNAMES printf("%.16s() in \"%s\"\n", curproc()->pname, curfile); #else printf("%s() in \"%s\"\n", curproc()->pname, curfile); #endif lastcom = PRCOM; break; l1: /* argument is filename */ finit(args); printf("\"%s\"\n", curfile); lastcom = PRCOM; break; case 'p': if (integ) ffind(integ); fprint(); lastcom = PRCOM; break; case 'q': exit(0); case 'w': if (integ) ffind(integ); i = fline; fback(WINDOW/2); fprintn(WINDOW); ffind(i); lastcom = PRCOM; break; case 'Q': prdebug(); break; case 'z': if (integ) ffind(integ); fprintn(WINDOW); lastcom = PRCOM; break; case '-': fback(integ ? integ : 1); fpargs(); lastcom = PRCOM; break; case '+': fforward(integ ? integ : 1); fpargs(); lastcom = PRCOM; break; case '\n': switch (lastcom) { case PRCOM: fforward(1); fprint(); break; case DSCOM: oaddr += oincr ? oincr : typetosize(otype, WORDSIZE); printf("0x%x/ ", oaddr); dispf((ADDR) oaddr, odesc, oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP); break; case DSICOM: dot += oincr; prisploc(); dispi(dot, odesc, N_GSYM, 0, 0); break; } break; case '\004': if (!isatty(0)) exit(0); switch (lastcom) { case PRCOM: fforward(1); printf("\b"); fprintn(WINDOW); lastcom = PRCOM; break; case DSICOM: printf("\b"); for (i=0; i<WINDOW; i++) { dot += oincr; prisploc(); if (dispi(dot, odesc, N_GSYM, 0, 0) == -1) break; } break; case DSCOM: printf("\b"); for (i=0; i<WINDOW; i++) { oaddr += oincr ? oincr : typetosize(otype, WORDSIZE); printf("0x%x/ ", oaddr); if (dispf((ADDR) oaddr, odesc, oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP) == -1) break; } break; default: printf("\n"); } break; case 'r': if (args[0] == '\0') getargs(); case 'R': signo = 0; cpstr(oldargs, args); if (debug) error("calling dopcs"); if (integ) cntval = integ; if (!executing) { executing = TRUE; if (integ) cntval = integ; dopcs('r'); executing = FALSE; } if (debug) error("exiting dopcs"); bkaddr = -1; goto f1; case 'c': signo = 0; case 'C': if (proc[0] != '\0' || integ != 0) { setdot(); if (dot == -1) { error("Cannot set temporary breakpoint"); break; } dopcs('b'); bkaddr = dot; } else bkaddr = -1; integ = atoi(args); f1: if (debug) error("calling dopcs"); if (integ) cntval = integ; dopcs('c'); if (debug) error("exiting dopcs"); if (bkaddr != -1) { ADDR dotsave; dotsave = dot; dot = bkaddr; dopcs('d'); dot = dotsave; } if (!signo) printf("Breakpoint"); printf(" at\n"); setcur(1); lastcom = NOCOM; break; case 'S': case 's': signo = 0; integ = atoi(args); singstep(integ ? integ : 1, cmd); if (signo) printf("\n"); setcur(1); lastcom = NOCOM; break; case 'g': if (pid == 0 || signo) { error("Not stopped at breakpoint"); break; } setdot(); if (dot == -1) { error("Bad address"); break; } adrflg = 1; integ = atoi(args); if (integ) cntval = integ; dopcs('c'); if (!signo) printf("Breakpoint"); printf(" at\n"); setcur(1); lastcom = NOCOM; break; case 'k': if (scallx) { userpc = dot = *(ADDR *)(((ADDR)&u)+PC) = pcs; *(ADDR *)(((ADDR)&u)+FP) = fps; *(ADDR *)(((ADDR)&u)+AP) = aps; if (bkpts) bkpts->flag = flagss; scallx = 0; error("Procedure killed"); longjmp(env, 0); } else { dopcs('k'); printf("\n"); lastcom = NOCOM; break; } case 'B': prbkpt(); break; case 'b': setbrk: if (proc[0] == '\0' && integ == 0) { integ = fline; } setdot(); if (dot == -1 || dot == 0) { error("Cannot set breakpoint"); break; } dopcs('b'); s[0] = ' '; s[1] = cmd; s[2] = '\n'; s[3] = 0; s[1] = cmd; printbkpt(s, adrtoprocp(dot), dot); break; case 'd': if (proc[0] == '\0' && integ == 0) { idbkpt(); break; } setdot(); if (dot == -1) { error("Non existent breakpoint"); break; } dopcs('d'); break; case 'D': dabkpt(); error("All breakpoints deleted"); break; case 'm': addr = varaddr(proc[0] ? proc : curproc()->pname, var); printf("stopped with value %d\n", monex(addr, 'd')); setcur(1); lastcom = NOCOM; break; case '?': if (!(var[0] == '.' && var[1] == '\0')) setdot(); if (errflg) { error(errflg); break; } prisploc(); dispi(dot, args[0] ? args : "i", N_GSYM, 0, 0); lastcom = DSICOM; break; case '/': if (var[0] == '.' && var[1] == '\0') { if (integ == 0) integ = oaddr; dispf((ADDR) integ, args[0] ? args : odesc, oclass == N_RSYM ? oclass : N_GSYM, otype, 0, 0, DSP); oaddr = integ; } else if (integ && (var[0] == '\0')) { dispf((ADDR) integ, args, N_GSYM, 0, 0, 0, DSP); oaddr = integ; cpstr(odesc, args); oclass = N_GSYM; otype = 0; } else dispvar(proc, var, args); lastcom = DSCOM; break; case '=': if (var[0] == '\0') { if (proc[0]) { addr = getaddr(proc, integ); if (addr == -1) { error("Unknown address"); break; } } else addr = integ; dispf(addr, args[0] ? args : "x", 0, -1, 0, 0, DSP); } else findvar(proc, var, args[0] ? args : "x", 2); break; case '!': if (var[0] == '\0') addr = getaddr(proc, integ); else addr = varaddr(proc, var); if (addr == -1) error("Unknown variable"); else { if (number(args[0]) || eqany(args[0], ".-")) { char *p; double atof(); union { struct{ int w1, w2; } ww; double d; } dbl; p = (args[0] == '-') ? args+1 : args; for (; *p != '.' && *p != 'e'; p++) { if (!number(*p)) goto l2; } dbl.d = atof(args); putval(addr, 'd', dbl.ww.w1); if (typetodesc(sl_type,0)[0] == 'g') putval(addr+WORDSIZE, 'd', dbl.ww.w2); break; } l2: if (percentflag) *(ADDR *)(((ADDR)&u)+addr) = argvalue(args); else if (sl_class == N_RSYM && addr < 16) putreg(addr,typetodesc(sl_type,subflag)[0], argvalue(args)); else putval(addr,typetodesc(sl_type,subflag)[0], argvalue(args)); } lastcom = NOCOM; break; case '"': printf(args); break; } }
void print_pc() { char str[1024]; uint8_t binary[32]; uint32_t i; uint32_t len; const char *name = NULL; if ((shoe.pc >= 0x40000000) && (shoe.pc < 0x50000000)) { uint32_t i, addr = shoe.pc % (shoe.physical_rom_size); for (i=0; macii_rom_symbols[i].name; i++) { if (macii_rom_symbols[i].addr > addr) { break; } name = macii_rom_symbols[i].name; } } else if (sr_s()) { // these symbols are only meaningful in supervisor mode coff_symbol *symb = coff_find_func(shoe.coff, shoe.pc); if (symb && strlen(symb->name)) name = symb->name; } else { if ((shoe.pc >= 0x10000000) && (shoe.pc < 0x20000000)) { uint32_t i, addr = shoe.pc % (shoe.physical_rom_size); for (i=0; macii_rom_symbols[i].name; i++) { if (macii_rom_symbols[i].addr > addr) { break; } name = macii_rom_symbols[i].name; } } /*else { coff_symbol *symb = coff_find_func(shoe.launch, shoe.pc); if (symb) name = symb->name; }*/ } const uint16_t old_abort = shoe.abort; shoe.suppress_exceptions = 1; for (i=0; i<32; i++) { binary[i] = (uint8_t) lget(shoe.pc+i, 1); } disassemble_inst(binary, shoe.pc, str, &len); printf("*0x%08x %s [ ", shoe.pc, name ? name : ""); for (i=0; i<len; i+=2) { printf("%02x%02x ", binary[i], binary[i+1]); } printf("] %s\n", str); shoe.abort = old_abort; shoe.suppress_exceptions = 0; if (name && strcmp(name, "ui_ioctl")==0) printregs(); }
/* * General page fault handler. */ void do_fault(struct trapframe *tf, struct lwp *l, struct vm_map *map, vaddr_t va, vm_prot_t atype) { int error; if (pmap_fault(map->pmap, va, atype)) return; struct pcb * const pcb = lwp_getpcb(l); void * const onfault = pcb->pcb_onfault; const bool user = TRAP_USERMODE(tf); if (cpu_intr_p()) { KASSERT(!user); error = EFAULT; } else { pcb->pcb_onfault = NULL; error = uvm_fault(map, va, atype); pcb->pcb_onfault = onfault; } if (error != 0) { ksiginfo_t ksi; if (onfault != NULL) { tf->tf_r0 = error; tf->tf_r15 = (tf->tf_r15 & ~R15_PC) | (register_t)onfault; return; } #ifdef DDB if (db_validating) { db_faulted = true; tf->tf_r15 += INSN_SIZE; return; } #endif if (!user) { #ifdef DDB db_printf("Unhandled data abort in kernel mode\n"); kdb_trap(T_FAULT, tf); #else #ifdef DEBUG printf("Unhandled data abort:\n"); printregs(tf); #endif panic("unhandled data abort in kernel mode"); #endif } KSI_INIT_TRAP(&ksi); if (error == ENOMEM) { printf("UVM: pid %d (%s), uid %d killed: " "out of swap\n", l->l_proc->p_pid, l->l_proc->p_comm, l->l_cred ? kauth_cred_geteuid(l->l_cred) : -1); ksi.ksi_signo = SIGKILL; } else ksi.ksi_signo = SIGSEGV; ksi.ksi_code = (error == EPERM) ? SEGV_ACCERR : SEGV_MAPERR; ksi.ksi_addr = (void *) va; trapsignal(l, &ksi); } else if (!user) { ucas_ras_check(tf); } }