static int parse_vmflags(char *buf, struct vma_area *vma_area) { char *tok; bool shared = false; bool maywrite = false; if (!buf[0]) return 0; tok = strtok(buf, " \n"); if (!tok) return 0; #define _vmflag_match(_t, _s) (_t[0] == _s[0] && _t[1] == _s[1]) do { /* open() block */ if (_vmflag_match(tok, "sh")) shared = true; else if (_vmflag_match(tok, "mw")) maywrite = true; /* mmap() block */ if (_vmflag_match(tok, "gd")) vma_area->e->flags |= MAP_GROWSDOWN; else if (_vmflag_match(tok, "lo")) vma_area->e->flags |= MAP_LOCKED; else if (_vmflag_match(tok, "nr")) vma_area->e->flags |= MAP_NORESERVE; else if (_vmflag_match(tok, "ht")) vma_area->e->flags |= MAP_HUGETLB; /* madvise() block */ if (_vmflag_match(tok, "sr")) vma_area->e->madv |= (1ul << MADV_SEQUENTIAL); else if (_vmflag_match(tok, "rr")) vma_area->e->madv |= (1ul << MADV_RANDOM); else if (_vmflag_match(tok, "dc")) vma_area->e->madv |= (1ul << MADV_DONTFORK); else if (_vmflag_match(tok, "dd")) vma_area->e->madv |= (1ul << MADV_DONTDUMP); else if (_vmflag_match(tok, "mg")) vma_area->e->madv |= (1ul << MADV_MERGEABLE); else if (_vmflag_match(tok, "hg")) vma_area->e->madv |= (1ul << MADV_HUGEPAGE); else if (_vmflag_match(tok, "nh")) vma_area->e->madv |= (1ul << MADV_NOHUGEPAGE); /* vmsplice doesn't work for VM_IO and VM_PFNMAP mappings. */ if (_vmflag_match(tok, "io") || _vmflag_match(tok, "pf")) { /* * VVAR area mapped by the kernel as * VM_IO | VM_PFNMAP| VM_DONTEXPAND | VM_DONTDUMP */ if (!vma_area_is(vma_area, VMA_AREA_VVAR)) vma_area->e->status |= VMA_UNSUPP; } /* * Anything else is just ignored. */ } while ((tok = strtok(NULL, " \n"))); #undef _vmflag_match if (shared && maywrite) vma_area->e->fdflags = O_RDWR; else vma_area->e->fdflags = O_RDONLY; vma_area->e->has_fdflags = true; if (vma_area->e->madv) vma_area->e->has_madv = true; return 0; }
static int parse_vmflags(char *buf, struct vma_area *vma_area) { char *tok; if (!buf[0]) return 0; tok = strtok(buf, " \n"); if (!tok) return 0; #define _vmflag_match(_t, _s) (_t[0] == _s[0] && _t[1] == _s[1]) do { /* mmap() block */ if (_vmflag_match(tok, "gd")) vma_area->vma.flags |= MAP_GROWSDOWN; else if (_vmflag_match(tok, "lo")) vma_area->vma.flags |= MAP_LOCKED; else if (_vmflag_match(tok, "nr")) vma_area->vma.flags |= MAP_NORESERVE; else if (_vmflag_match(tok, "ht")) vma_area->vma.flags |= MAP_HUGETLB; /* madvise() block */ if (_vmflag_match(tok, "sr")) vma_area->vma.madv |= (1ul << MADV_SEQUENTIAL); else if (_vmflag_match(tok, "rr")) vma_area->vma.madv |= (1ul << MADV_RANDOM); else if (_vmflag_match(tok, "dc")) vma_area->vma.madv |= (1ul << MADV_DONTFORK); else if (_vmflag_match(tok, "dd")) vma_area->vma.madv |= (1ul << MADV_DONTDUMP); else if (_vmflag_match(tok, "mg")) vma_area->vma.madv |= (1ul << MADV_MERGEABLE); else if (_vmflag_match(tok, "hg")) vma_area->vma.madv |= (1ul << MADV_HUGEPAGE); else if (_vmflag_match(tok, "nh")) vma_area->vma.madv |= (1ul << MADV_NOHUGEPAGE); /* * Anything else is just ignored. */ } while ((tok = strtok(NULL, " \n"))); #undef _vmflag_match if (vma_area->vma.madv) vma_area->vma.has_madv = true; return 0; }