linux/fs/proc/nommu.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* nommu.c: mmu-less memory info files
   3 *
   4 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
   5 * Written by David Howells (dhowells@redhat.com)
   6 */
   7
   8#include <linux/init.h>
   9#include <linux/module.h>
  10#include <linux/errno.h>
  11#include <linux/time.h>
  12#include <linux/kernel.h>
  13#include <linux/string.h>
  14#include <linux/mman.h>
  15#include <linux/proc_fs.h>
  16#include <linux/mm.h>
  17#include <linux/mmzone.h>
  18#include <linux/pagemap.h>
  19#include <linux/swap.h>
  20#include <linux/smp.h>
  21#include <linux/seq_file.h>
  22#include <linux/hugetlb.h>
  23#include <linux/vmalloc.h>
  24#include <linux/uaccess.h>
  25#include <asm/pgtable.h>
  26#include <asm/tlb.h>
  27#include <asm/div64.h>
  28#include "internal.h"
  29
  30/*
  31 * display a single region to a sequenced file
  32 */
  33static int nommu_region_show(struct seq_file *m, struct vm_region *region)
  34{
  35        unsigned long ino = 0;
  36        struct file *file;
  37        dev_t dev = 0;
  38        int flags;
  39
  40        flags = region->vm_flags;
  41        file = region->vm_file;
  42
  43        if (file) {
  44                struct inode *inode = file_inode(region->vm_file);
  45                dev = inode->i_sb->s_dev;
  46                ino = inode->i_ino;
  47        }
  48
  49        seq_setwidth(m, 25 + sizeof(void *) * 6 - 1);
  50        seq_printf(m,
  51                   "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu ",
  52                   region->vm_start,
  53                   region->vm_end,
  54                   flags & VM_READ ? 'r' : '-',
  55                   flags & VM_WRITE ? 'w' : '-',
  56                   flags & VM_EXEC ? 'x' : '-',
  57                   flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p',
  58                   ((loff_t)region->vm_pgoff) << PAGE_SHIFT,
  59                   MAJOR(dev), MINOR(dev), ino);
  60
  61        if (file) {
  62                seq_pad(m, ' ');
  63                seq_file_path(m, file, "");
  64        }
  65
  66        seq_putc(m, '\n');
  67        return 0;
  68}
  69
  70/*
  71 * display a list of all the REGIONs the kernel knows about
  72 * - nommu kernels have a single flat list
  73 */
  74static int nommu_region_list_show(struct seq_file *m, void *_p)
  75{
  76        struct rb_node *p = _p;
  77
  78        return nommu_region_show(m, rb_entry(p, struct vm_region, vm_rb));
  79}
  80
  81static void *nommu_region_list_start(struct seq_file *m, loff_t *_pos)
  82{
  83        struct rb_node *p;
  84        loff_t pos = *_pos;
  85
  86        down_read(&nommu_region_sem);
  87
  88        for (p = rb_first(&nommu_region_tree); p; p = rb_next(p))
  89                if (pos-- == 0)
  90                        return p;
  91        return NULL;
  92}
  93
  94static void nommu_region_list_stop(struct seq_file *m, void *v)
  95{
  96        up_read(&nommu_region_sem);
  97}
  98
  99static void *nommu_region_list_next(struct seq_file *m, void *v, loff_t *pos)
 100{
 101        (*pos)++;
 102        return rb_next((struct rb_node *) v);
 103}
 104
 105static const struct seq_operations proc_nommu_region_list_seqop = {
 106        .start  = nommu_region_list_start,
 107        .next   = nommu_region_list_next,
 108        .stop   = nommu_region_list_stop,
 109        .show   = nommu_region_list_show
 110};
 111
 112static int __init proc_nommu_init(void)
 113{
 114        proc_create_seq("maps", S_IRUGO, NULL, &proc_nommu_region_list_seqop);
 115        return 0;
 116}
 117
 118fs_initcall(proc_nommu_init);
 119