1 /* Debugging dump procedures for the VM server. */
7 #include "kernel/proc.h"
11 static void print_region(struct vm_region_info
*vri
, int *n
)
13 static int vri_count
, vri_prev_set
;
14 static struct vm_region_info vri_prev
;
17 /* part of a contiguous identical run? */
21 vri
->vri_prot
== vri_prev
.vri_prot
&&
22 vri
->vri_flags
== vri_prev
.vri_flags
&&
23 vri
->vri_length
== vri_prev
.vri_length
&&
24 vri
->vri_addr
== vri_prev
.vri_addr
+ vri_prev
.vri_length
;
37 printf(" (contiguously repeated %d more times)\n", vri_count
);
42 /* NULL indicates the end of a list of mappings, nothing else to do */
45 printf(" %08lx-%08lx %c%c%c %c (%lu kB)\n", vri
->vri_addr
,
46 vri
->vri_addr
+ vri
->vri_length
,
47 (vri
->vri_prot
& PROT_READ
) ? 'r' : '-',
48 (vri
->vri_prot
& PROT_WRITE
) ? 'w' : '-',
49 (vri
->vri_prot
& PROT_EXEC
) ? 'x' : '-',
50 (vri
->vri_flags
& MAP_IPC_SHARED
) ? 's' : 'p',
51 vri
->vri_length
/ 1024L);
57 static struct proc proc
[NR_TASKS
+ NR_PROCS
];
58 static struct vm_region_info vri
[LINES
];
59 struct vm_stats_info vsi
;
60 struct vm_usage_info vui
;
61 static int prev_i
= -1;
62 static vir_bytes prev_base
= 0;
63 int r
, r2
, i
, j
, first
, n
= 0;
66 if ((r
= vm_info_stats(&vsi
)) != OK
) {
67 printf("IS: warning: couldn't talk to VM: %d\n", r
);
71 printf("Total %lu kB, free %lu kB, largest free %lu kB, cached %lu kB\n",
72 vsi
.vsi_total
* (vsi
.vsi_pagesize
/ 1024),
73 vsi
.vsi_free
* (vsi
.vsi_pagesize
/ 1024),
74 vsi
.vsi_largest
* (vsi
.vsi_pagesize
/ 1024),
75 vsi
.vsi_cached
* (vsi
.vsi_pagesize
/ 1024));
83 if ((r
= sys_getproctab(proc
)) != OK
) {
84 printf("IS: warning: couldn't get copy of process table: %d\n", r
);
88 for (i
= prev_i
; i
< NR_TASKS
+ NR_PROCS
&& n
< LINES
; i
++, prev_base
= 0) {
89 if (i
< NR_TASKS
|| isemptyp(&proc
[i
])) continue;
91 /* The first batch dump for each process contains a header line. */
92 first
= prev_base
== 0;
94 r
= vm_info_region(proc
[i
].p_endpoint
, vri
, LINES
- first
, &prev_base
);
97 printf("Process %d (%s): error %d\n",
98 proc
[i
].p_endpoint
, proc
[i
].p_name
, r
);
104 /* The entire batch should fit on the screen. */
105 if (n
+ 1 + r
> LINES
) {
106 prev_base
= 0; /* restart on next page */
110 if ((r2
= vm_info_usage(proc
[i
].p_endpoint
, &vui
)) != OK
) {
111 printf("Process %d (%s): error %d\n",
112 proc
[i
].p_endpoint
, proc
[i
].p_name
, r2
);
117 printf("Process %d (%s): total %lu kB, common %lu kB, "
119 proc
[i
].p_endpoint
, proc
[i
].p_name
,
120 vui
.vui_total
/ 1024L, vui
.vui_common
/ 1024L,
121 vui
.vui_shared
/ 1024L);
126 for (j
= 0; j
< r
; j
++) {
127 print_region(&vri
[j
], &n
);
130 if (LINES
- n
- 1 <= 0) break;
131 r
= vm_info_region(proc
[i
].p_endpoint
, vri
, LINES
- n
- 1,
135 printf("Process %d (%s): error %d\n",
136 proc
[i
].p_endpoint
, proc
[i
].p_name
, r
);
140 print_region(NULL
, &n
);
142 if (n
> LINES
) printf("IS: internal error\n");
143 if (n
== LINES
) break;
145 /* This may have to wipe out the "--more--" from below. */
150 if (i
>= NR_TASKS
+ NR_PROCS
) {
154 else printf("--more--\r");