Blame view

fs/proc/nommu.c 3.25 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  /* nommu.c: mmu-less memory info files
   *
   * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
   * Written by David Howells (dhowells@redhat.com)
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version
   * 2 of the License, or (at your option) any later version.
   */
  
  #include <linux/init.h>
  #include <linux/module.h>
  #include <linux/errno.h>
  #include <linux/time.h>
  #include <linux/kernel.h>
  #include <linux/string.h>
  #include <linux/mman.h>
  #include <linux/proc_fs.h>
  #include <linux/mm.h>
  #include <linux/mmzone.h>
  #include <linux/pagemap.h>
  #include <linux/swap.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24
25
26
27
28
29
30
31
32
33
34
  #include <linux/smp.h>
  #include <linux/seq_file.h>
  #include <linux/hugetlb.h>
  #include <linux/vmalloc.h>
  #include <asm/uaccess.h>
  #include <asm/pgtable.h>
  #include <asm/tlb.h>
  #include <asm/div64.h>
  #include "internal.h"
  
  /*
8feae1311   David Howells   NOMMU: Make VMAs ...
35
   * display a single region to a sequenced file
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
36
   */
8feae1311   David Howells   NOMMU: Make VMAs ...
37
  static int nommu_region_show(struct seq_file *m, struct vm_region *region)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
38
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
40
41
42
  	unsigned long ino = 0;
  	struct file *file;
  	dev_t dev = 0;
  	int flags, len;
8feae1311   David Howells   NOMMU: Make VMAs ...
43
44
  	flags = region->vm_flags;
  	file = region->vm_file;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
  
  	if (file) {
8feae1311   David Howells   NOMMU: Make VMAs ...
47
  		struct inode *inode = region->vm_file->f_path.dentry->d_inode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
50
51
52
  		dev = inode->i_sb->s_dev;
  		ino = inode->i_ino;
  	}
  
  	seq_printf(m,
1804dc6e1   Clement Calmels   /proc/self/maps d...
53
  		   "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n",
8feae1311   David Howells   NOMMU: Make VMAs ...
54
55
  		   region->vm_start,
  		   region->vm_end,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
57
58
59
  		   flags & VM_READ ? 'r' : '-',
  		   flags & VM_WRITE ? 'w' : '-',
  		   flags & VM_EXEC ? 'x' : '-',
  		   flags & VM_MAYSHARE ? flags & VM_SHARED ? 'S' : 's' : 'p',
8feae1311   David Howells   NOMMU: Make VMAs ...
60
  		   ((loff_t)region->vm_pgoff) << PAGE_SHIFT,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
64
65
66
67
  		   MAJOR(dev), MINOR(dev), ino, &len);
  
  	if (file) {
  		len = 25 + sizeof(void *) * 6 - len;
  		if (len < 1)
  			len = 1;
  		seq_printf(m, "%*c", len, ' ');
c32c2f63a   Jan Blunck   d_path: Make seq_...
68
  		seq_path(m, &file->f_path, "");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
73
74
  	}
  
  	seq_putc(m, '
  ');
  	return 0;
  }
dbf8685c8   David Howells   [PATCH] NOMMU: Im...
75
  /*
8feae1311   David Howells   NOMMU: Make VMAs ...
76
   * display a list of all the REGIONs the kernel knows about
973c32beb   Uwe Kleine-König   trivial: fix typo...
77
   * - nommu kernels have a single flat list
dbf8685c8   David Howells   [PATCH] NOMMU: Im...
78
   */
8feae1311   David Howells   NOMMU: Make VMAs ...
79
  static int nommu_region_list_show(struct seq_file *m, void *_p)
dbf8685c8   David Howells   [PATCH] NOMMU: Im...
80
  {
8feae1311   David Howells   NOMMU: Make VMAs ...
81
  	struct rb_node *p = _p;
dbf8685c8   David Howells   [PATCH] NOMMU: Im...
82

8feae1311   David Howells   NOMMU: Make VMAs ...
83
  	return nommu_region_show(m, rb_entry(p, struct vm_region, vm_rb));
dbf8685c8   David Howells   [PATCH] NOMMU: Im...
84
  }
8feae1311   David Howells   NOMMU: Make VMAs ...
85
  static void *nommu_region_list_start(struct seq_file *m, loff_t *_pos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
86
  {
8feae1311   David Howells   NOMMU: Make VMAs ...
87
  	struct rb_node *p;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
88
  	loff_t pos = *_pos;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89

8feae1311   David Howells   NOMMU: Make VMAs ...
90
  	down_read(&nommu_region_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
91

8feae1311   David Howells   NOMMU: Make VMAs ...
92
93
94
95
  	for (p = rb_first(&nommu_region_tree); p; p = rb_next(p))
  		if (pos-- == 0)
  			return p;
  	return NULL;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
  }
8feae1311   David Howells   NOMMU: Make VMAs ...
97
  static void nommu_region_list_stop(struct seq_file *m, void *v)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
98
  {
8feae1311   David Howells   NOMMU: Make VMAs ...
99
  	up_read(&nommu_region_sem);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
  }
8feae1311   David Howells   NOMMU: Make VMAs ...
101
  static void *nommu_region_list_next(struct seq_file *m, void *v, loff_t *pos)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
102
103
104
105
  {
  	(*pos)++;
  	return rb_next((struct rb_node *) v);
  }
88e9d34c7   James Morris   seq_file: constif...
106
  static const struct seq_operations proc_nommu_region_list_seqop = {
8feae1311   David Howells   NOMMU: Make VMAs ...
107
108
109
110
  	.start	= nommu_region_list_start,
  	.next	= nommu_region_list_next,
  	.stop	= nommu_region_list_stop,
  	.show	= nommu_region_list_show
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
  };
8feae1311   David Howells   NOMMU: Make VMAs ...
112
  static int proc_nommu_region_list_open(struct inode *inode, struct file *file)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
113
  {
8feae1311   David Howells   NOMMU: Make VMAs ...
114
  	return seq_open(file, &proc_nommu_region_list_seqop);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
115
  }
8feae1311   David Howells   NOMMU: Make VMAs ...
116
117
  static const struct file_operations proc_nommu_region_list_operations = {
  	.open    = proc_nommu_region_list_open,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
119
120
121
122
123
124
  	.read    = seq_read,
  	.llseek  = seq_lseek,
  	.release = seq_release,
  };
  
  static int __init proc_nommu_init(void)
  {
8feae1311   David Howells   NOMMU: Make VMAs ...
125
  	proc_create("maps", S_IRUGO, NULL, &proc_nommu_region_list_operations);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
126
127
128
129
  	return 0;
  }
  
  module_init(proc_nommu_init);