1 /*	$OpenBSD: procfs_linux.c,v 1.6 2005/04/21 23:28:55 deraadt 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
procfs_domeminfo(struct proc * curp,struct proc * p,struct pfsnode * pfs,struct uio * uio)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
procfs_docpuinfo(struct proc * curp,struct proc * p,struct pfsnode * pfs,struct uio * uio)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
procfs_getcpuinfstr(buf,len)129 procfs_getcpuinfstr(buf, len)
130 	char *buf;
131 	int *len;
132 {
133 	*len = 0;
134 
135 	return 0;
136 }
137 #endif
138