/* * Variation that prints the saved userspace CHERI register frame for a * thread. */ DB_SHOW_COMMAND(cheriframe, ddb_dump_cheriframe) { struct thread *td; struct cheri_frame *cfp; u_int i; if (have_addr) td = db_lookup_thread(addr, TRUE); else td = curthread; cfp = &td->td_pcb->pcb_cheriframe; db_printf("Thread %d at %p\n", td->td_tid, td); db_printf("CHERI frame at %p\n", cfp); /* Laboriously load and print each user capability. */ for (i = 0; i < 27; i++) { cheri_capability_load(CHERI_CR_CTEMP0, (struct chericap *)&cfp->cf_c0 + i); DB_CHERI_REG_PRINT(CHERI_CR_CTEMP0, i); } cheri_capability_load(CHERI_CR_CTEMP0, (struct chericap *)&cfp->cf_c0 + CHERIFRAME_OFF_PCC); db_printf("PCC "); DB_CHERI_CAP_PRINT(CHERI_CR_CTEMP0); }
DB_SHOW_COMMAND(pcb, ddb_dump_pcb) { struct thread *td; struct pcb *pcb; struct trapframe *trapframe; /* Determine which thread to examine. */ if (have_addr) td = db_lookup_thread(addr, true); else td = curthread; pcb = td->td_pcb; db_printf("Thread %d at %p\n", td->td_tid, td); db_printf("PCB at %p\n", pcb); trapframe = &pcb->pcb_regs; dump_trapframe(trapframe); db_printf("PCB Context:\n"); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S0); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S1); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S2); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S3); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S4); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S5); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S6); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S7); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_SP); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_S8); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_RA); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_SR); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_GP); DB_PRINT_REG_ARRAY(pcb, pcb_context, PCB_REG_PC); db_printf("PCB onfault = %p\n", pcb->pcb_onfault); db_printf("md_saved_intr = 0x%0lx\n", (long)td->td_md.md_saved_intr); db_printf("md_spinlock_count = %d\n", td->td_md.md_spinlock_count); if (td->td_frame != trapframe) { db_printf("td->td_frame %p is not the same as pcb_regs %p\n", td->td_frame, trapframe); } }