1*521fa314SDavid van Moolenbroek
2*521fa314SDavid van Moolenbroek #include "inc.h"
3*521fa314SDavid van Moolenbroek
4*521fa314SDavid van Moolenbroek #include <sys/mman.h>
5*521fa314SDavid van Moolenbroek #include <sys/resource.h>
6*521fa314SDavid van Moolenbroek
7*521fa314SDavid van Moolenbroek static int
vm_brk_out(struct trace_proc * proc,const message * m_out)8*521fa314SDavid van Moolenbroek vm_brk_out(struct trace_proc * proc, const message * m_out)
9*521fa314SDavid van Moolenbroek {
10*521fa314SDavid van Moolenbroek
11*521fa314SDavid van Moolenbroek put_ptr(proc, "addr", (vir_bytes)m_out->m_lc_vm_brk.addr);
12*521fa314SDavid van Moolenbroek
13*521fa314SDavid van Moolenbroek return CT_DONE;
14*521fa314SDavid van Moolenbroek }
15*521fa314SDavid van Moolenbroek
16*521fa314SDavid van Moolenbroek static const struct flags mmap_prot[] = {
17*521fa314SDavid van Moolenbroek FLAG_ZERO(PROT_NONE),
18*521fa314SDavid van Moolenbroek FLAG(PROT_READ),
19*521fa314SDavid van Moolenbroek FLAG(PROT_WRITE),
20*521fa314SDavid van Moolenbroek FLAG(PROT_EXEC),
21*521fa314SDavid van Moolenbroek };
22*521fa314SDavid van Moolenbroek
23*521fa314SDavid van Moolenbroek static const struct flags mmap_flags[] = {
24*521fa314SDavid van Moolenbroek FLAG(MAP_SHARED),
25*521fa314SDavid van Moolenbroek FLAG(MAP_PRIVATE),
26*521fa314SDavid van Moolenbroek FLAG(MAP_FIXED),
27*521fa314SDavid van Moolenbroek FLAG(MAP_RENAME),
28*521fa314SDavid van Moolenbroek FLAG(MAP_NORESERVE),
29*521fa314SDavid van Moolenbroek FLAG(MAP_INHERIT),
30*521fa314SDavid van Moolenbroek FLAG(MAP_HASSEMAPHORE),
31*521fa314SDavid van Moolenbroek FLAG(MAP_TRYFIXED),
32*521fa314SDavid van Moolenbroek FLAG(MAP_WIRED),
33*521fa314SDavid van Moolenbroek FLAG_MASK(MAP_ANON | MAP_STACK, MAP_FILE),
34*521fa314SDavid van Moolenbroek FLAG(MAP_ANON),
35*521fa314SDavid van Moolenbroek FLAG(MAP_STACK),
36*521fa314SDavid van Moolenbroek FLAG(MAP_UNINITIALIZED),
37*521fa314SDavid van Moolenbroek FLAG(MAP_PREALLOC),
38*521fa314SDavid van Moolenbroek FLAG(MAP_CONTIG),
39*521fa314SDavid van Moolenbroek FLAG(MAP_LOWER16M),
40*521fa314SDavid van Moolenbroek FLAG(MAP_LOWER1M),
41*521fa314SDavid van Moolenbroek FLAG(MAP_THIRDPARTY),
42*521fa314SDavid van Moolenbroek /* TODO: interpret alignments for which there is no constant */
43*521fa314SDavid van Moolenbroek FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_64KB),
44*521fa314SDavid van Moolenbroek FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_16MB),
45*521fa314SDavid van Moolenbroek FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_4GB),
46*521fa314SDavid van Moolenbroek FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_1TB),
47*521fa314SDavid van Moolenbroek FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_256TB),
48*521fa314SDavid van Moolenbroek FLAG_MASK(MAP_ALIGNMENT_MASK, MAP_ALIGNMENT_64PB),
49*521fa314SDavid van Moolenbroek };
50*521fa314SDavid van Moolenbroek
51*521fa314SDavid van Moolenbroek static int
vm_mmap_out(struct trace_proc * proc,const message * m_out)52*521fa314SDavid van Moolenbroek vm_mmap_out(struct trace_proc * proc, const message * m_out)
53*521fa314SDavid van Moolenbroek {
54*521fa314SDavid van Moolenbroek
55*521fa314SDavid van Moolenbroek if (m_out->m_mmap.flags & MAP_THIRDPARTY)
56*521fa314SDavid van Moolenbroek put_endpoint(proc, "forwhom", m_out->m_mmap.forwhom);
57*521fa314SDavid van Moolenbroek put_ptr(proc, "addr", (vir_bytes)m_out->m_mmap.addr);
58*521fa314SDavid van Moolenbroek put_value(proc, "len", "%zu", m_out->m_mmap.len);
59*521fa314SDavid van Moolenbroek put_flags(proc, "prot", mmap_prot, COUNT(mmap_prot), "0x%x",
60*521fa314SDavid van Moolenbroek m_out->m_mmap.prot);
61*521fa314SDavid van Moolenbroek put_flags(proc, "flags", mmap_flags, COUNT(mmap_flags), "0x%x",
62*521fa314SDavid van Moolenbroek m_out->m_mmap.flags);
63*521fa314SDavid van Moolenbroek put_fd(proc, "fd", m_out->m_mmap.fd);
64*521fa314SDavid van Moolenbroek put_value(proc, "offset", "%"PRId64, m_out->m_mmap.offset);
65*521fa314SDavid van Moolenbroek
66*521fa314SDavid van Moolenbroek return CT_DONE;
67*521fa314SDavid van Moolenbroek }
68*521fa314SDavid van Moolenbroek
69*521fa314SDavid van Moolenbroek static void
vm_mmap_in(struct trace_proc * proc,const message * __unused m_out,const message * m_in,int failed)70*521fa314SDavid van Moolenbroek vm_mmap_in(struct trace_proc * proc, const message * __unused m_out,
71*521fa314SDavid van Moolenbroek const message * m_in, int failed)
72*521fa314SDavid van Moolenbroek {
73*521fa314SDavid van Moolenbroek
74*521fa314SDavid van Moolenbroek if (!failed)
75*521fa314SDavid van Moolenbroek put_ptr(proc, NULL, (vir_bytes)m_in->m_mmap.retaddr);
76*521fa314SDavid van Moolenbroek else
77*521fa314SDavid van Moolenbroek /* TODO: consider printing MAP_FAILED in the right cases */
78*521fa314SDavid van Moolenbroek put_result(proc);
79*521fa314SDavid van Moolenbroek }
80*521fa314SDavid van Moolenbroek
81*521fa314SDavid van Moolenbroek static int
vm_munmap_out(struct trace_proc * proc,const message * m_out)82*521fa314SDavid van Moolenbroek vm_munmap_out(struct trace_proc * proc, const message * m_out)
83*521fa314SDavid van Moolenbroek {
84*521fa314SDavid van Moolenbroek
85*521fa314SDavid van Moolenbroek put_ptr(proc, "addr", (vir_bytes)m_out->m_mmap.addr);
86*521fa314SDavid van Moolenbroek put_value(proc, "len", "%zu", m_out->m_mmap.len);
87*521fa314SDavid van Moolenbroek
88*521fa314SDavid van Moolenbroek return CT_DONE;
89*521fa314SDavid van Moolenbroek }
90*521fa314SDavid van Moolenbroek
91*521fa314SDavid van Moolenbroek #define VM_CALL(c) [((VM_ ## c) - VM_RQ_BASE)]
92*521fa314SDavid van Moolenbroek
93*521fa314SDavid van Moolenbroek static const struct call_handler vm_map[] = {
94*521fa314SDavid van Moolenbroek VM_CALL(BRK) = HANDLER("brk", vm_brk_out, default_in),
95*521fa314SDavid van Moolenbroek VM_CALL(MMAP) = HANDLER("mmap", vm_mmap_out, vm_mmap_in),
96*521fa314SDavid van Moolenbroek VM_CALL(MUNMAP) = HANDLER("munmap", vm_munmap_out, default_in),
97*521fa314SDavid van Moolenbroek };
98*521fa314SDavid van Moolenbroek
99*521fa314SDavid van Moolenbroek const struct calls vm_calls = {
100*521fa314SDavid van Moolenbroek .endpt = VM_PROC_NR,
101*521fa314SDavid van Moolenbroek .base = VM_RQ_BASE,
102*521fa314SDavid van Moolenbroek .map = vm_map,
103*521fa314SDavid van Moolenbroek .count = COUNT(vm_map)
104*521fa314SDavid van Moolenbroek };
105