xref: /minix3/minix/usr.bin/trace/service/vm.c (revision b80da2a01d0bb632707b7b4e974aa32eaebbcc6f)
1 
2 #include "inc.h"
3 
4 #include <sys/mman.h>
5 #include <sys/resource.h>
6 
7 static int
8 vm_brk_out(struct trace_proc * proc, const message * m_out)
9 {
10 
11 	put_ptr(proc, "addr", (vir_bytes)m_out->m_lc_vm_brk.addr);
12 
13 	return CT_DONE;
14 }
15 
16 static const struct flags mmap_prot[] = {
17 	FLAG_ZERO(PROT_NONE),
18 	FLAG(PROT_READ),
19 	FLAG(PROT_WRITE),
20 	FLAG(PROT_EXEC),
21 };
22 
23 static const struct flags mmap_flags[] = {
24 	FLAG(MAP_SHARED),
25 	FLAG(MAP_PRIVATE),
26 	FLAG(MAP_FIXED),
27 	FLAG(MAP_RENAME),
28 	FLAG(MAP_NORESERVE),
29 	FLAG(MAP_INHERIT),
30 	FLAG(MAP_HASSEMAPHORE),
31 	FLAG(MAP_TRYFIXED),
32 	FLAG(MAP_WIRED),
33 	FLAG_MASK(MAP_ANON | MAP_STACK, MAP_FILE),
34 	FLAG(MAP_ANON),
35 	FLAG(MAP_STACK),
36 	FLAG(MAP_UNINITIALIZED),
37 	FLAG(MAP_PREALLOC),
38 	FLAG(MAP_CONTIG),
39 	FLAG(MAP_LOWER16M),
40 	FLAG(MAP_LOWER1M),
41 	FLAG(MAP_THIRDPARTY),
42 	/* TODO: interpret alignments for which there is no constant */
43 	FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_64KB),
44 	FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_16MB),
45 	FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_4GB),
46 	FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_1TB),
47 	FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_256TB),
48 	FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_64PB),
49 };
50 
51 static int
52 vm_mmap_out(struct trace_proc * proc, const message * m_out)
53 {
54 
55 	if (m_out->m_mmap.flags & MAP_THIRDPARTY)
56 		put_endpoint(proc, "forwhom", m_out->m_mmap.forwhom);
57 	put_ptr(proc, "addr", (vir_bytes)m_out->m_mmap.addr);
58 	put_value(proc, "len", "%zu", m_out->m_mmap.len);
59 	put_flags(proc, "prot", mmap_prot, COUNT(mmap_prot), "0x%x",
60 	    m_out->m_mmap.prot);
61 	put_flags(proc, "flags", mmap_flags, COUNT(mmap_flags), "0x%x",
62 	    m_out->m_mmap.flags);
63 	put_fd(proc, "fd", m_out->m_mmap.fd);
64 	put_value(proc, "offset", "%"PRId64, m_out->m_mmap.offset);
65 
66 	return CT_DONE;
67 }
68 
69 static void
70 vm_mmap_in(struct trace_proc * proc, const message * __unused m_out,
71 	const message * m_in, int failed)
72 {
73 
74 	if (!failed)
75 		put_ptr(proc, NULL, (vir_bytes)m_in->m_mmap.retaddr);
76 	else
77 		/* TODO: consider printing MAP_FAILED in the right cases */
78 		put_result(proc);
79 }
80 
81 static int
82 vm_munmap_out(struct trace_proc * proc, const message * m_out)
83 {
84 
85 	put_ptr(proc, "addr", (vir_bytes)m_out->m_mmap.addr);
86 	put_value(proc, "len", "%zu", m_out->m_mmap.len);
87 
88 	return CT_DONE;
89 }
90 
91 static int
92 vm_getrusage_out(struct trace_proc * __unused proc,
93 	const message * __unused m_out)
94 {
95 
96 	return CT_NOTDONE;
97 }
98 
99 static void
100 vm_getrusage_in(struct trace_proc * proc, const message * m_out,
101 	const message * __unused m_in, int failed)
102 {
103 	struct rusage buf;
104 
105 	/* Inline; we will certainly not be reusing this anywhere else. */
106 	if (put_open_struct(proc, "rusage", failed,
107 	    m_out->m_lc_vm_rusage.addr, &buf, sizeof(buf))) {
108 		if (verbose > 0) {
109 			put_value(proc, "ru_maxrss", "%ld", buf.ru_maxrss);
110 			put_value(proc, "ru_minflt", "%ld", buf.ru_minflt);
111 			put_value(proc, "ru_majflt", "%ld", buf.ru_majflt);
112 		}
113 
114 		put_close_struct(proc, verbose > 0);
115 	}
116 	put_equals(proc);
117 	put_result(proc);
118 }
119 
120 #define VM_CALL(c) [((VM_ ## c) - VM_RQ_BASE)]
121 
122 static const struct call_handler vm_map[] = {
123 	VM_CALL(BRK) = HANDLER("brk", vm_brk_out, default_in),
124 	VM_CALL(MMAP) = HANDLER("mmap", vm_mmap_out, vm_mmap_in),
125 	VM_CALL(MUNMAP) = HANDLER("munmap", vm_munmap_out, default_in),
126 	VM_CALL(GETRUSAGE) = HANDLER("vm_getrusage", vm_getrusage_out,
127 	    vm_getrusage_in),
128 };
129 
130 const struct calls vm_calls = {
131 	.endpt = VM_PROC_NR,
132 	.base = VM_RQ_BASE,
133 	.map = vm_map,
134 	.count = COUNT(vm_map)
135 };
136