1d167cf6fSWarner Losh /*-
2df57947fSPedro F. Giffuni * SPDX-License-Identifier: BSD-4-Clause
3df57947fSPedro F. Giffuni *
49a14aa01SUlrich Spörlein * Copyright (c) 2001 Dag-Erling Smørgrav
53a669c52SDag-Erling Smørgrav * Copyright (c) 1993 Jan-Simon Pendry
63a669c52SDag-Erling Smørgrav * Copyright (c) 1993
73a669c52SDag-Erling Smørgrav * The Regents of the University of California. All rights reserved.
83a669c52SDag-Erling Smørgrav *
93a669c52SDag-Erling Smørgrav * This code is derived from software contributed to Berkeley by
103a669c52SDag-Erling Smørgrav * Jan-Simon Pendry.
113a669c52SDag-Erling Smørgrav *
123a669c52SDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without
133a669c52SDag-Erling Smørgrav * modification, are permitted provided that the following conditions
143a669c52SDag-Erling Smørgrav * are met:
153a669c52SDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright
163a669c52SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer.
173a669c52SDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright
183a669c52SDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the
193a669c52SDag-Erling Smørgrav * documentation and/or other materials provided with the distribution.
203a669c52SDag-Erling Smørgrav * 3. All advertising materials mentioning features or use of this software
213a669c52SDag-Erling Smørgrav * must display the following acknowledgement:
223a669c52SDag-Erling Smørgrav * This product includes software developed by the University of
233a669c52SDag-Erling Smørgrav * California, Berkeley and its contributors.
243a669c52SDag-Erling Smørgrav * 4. Neither the name of the University nor the names of its contributors
253a669c52SDag-Erling Smørgrav * may be used to endorse or promote products derived from this software
263a669c52SDag-Erling Smørgrav * without specific prior written permission.
273a669c52SDag-Erling Smørgrav *
283a669c52SDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
293a669c52SDag-Erling Smørgrav * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
303a669c52SDag-Erling Smørgrav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
313a669c52SDag-Erling Smørgrav * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
323a669c52SDag-Erling Smørgrav * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
333a669c52SDag-Erling Smørgrav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
343a669c52SDag-Erling Smørgrav * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
353a669c52SDag-Erling Smørgrav * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
363a669c52SDag-Erling Smørgrav * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
373a669c52SDag-Erling Smørgrav * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
383a669c52SDag-Erling Smørgrav * SUCH DAMAGE.
393a669c52SDag-Erling Smørgrav */
403a669c52SDag-Erling Smørgrav
413a669c52SDag-Erling Smørgrav #include <sys/param.h>
423a669c52SDag-Erling Smørgrav #include <sys/queue.h>
433a669c52SDag-Erling Smørgrav #include <sys/exec.h>
443a669c52SDag-Erling Smørgrav #include <sys/lock.h>
453a669c52SDag-Erling Smørgrav #include <sys/kernel.h>
463a669c52SDag-Erling Smørgrav #include <sys/malloc.h>
473a669c52SDag-Erling Smørgrav #include <sys/mount.h>
483a669c52SDag-Erling Smørgrav #include <sys/mutex.h>
493a669c52SDag-Erling Smørgrav #include <sys/proc.h>
503a669c52SDag-Erling Smørgrav #include <sys/sbuf.h>
513a669c52SDag-Erling Smørgrav #include <sys/sysproto.h>
523a669c52SDag-Erling Smørgrav #include <sys/systm.h>
533a669c52SDag-Erling Smørgrav #include <sys/vnode.h>
543a669c52SDag-Erling Smørgrav
553a669c52SDag-Erling Smørgrav #include <vm/vm.h>
563a669c52SDag-Erling Smørgrav #include <vm/pmap.h>
573a669c52SDag-Erling Smørgrav #include <vm/vm_param.h>
583a669c52SDag-Erling Smørgrav
593a669c52SDag-Erling Smørgrav #include <fs/pseudofs/pseudofs.h>
603a669c52SDag-Erling Smørgrav #include <fs/procfs/procfs.h>
613a669c52SDag-Erling Smørgrav
623a669c52SDag-Erling Smørgrav /*
639ae9a3d4SJohn Baldwin * Filler function for proc/pid/file
643a669c52SDag-Erling Smørgrav */
654aac2aa9SDag-Erling Smørgrav int
procfs_doprocfile(PFS_FILL_ARGS)663a669c52SDag-Erling Smørgrav procfs_doprocfile(PFS_FILL_ARGS)
673a669c52SDag-Erling Smørgrav {
68e5248548SKonstantin Belousov char *fullpath, *freepath, *binpath;
694c023a33SKonstantin Belousov int error;
703a669c52SDag-Erling Smørgrav
714c023a33SKonstantin Belousov freepath = NULL;
72e5248548SKonstantin Belousov binpath = malloc(MAXPATHLEN, M_TEMP, M_WAITOK);
732ff47c5fSJohn Baldwin PROC_LOCK(p);
74e5248548SKonstantin Belousov error = proc_get_binpath(p, binpath, &fullpath, &freepath);
754c023a33SKonstantin Belousov if (error == 0)
7615bd9fa3SKonstantin Belousov sbuf_cat(sb, fullpath);
77e5248548SKonstantin Belousov free(binpath, M_TEMP);
783a669c52SDag-Erling Smørgrav free(freepath, M_TEMP);
794c023a33SKonstantin Belousov return (error);
803a669c52SDag-Erling Smørgrav }
813a669c52SDag-Erling Smørgrav
823a669c52SDag-Erling Smørgrav /*
833a669c52SDag-Erling Smørgrav * Filler function for proc/curproc
843a669c52SDag-Erling Smørgrav */
854aac2aa9SDag-Erling Smørgrav int
procfs_docurproc(PFS_FILL_ARGS)863a669c52SDag-Erling Smørgrav procfs_docurproc(PFS_FILL_ARGS)
873a669c52SDag-Erling Smørgrav {
883a669c52SDag-Erling Smørgrav sbuf_printf(sb, "%ld", (long)td->td_proc->p_pid);
893a669c52SDag-Erling Smørgrav return (0);
903a669c52SDag-Erling Smørgrav }
913a669c52SDag-Erling Smørgrav
92e07db022SEitan Adler static int
procfs_attr(PFS_ATTR_ARGS,int mode)93e07db022SEitan Adler procfs_attr(PFS_ATTR_ARGS, int mode) {
94e07db022SEitan Adler vap->va_mode = mode;
95655fcdaaSDag-Erling Smørgrav if (p != NULL) {
96655fcdaaSDag-Erling Smørgrav PROC_LOCK_ASSERT(p, MA_OWNED);
97655fcdaaSDag-Erling Smørgrav
983266c228SGuy Helmer if ((p->p_flag & P_SUGID) && pn->pn_type != pfstype_procdir)
993266c228SGuy Helmer vap->va_mode = 0;
100655fcdaaSDag-Erling Smørgrav }
1013a669c52SDag-Erling Smørgrav
1023a669c52SDag-Erling Smørgrav return (0);
1033a669c52SDag-Erling Smørgrav }
1043a669c52SDag-Erling Smørgrav
105e07db022SEitan Adler int
procfs_attr_all_rx(PFS_ATTR_ARGS)106e07db022SEitan Adler procfs_attr_all_rx(PFS_ATTR_ARGS)
107e07db022SEitan Adler {
108e07db022SEitan Adler
109e07db022SEitan Adler return (procfs_attr(td, p, pn, vap, 0555));
110e07db022SEitan Adler }
111e07db022SEitan Adler
112e07db022SEitan Adler int
procfs_attr_rw(PFS_ATTR_ARGS)113e07db022SEitan Adler procfs_attr_rw(PFS_ATTR_ARGS)
114e07db022SEitan Adler {
115e07db022SEitan Adler
116e07db022SEitan Adler return (procfs_attr(td, p, pn, vap, 0600));
117e07db022SEitan Adler }
118e07db022SEitan Adler
119e07db022SEitan Adler int
procfs_attr_w(PFS_ATTR_ARGS)120e07db022SEitan Adler procfs_attr_w(PFS_ATTR_ARGS)
121e07db022SEitan Adler {
122e07db022SEitan Adler
123e07db022SEitan Adler return (procfs_attr(td, p, pn, vap, 0200));
124e07db022SEitan Adler }
125e07db022SEitan Adler
1263a669c52SDag-Erling Smørgrav /*
1273a669c52SDag-Erling Smørgrav * Visibility: some files only exist for non-system processes
1283a669c52SDag-Erling Smørgrav * Non-static because linprocfs uses it.
1293a669c52SDag-Erling Smørgrav */
1303a669c52SDag-Erling Smørgrav int
procfs_notsystem(PFS_VIS_ARGS)1313a669c52SDag-Erling Smørgrav procfs_notsystem(PFS_VIS_ARGS)
1323a669c52SDag-Erling Smørgrav {
133c110b8e6SJohn Baldwin PROC_LOCK_ASSERT(p, MA_OWNED);
1343a669c52SDag-Erling Smørgrav return ((p->p_flag & P_SYSTEM) == 0);
1353a669c52SDag-Erling Smørgrav }
1363a669c52SDag-Erling Smørgrav
1373a669c52SDag-Erling Smørgrav /*
1383a669c52SDag-Erling Smørgrav * Visibility: some files are only visible to process that can debug
1393a669c52SDag-Erling Smørgrav * the target process.
1403a669c52SDag-Erling Smørgrav */
1413a669c52SDag-Erling Smørgrav int
procfs_candebug(PFS_VIS_ARGS)1423a669c52SDag-Erling Smørgrav procfs_candebug(PFS_VIS_ARGS)
1433a669c52SDag-Erling Smørgrav {
144f44d9e24SJohn Baldwin PROC_LOCK_ASSERT(p, MA_OWNED);
1457caaf6c9SDag-Erling Smørgrav return ((p->p_flag & P_SYSTEM) == 0 && p_candebug(td, p) == 0);
1463a669c52SDag-Erling Smørgrav }
1473a669c52SDag-Erling Smørgrav
1483a669c52SDag-Erling Smørgrav /*
1493a669c52SDag-Erling Smørgrav * Constructor
1503a669c52SDag-Erling Smørgrav */
1513a669c52SDag-Erling Smørgrav static int
procfs_init(PFS_INIT_ARGS)1523a669c52SDag-Erling Smørgrav procfs_init(PFS_INIT_ARGS)
1533a669c52SDag-Erling Smørgrav {
1543a669c52SDag-Erling Smørgrav struct pfs_node *root;
1553a669c52SDag-Erling Smørgrav struct pfs_node *dir;
1563a669c52SDag-Erling Smørgrav
1573a669c52SDag-Erling Smørgrav root = pi->pi_root;
1583a669c52SDag-Erling Smørgrav
159659d5e21SPoul-Henning Kamp pfs_create_link(root, "curproc", procfs_docurproc,
160771709ebSDag-Erling Smørgrav NULL, NULL, NULL, 0);
161*b75fa3a2SRicardo Branco pfs_create_link(root, "self", procfs_docurproc,
162*b75fa3a2SRicardo Branco NULL, NULL, NULL, 0);
1633a669c52SDag-Erling Smørgrav
1643a669c52SDag-Erling Smørgrav dir = pfs_create_dir(root, "pid",
165e07db022SEitan Adler procfs_attr_all_rx, NULL, NULL, PFS_PROCDEP);
166659d5e21SPoul-Henning Kamp pfs_create_file(dir, "cmdline", procfs_doproccmdline,
167771709ebSDag-Erling Smørgrav NULL, NULL, NULL, PFS_RD);
168659d5e21SPoul-Henning Kamp pfs_create_file(dir, "dbregs", procfs_doprocdbregs,
169e07db022SEitan Adler procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
170659d5e21SPoul-Henning Kamp pfs_create_file(dir, "etype", procfs_doproctype,
171771709ebSDag-Erling Smørgrav NULL, NULL, NULL, PFS_RD);
172659d5e21SPoul-Henning Kamp pfs_create_file(dir, "fpregs", procfs_doprocfpregs,
173e07db022SEitan Adler procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
174659d5e21SPoul-Henning Kamp pfs_create_file(dir, "map", procfs_doprocmap,
175771709ebSDag-Erling Smørgrav NULL, procfs_notsystem, NULL, PFS_RD);
17659838c1aSJohn Baldwin pfs_create_file(dir, "mem", procfs_doprocmem,
177e07db022SEitan Adler procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
178659d5e21SPoul-Henning Kamp pfs_create_file(dir, "note", procfs_doprocnote,
179e07db022SEitan Adler procfs_attr_w, procfs_candebug, NULL, PFS_WR);
180659d5e21SPoul-Henning Kamp pfs_create_file(dir, "notepg", procfs_doprocnote,
181e07db022SEitan Adler procfs_attr_w, procfs_candebug, NULL, PFS_WR);
182659d5e21SPoul-Henning Kamp pfs_create_file(dir, "regs", procfs_doprocregs,
183e07db022SEitan Adler procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR | PFS_RAW);
184659d5e21SPoul-Henning Kamp pfs_create_file(dir, "rlimit", procfs_doprocrlimit,
185771709ebSDag-Erling Smørgrav NULL, NULL, NULL, PFS_RD);
186659d5e21SPoul-Henning Kamp pfs_create_file(dir, "status", procfs_doprocstatus,
187771709ebSDag-Erling Smørgrav NULL, NULL, NULL, PFS_RD);
18817dfbc1cSKonstantin Belousov pfs_create_file(dir, "osrel", procfs_doosrel,
189e07db022SEitan Adler procfs_attr_rw, procfs_candebug, NULL, PFS_RDWR);
1903a669c52SDag-Erling Smørgrav
191659d5e21SPoul-Henning Kamp pfs_create_link(dir, "file", procfs_doprocfile,
192771709ebSDag-Erling Smørgrav NULL, procfs_notsystem, NULL, 0);
193*b75fa3a2SRicardo Branco pfs_create_link(dir, "exe", procfs_doprocfile,
194*b75fa3a2SRicardo Branco NULL, procfs_notsystem, NULL, 0);
1953a669c52SDag-Erling Smørgrav
1963a669c52SDag-Erling Smørgrav return (0);
1973a669c52SDag-Erling Smørgrav }
1983a669c52SDag-Erling Smørgrav
1993a669c52SDag-Erling Smørgrav /*
2003a669c52SDag-Erling Smørgrav * Destructor
2013a669c52SDag-Erling Smørgrav */
2023a669c52SDag-Erling Smørgrav static int
procfs_uninit(PFS_INIT_ARGS)2033a669c52SDag-Erling Smørgrav procfs_uninit(PFS_INIT_ARGS)
2043a669c52SDag-Erling Smørgrav {
2053a669c52SDag-Erling Smørgrav /* nothing to do, pseudofs will GC */
2063a669c52SDag-Erling Smørgrav return (0);
2073a669c52SDag-Erling Smørgrav }
2083a669c52SDag-Erling Smørgrav
2090e5c6bd4SJamie Gritton PSEUDOFS(procfs, 1, VFCF_JAIL);
210