1 /* $OpenBSD: procfs_linux.c,v 1.8 2007/06/18 08:30:07 jasper Exp $ */
2 /* $NetBSD: procfs_linux.c,v 1.2.4.1 2001/03/30 21:48:11 he Exp $ */
3
4 /*
5 * Copyright (c) 2001 Wasabi Systems, Inc.
6 * All rights reserved.
7 *
8 * Written by Frank van der Linden for Wasabi Systems, Inc.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed for the NetBSD Project by
21 * Wasabi Systems, Inc.
22 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
23 * or promote products derived from this software without specific prior
24 * written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39 #include <sys/param.h>
40 #include <sys/systm.h>
41 #include <sys/time.h>
42 #include <sys/kernel.h>
43 #include <sys/proc.h>
44 #include <sys/vnode.h>
45
46 #include <miscfs/procfs/procfs.h>
47
48 #include <uvm/uvm_extern.h>
49
50 #define PGTOB(p) ((unsigned long)(p) << PAGE_SHIFT)
51 #define PGTOKB(p) ((unsigned long)(p) << (PAGE_SHIFT - 10))
52
53 /*
54 * Linux compatible /proc/meminfo. Only active when the -o linux
55 * mountflag is used.
56 */
57 int
58 procfs_domeminfo(struct proc *curp, struct proc *p, struct pfsnode *pfs,
59 struct uio *uio)
60 {
61 char buf[512], *cp;
62 int len, error;
63
64 len = snprintf(buf, sizeof buf,
65 " total: used: free: shared: buffers: cached:\n"
66 "Mem: %8lu %8lu %8lu %8lu %8lu %8lu\n"
67 "Swap: %8lu %8lu %8lu\n"
68 "MemTotal: %8lu kB\n"
69 "MemFree: %8lu kB\n"
70 "MemShared: %8lu kB\n"
71 "Buffers: %8lu kB\n"
72 "Cached: %8lu kB\n"
73 "SwapTotal: %8lu kB\n"
74 "SwapFree: %8lu kB\n",
75 PGTOB(uvmexp.npages),
76 PGTOB(uvmexp.npages - uvmexp.free),
77 PGTOB(uvmexp.free),
78 0L,
79 0L,
80 0L,
81 PGTOB(uvmexp.swpages),
82 PGTOB(uvmexp.swpginuse),
83 PGTOB(uvmexp.swpages - uvmexp.swpginuse),
84 PGTOKB(uvmexp.npages),
85 PGTOKB(uvmexp.free),
86 0L,
87 0L,
88 0L,
89 PGTOKB(uvmexp.swpages),
90 PGTOKB(uvmexp.swpages - uvmexp.swpginuse));
91
92 if (len <= 0 || len >= sizeof buf ||
93 len < uio->uio_offset || uio->uio_resid == 0)
94 return EINVAL;
95
96 len -= uio->uio_offset;
97 cp = buf + uio->uio_offset;
98 len = imin(len, uio->uio_resid);
99 error = uiomove(cp, len, uio);
100 return error;
101 }
102
103 int
104 procfs_docpuinfo(struct proc *curp, struct proc *p, struct pfsnode *pfs,
105 struct uio *uio)
106 {
107 char buf[512], *cp;
108 int len, error;
109
110 len = sizeof buf;
111 if (procfs_getcpuinfstr(buf, &len) < 0)
112 return EIO;
113
114 if (len == 0 || uio->uio_offset > sizeof(buf))
115 return 0;
116
117 len -= uio->uio_offset;
118 cp = buf + uio->uio_offset;
119 len = imin(len, uio->uio_resid);
120 if (len <= 0)
121 error = 0;
122 else
123 error = uiomove(cp, len, uio);
124 return error;
125 }
126
127 #ifndef __i386__
128 int
129 procfs_getcpuinfstr(char *buf, int *len)
130 {
131 *len = 0;
132
133 return 0;
134 }
135 #endif