Monitor command showmappings updates
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 30 Apr 2014 00:18:00 +0000 (17:18 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 30 Apr 2014 00:18:00 +0000 (17:18 -0700)
Now also called 'sm', it takes a PID.  sm will print the mappings for the given
process's address space.  PID = 0 will show the boot_pgdir.

kern/arch/riscv/arch.h
kern/arch/riscv/cpuinfo.c
kern/arch/x86/arch.h
kern/arch/x86/cpuinfo.c
kern/include/monitor.h
kern/src/monitor.c

index cd0aee7..1cc31b2 100644 (file)
@@ -12,7 +12,7 @@
 #define ARCH_CL_SIZE 64
 
 void print_cpuinfo(void);
-void show_mapping(uintptr_t start, size_t size);
+void show_mapping(pde_t *pgdir, uintptr_t start, size_t size);
 void backtrace(void);
 
 static __inline void breakpoint(void)
index 2ca3e54..6766761 100644 (file)
@@ -24,9 +24,8 @@ print_cpuinfo(void)
        cprintf("CPU Info: RISC-V %s\n", name);
 }
 
-void show_mapping(uintptr_t start, size_t size)
+void show_mapping(pde_t *pt, uintptr_t start, size_t size)
 {
-  pde_t* pt = (pde_t*)KADDR(rcr3());
        pte_t* pte;
        uintptr_t i;
        page_t* page;
index 498c82c..2bf8dbc 100644 (file)
@@ -34,7 +34,7 @@ static inline void reboot(void)
 void send_ipi(uint32_t os_coreid, uint8_t vector);
 /* in cpuinfo.c */
 void print_cpuinfo(void);
-void show_mapping(uintptr_t start, size_t size);
+void show_mapping(pde_t *pgdir, uintptr_t start, size_t size);
 int vendor_id(char *);
 
 static inline void breakpoint(void)
index 904f2fb..36b8239 100644 (file)
@@ -186,9 +186,8 @@ void print_cpuinfo(void)
 #define BIT_DASHES ""
 #endif
 
-void show_mapping(uintptr_t start, size_t size)
+void show_mapping(pde_t *pgdir, uintptr_t start, size_t size)
 {
-       pde_t *pgdir = (pde_t*)vpd;
        pte_t *pte;
        pte_t *pde;
        page_t *page;
index b35e427..71836db 100644 (file)
@@ -17,6 +17,7 @@ int mon_bt(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_ps(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_reboot(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_showmapping(int argc, char **argv, struct hw_trapframe *hw_tf);
+int mon_sm(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_setmapperm(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_cpuinfo(int argc, char **argv, struct hw_trapframe *hw_tf);
 int mon_nanwan(int argc, char **argv, struct hw_trapframe *hw_tf);
index 4d17bfd..9cdb985 100644 (file)
@@ -48,6 +48,7 @@ static command_t (RO commands)[] = {
        { "bt", "Dump a backtrace", mon_bt },
        { "reboot", "Take a ride to the South Bay", mon_reboot },
        { "showmapping", "Shows VA->PA mappings", mon_showmapping},
+       { "sm", "Shows VA->PA mappings", mon_sm},
        { "setmapperm", "Sets permissions on a VA->PA mapping", mon_setmapperm},
        { "cpuinfo", "Prints CPU diagnostics", mon_cpuinfo},
        { "ps", "Prints process list", mon_ps},
@@ -167,26 +168,50 @@ int mon_reboot(int argc, char **argv, struct hw_trapframe *hw_tf)
        return 0;
 }
 
-int mon_showmapping(int argc, char **argv, struct hw_trapframe *hw_tf)
+static int __showmapping(int argc, char **argv, struct hw_trapframe *hw_tf)
 {
-       if (argc < 2) {
-               cprintf("Shows virtual -> physical mappings for a virt addr range.\n");
-               cprintf("Usage: showmapping START_ADDR [END_ADDR]\n");
-               return 1;
-       }
+       struct proc *p;
        uintptr_t start;
        size_t size;
-       start = ROUNDDOWN(strtol(argv[1], 0, 16), PGSIZE);
-       size = (argc == 2) ? 1 : strtol(argv[2], 0, 16) - start;
+       pde_t *pgdir;
+       pid_t pid;
+       if (argc < 3) {
+               printk("Shows virtual -> physical mappings for a virt addr range.\n");
+               printk("Usage: showmapping PID START_ADDR [END_ADDR]\n");
+               printk("    PID == 0 for the boot pgdir\n");
+               return 1;
+       }
+       pid = strtol(argv[1], 0, 10);
+       if (!pid) {
+               pgdir = boot_pgdir;
+       } else {
+               p = pid2proc(pid);
+               if (!p) {
+                       printk("No proc with pid %d\n", pid);
+                       return 1;
+               }
+               pgdir = p->env_pgdir;
+       }
+       start = ROUNDDOWN(strtol(argv[2], 0, 16), PGSIZE);
+       size = (argc == 3) ? 1 : strtol(argv[3], 0, 16) - start;
        if (size/PGSIZE > 512) {
                cprintf("Not going to do this for more than 512 items\n");
                return 1;
        }
-
-       show_mapping(start,size);
+       show_mapping(pgdir, start, size);
        return 0;
 }
 
+int mon_showmapping(int argc, char **argv, struct hw_trapframe *hw_tf)
+{
+       return __showmapping(argc, argv, hw_tf);
+}
+
+int mon_sm(int argc, char **argv, struct hw_trapframe *hw_tf)
+{
+       return __showmapping(argc, argv, hw_tf);
+}
+
 int mon_setmapperm(int argc, char **argv, struct hw_trapframe *hw_tf)
 {
 #ifndef CONFIG_X86_32