138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin/*
238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 1994-1996 Rick Sladkey <jrs@world.std.com>
338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 1996-2000 Wichert Akkerman <wichert@cistron.nl>
438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2005-2007 Roland McGrath <roland@redhat.com>
538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2008-2015 Dmitry V. Levin <ldv@altlinux.org>
638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * All rights reserved.
738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *
838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Redistribution and use in source and binary forms, with or without
938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * modification, are permitted provided that the following conditions
1038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * are met:
1138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright
1238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    notice, this list of conditions and the following disclaimer.
1338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright
1438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    notice, this list of conditions and the following disclaimer in the
1538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    documentation and/or other materials provided with the distribution.
1638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products
1738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *    derived from this software without specific prior written permission.
1838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin *
1938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
2138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin */
3038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin
3153c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#include "defs.h"
3253c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin
33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include <linux/prctl.h>
3453c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin
3553c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#include "xlat/prctl_options.h"
36eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin#include "xlat/pr_cap_ambient.h"
37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/pr_dumpable.h"
38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#include "xlat/pr_fp_mode.h"
391e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/pr_mce_kill.h"
401e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/pr_mce_kill_policy.h"
411e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/pr_set_mm.h"
421e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/pr_tsc.h"
43eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin#include "xlat/pr_unalign_flags.h"
4453c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin
451e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#ifndef TASK_COMM_LEN
461e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin# define TASK_COMM_LEN 16
4753c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#endif
4853c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin
492af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin#ifdef HAVE_LINUX_SECCOMP_H
502af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin# include <linux/seccomp.h>
512af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin#endif
522af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin#include "xlat/seccomp_mode.h"
532af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin
541e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#ifdef HAVE_LINUX_SECUREBITS_H
551e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin# include <linux/securebits.h>
561e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#endif
571e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/secbits.h"
581e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
591e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin/* these constants are the same as in <linux/capability.h> */
601e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levinenum {
611e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "caps0.h"
621e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "caps1.h"
631e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin};
641e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
651e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin#include "xlat/cap.h"
661e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
673691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levinstatic void
683691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levinprint_prctl_args(struct tcb *tcp, const unsigned int first)
693691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin{
703691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin	unsigned int i;
713691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin
723691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin	for (i = first; i < tcp->s_ent->nargs; ++i)
73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tprintf(", %#" PRI_klx, tcp->u_arg[i]);
743691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin}
753691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin
76210a6b688479718519d6231c24722438a963732eDmitry V. LevinSYS_FUNC(prctl)
7753c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin{
78b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin	const unsigned int option = tcp->u_arg[0];
79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const kernel_ulong_t arg2 = tcp->u_arg[1];
80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const kernel_ulong_t arg3 = tcp->u_arg[2];
81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	/*
82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * PR_SET_VMA is the only command which actually uses these arguments
83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 * currently, and it is available only on Android for now.
84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	 */
85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#ifdef __ANDROID__
86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const kernel_ulong_t arg4 = tcp->u_arg[3];
87d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const kernel_ulong_t arg5 = tcp->u_arg[4];
88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#endif
8953c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin	unsigned int i;
9053c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin
91210a6b688479718519d6231c24722438a963732eDmitry V. Levin	if (entering(tcp))
92b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin		printxval(prctl_options, option, "PR_???");
931e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
94b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin	switch (option) {
95210a6b688479718519d6231c24722438a963732eDmitry V. Levin	case PR_GET_KEEPCAPS:
96210a6b688479718519d6231c24722438a963732eDmitry V. Levin	case PR_GET_SECCOMP:
97210a6b688479718519d6231c24722438a963732eDmitry V. Levin	case PR_GET_TIMERSLACK:
98210a6b688479718519d6231c24722438a963732eDmitry V. Levin	case PR_GET_TIMING:
991b283307d1a6ffbeb14aa8f76f85ddf506c568deDmitry V. Levin		return RVAL_DECODED;
100210a6b688479718519d6231c24722438a963732eDmitry V. Levin
101210a6b688479718519d6231c24722438a963732eDmitry V. Levin	case PR_GET_CHILD_SUBREAPER:
1021e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_GET_ENDIAN:
1031e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_GET_FPEMU:
1041e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_GET_FPEXC:
105210a6b688479718519d6231c24722438a963732eDmitry V. Levin		if (entering(tcp))
106210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints(", ");
107210a6b688479718519d6231c24722438a963732eDmitry V. Levin		else
108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printnum_int(tcp, arg2, "%u");
109210a6b688479718519d6231c24722438a963732eDmitry V. Levin		break;
110210a6b688479718519d6231c24722438a963732eDmitry V. Levin
111d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	case PR_GET_DUMPABLE:
112210a6b688479718519d6231c24722438a963732eDmitry V. Levin		if (entering(tcp))
113d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			break;
114d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (syserror(tcp))
115d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			return 0;
116d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tcp->auxstr = xlookup(pr_dumpable, (kernel_ulong_t) tcp->u_rval);
117d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return RVAL_STR;
118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	case PR_GET_NAME:
120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (entering(tcp)) {
121210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints(", ");
122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} else {
123210a6b688479718519d6231c24722438a963732eDmitry V. Levin			if (syserror(tcp))
124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printaddr(arg2);
125210a6b688479718519d6231c24722438a963732eDmitry V. Levin			else
126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				printstr_ex(tcp, arg2, TASK_COMM_LEN,
127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					    QUOTE_0_TERMINATED);
128210a6b688479718519d6231c24722438a963732eDmitry V. Levin		}
129210a6b688479718519d6231c24722438a963732eDmitry V. Levin		break;
130210a6b688479718519d6231c24722438a963732eDmitry V. Levin
1311e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_GET_PDEATHSIG:
132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (entering(tcp)) {
133210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints(", ");
134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} else if (!umove_or_printaddr(tcp, arg2, &i)) {
135210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints("[");
136210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints(signame(i));
137210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints("]");
138210a6b688479718519d6231c24722438a963732eDmitry V. Levin		}
139210a6b688479718519d6231c24722438a963732eDmitry V. Levin		break;
140210a6b688479718519d6231c24722438a963732eDmitry V. Levin
1411e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_GET_SECUREBITS:
142210a6b688479718519d6231c24722438a963732eDmitry V. Levin		if (entering(tcp))
143210a6b688479718519d6231c24722438a963732eDmitry V. Levin			break;
144210a6b688479718519d6231c24722438a963732eDmitry V. Levin		if (syserror(tcp) || tcp->u_rval == 0)
145210a6b688479718519d6231c24722438a963732eDmitry V. Levin			return 0;
1466274ecc75223ea05abe838b3936b0616210f3a23Dmitry V. Levin		tcp->auxstr = sprintflags("", secbits,
147d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					  (kernel_ulong_t) tcp->u_rval);
148210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_STR;
149210a6b688479718519d6231c24722438a963732eDmitry V. Levin
1501e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_GET_TID_ADDRESS:
151210a6b688479718519d6231c24722438a963732eDmitry V. Levin		if (entering(tcp))
152210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints(", ");
153210a6b688479718519d6231c24722438a963732eDmitry V. Levin		else
154d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printnum_kptr(tcp, arg2);
155210a6b688479718519d6231c24722438a963732eDmitry V. Levin		break;
156210a6b688479718519d6231c24722438a963732eDmitry V. Levin
1571e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_GET_TSC:
158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (entering(tcp)) {
159210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints(", ");
160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} else if (!umove_or_printaddr(tcp, arg2, &i)) {
161210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints("[");
162210a6b688479718519d6231c24722438a963732eDmitry V. Levin			printxval(pr_tsc, i, "PR_TSC_???");
163210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints("]");
164210a6b688479718519d6231c24722438a963732eDmitry V. Levin		}
165210a6b688479718519d6231c24722438a963732eDmitry V. Levin		break;
166210a6b688479718519d6231c24722438a963732eDmitry V. Levin
1671e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_GET_UNALIGN:
168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (entering(tcp)) {
169210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints(", ");
170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		} else if (!umove_or_printaddr(tcp, arg2, &i)) {
171210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints("[");
172210a6b688479718519d6231c24722438a963732eDmitry V. Levin			printflags(pr_unalign_flags, i, "PR_UNALIGN_???");
173210a6b688479718519d6231c24722438a963732eDmitry V. Levin			tprints("]");
174210a6b688479718519d6231c24722438a963732eDmitry V. Levin		}
175210a6b688479718519d6231c24722438a963732eDmitry V. Levin		break;
176210a6b688479718519d6231c24722438a963732eDmitry V. Levin
177d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	case PR_GET_FP_MODE:
178d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (entering(tcp))
179d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			break;
180d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (syserror(tcp) || tcp->u_rval == 0)
181d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			return 0;
182d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tcp->auxstr = sprintflags("", pr_fp_mode,
183d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes					  (kernel_ulong_t) tcp->u_rval);
184d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return RVAL_STR;
185d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
186210a6b688479718519d6231c24722438a963732eDmitry V. Levin	/* PR_TASK_PERF_EVENTS_* take no arguments. */
1871e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_TASK_PERF_EVENTS_DISABLE:
1881e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_TASK_PERF_EVENTS_ENABLE:
189210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
1902af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin
1911e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_CHILD_SUBREAPER:
1921e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_ENDIAN:
1931e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_FPEMU:
1941e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_FPEXC:
1951e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_KEEPCAPS:
1961e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_TIMING:
197d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tprintf(", %" PRI_klu, arg2);
198d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return RVAL_DECODED;
199d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
200d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	case PR_SET_DUMPABLE:
201d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tprints(", ");
202d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printxval64(pr_dumpable, arg2, "SUID_DUMP_???");
203210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
2041e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
2051e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_CAPBSET_DROP:
2061b283307d1a6ffbeb14aa8f76f85ddf506c568deDmitry V. Levin	case PR_CAPBSET_READ:
2071e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
208d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printxval64(cap, arg2, "CAP_???");
209210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
210210a6b688479718519d6231c24722438a963732eDmitry V. Levin
211eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin	case PR_CAP_AMBIENT:
212eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin		tprints(", ");
213d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printxval64(pr_cap_ambient, arg2,
214c5f6863a18976ed448026c6673517e24ffa29fc3Dmitry V. Levin			       "PR_CAP_AMBIENT_???");
215d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		switch (arg2) {
216eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin		case PR_CAP_AMBIENT_RAISE:
217eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin		case PR_CAP_AMBIENT_LOWER:
218eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin		case PR_CAP_AMBIENT_IS_SET:
219eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin			tprints(", ");
220d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printxval64(cap, arg3, "CAP_???");
221eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin			print_prctl_args(tcp, 3);
222eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin			break;
223eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin		default:
224eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin			print_prctl_args(tcp, 2);
225eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin			break;
226eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin		}
227eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin		return RVAL_DECODED;
228eb76c4be150102e5ddf2f2cf90673d8d7cda9afdDmitry V. Levin
2291e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_MCE_KILL:
2301e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
231d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printxval64(pr_mce_kill, arg2, "PR_MCE_KILL_???");
2321e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
233d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (PR_MCE_KILL_SET == arg2)
234d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printxval64(pr_mce_kill_policy, arg3,
235d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				    "PR_MCE_KILL_???");
2361e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		else
237d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			tprintf("%#" PRI_klx, arg3);
2383691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin		print_prctl_args(tcp, 3);
239210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
2401e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
2411e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_NAME:
2421e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
243d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printstr_ex(tcp, arg2, TASK_COMM_LEN - 1,
244d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			    QUOTE_0_TERMINATED);
245210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
2461e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
2471d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes#ifdef __ANDROID__
2481d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes# ifndef PR_SET_VMA_ANON_NAME
2491d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes#  define PR_SET_VMA_ANON_NAME    0
2501d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes# endif
2511d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes	case PR_SET_VMA:
252d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (arg2 == PR_SET_VMA_ANON_NAME) {
253d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			tprintf(", PR_SET_VMA_ANON_NAME, %#" PRI_klx, arg3);
254d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			tprintf(", %" PRI_klu ", ", arg4);
255d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printstr(tcp, arg5);
2561d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes		} else {
2571d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes			/* There are no other sub-options now, but there
2581d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes			 * might be in future... */
2591d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes			print_prctl_args(tcp, 1);
2601d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes		}
2611d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes		return RVAL_DECODED;
2621d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes#endif
2631d246ce3d474829c505794a52a63435e7c9a2501Elliott Hughes
2641e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_MM:
2651e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
266d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printxval(pr_set_mm, arg2, "PR_SET_MM_???");
2673691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin		print_prctl_args(tcp, 2);
268210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
2691e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
2701e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_PDEATHSIG:
2711e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
272d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (arg2 > 128)
273d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			tprintf("%" PRI_klu, arg2);
2741e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		else
275d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			tprints(signame(arg2));
276210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
2771e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
2781e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_PTRACER:
2791e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
280d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if ((int) arg2 == -1)
2811e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin			tprints("PR_SET_PTRACER_ANY");
2821e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		else
283d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			tprintf("%" PRI_klu, arg2);
284210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
2851e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
2861e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_SECCOMP:
2871e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
288d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printxval64(seccomp_mode, arg2,
289d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			    "SECCOMP_MODE_???");
290d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (SECCOMP_MODE_STRICT == arg2)
291210a6b688479718519d6231c24722438a963732eDmitry V. Levin			return RVAL_DECODED;
292d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		if (SECCOMP_MODE_FILTER == arg2) {
2932af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin			tprints(", ");
294d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			print_seccomp_filter(tcp, arg3);
295210a6b688479718519d6231c24722438a963732eDmitry V. Levin			return RVAL_DECODED;
2961e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		}
2973691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin		print_prctl_args(tcp, 2);
298210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
2992af6903f456b549fd57ba8beceddec961803cb3dDmitry V. Levin
3001e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_SECUREBITS:
3011e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
302d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags64(secbits, arg2, "SECBIT_???");
303210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
3041e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
3051e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_TIMERSLACK:
306d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tprintf(", %" PRI_kld, arg2);
307210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
3081e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
3091e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_TSC:
3101e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
311d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printxval(pr_tsc, arg2, "PR_TSC_???");
312210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
3131e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
3141e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_UNALIGN:
3151e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		tprints(", ");
316d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags(pr_unalign_flags, arg2, "PR_UNALIGN_???");
317210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
3181e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
3191e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_NO_NEW_PRIVS:
3201e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_SET_THP_DISABLE:
321d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tprintf(", %" PRI_klu, arg2);
3223691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin		print_prctl_args(tcp, 2);
323210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
3241e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
3251e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case PR_MCE_KILL_GET:
3263691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin		if (entering(tcp)) {
3273691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin			print_prctl_args(tcp, 1);
3283691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin			return 0;
3293691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin		}
3301e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		if (syserror(tcp))
3311e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin			return 0;
3329134aab4073a8be6bb529aeb05e8c5f4be69540fDmitry V. Levin		tcp->auxstr = xlookup(pr_mce_kill_policy,
333d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes				      (kernel_ulong_t) tcp->u_rval);
3341e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		return tcp->auxstr ? RVAL_STR : RVAL_UDECIMAL;
3351e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
336d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	case PR_SET_FP_MODE:
337d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		tprints(", ");
338d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		printflags(pr_fp_mode, arg2, "PR_FP_MODE_???");
339d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		return RVAL_DECODED;
340d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
3411b283307d1a6ffbeb14aa8f76f85ddf506c568deDmitry V. Levin	case PR_GET_NO_NEW_PRIVS:
3421b283307d1a6ffbeb14aa8f76f85ddf506c568deDmitry V. Levin	case PR_GET_THP_DISABLE:
343210a6b688479718519d6231c24722438a963732eDmitry V. Levin	case PR_MPX_DISABLE_MANAGEMENT:
344210a6b688479718519d6231c24722438a963732eDmitry V. Levin	case PR_MPX_ENABLE_MANAGEMENT:
3451e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	default:
3463691562e7dc030047048cd9ef993ab1bf4c69dceDmitry V. Levin		print_prctl_args(tcp, 1);
347210a6b688479718519d6231c24722438a963732eDmitry V. Levin		return RVAL_DECODED;
34853c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin	}
34953c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin	return 0;
35053c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin}
35153c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin
35253c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#if defined X86_64 || defined X32
35353c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin# include <asm/prctl.h>
35453c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin# include "xlat/archvals.h"
35553c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin
356a0bd3749fc6fdf6364c1e269a4c02e8c153eb84bDmitry V. LevinSYS_FUNC(arch_prctl)
35753c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin{
358b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin	const unsigned int option = tcp->u_arg[0];
359d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	const kernel_ulong_t addr = tcp->u_arg[1];
360b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin
3611e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	if (entering(tcp))
362b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin		printxval(archvals, option, "ARCH_???");
3631e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
364b8eec608faee56727da2d4b81317064a0f6851f3Dmitry V. Levin	switch (option) {
3651e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case ARCH_GET_GS:
3661e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin	case ARCH_GET_FS:
367210a6b688479718519d6231c24722438a963732eDmitry V. Levin		if (entering(tcp))
3681e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin			tprints(", ");
369210a6b688479718519d6231c24722438a963732eDmitry V. Levin		else
370d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			printnum_ptr(tcp, addr);
3711e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin		return 0;
37253c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin	}
3731e880730539b5d95d63345faf89409b0ed7b87d6Dmitry V. Levin
374d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	tprintf(", %#" PRI_klx, addr);
375210a6b688479718519d6231c24722438a963732eDmitry V. Levin	return RVAL_DECODED;
37653c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin}
37753c993d9c1455faca61560ba78c6399fa489169eDmitry V. Levin#endif /* X86_64 || X32 */
378