root/fs/proc/nommu.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. nommu_region_show
  2. nommu_region_list_show
  3. nommu_region_list_start
  4. nommu_region_list_stop
  5. nommu_region_list_next
  6. proc_nommu_init

   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  */
  33 static 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  */
  74 static 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 
  81 static 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 
  94 static void nommu_region_list_stop(struct seq_file *m, void *v)
  95 {
  96         up_read(&nommu_region_sem);
  97 }
  98 
  99 static 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 
 105 static 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 
 112 static 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 
 118 fs_initcall(proc_nommu_init);

/* [<][>][^][v][top][bottom][index][help] */