blob: 568b5f7dfb622eee383bfa73a4f88e604e270c6d [file] [log] [blame]
Dmitry V. Levin38a34c92015-12-17 17:56:48 +00001/*
2 * Copyright (c) 1994-1996 Rick Sladkey <jrs@world.std.com>
3 * Copyright (c) 1996-2000 Wichert Akkerman <wichert@cistron.nl>
4 * Copyright (c) 2005-2007 Roland McGrath <roland@redhat.com>
5 * Copyright (c) 2008-2015 Dmitry V. Levin <ldv@altlinux.org>
Elliott Hughes28e98bc2018-06-14 16:59:04 -07006 * Copyright (c) 2014-2018 The strace developers.
Dmitry V. Levin38a34c92015-12-17 17:56:48 +00007 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 3. The name of the author may not be used to endorse or promote products
18 * derived from this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 */
31
Dmitry V. Levin53c993d2014-12-11 19:25:02 +000032#include "defs.h"
33
Elliott Hughesd35df492017-02-15 15:19:05 -080034#include <linux/prctl.h>
Dmitry V. Levin53c993d2014-12-11 19:25:02 +000035
Elliott Hughes28e98bc2018-06-14 16:59:04 -070036#include "xstring.h"
37
Dmitry V. Levin53c993d2014-12-11 19:25:02 +000038#include "xlat/prctl_options.h"
Dmitry V. Levineb76c4b2015-12-06 15:33:53 +000039#include "xlat/pr_cap_ambient.h"
Elliott Hughesd35df492017-02-15 15:19:05 -080040#include "xlat/pr_dumpable.h"
41#include "xlat/pr_fp_mode.h"
Dmitry V. Levin1e880732015-02-14 01:51:03 +000042#include "xlat/pr_mce_kill.h"
43#include "xlat/pr_mce_kill_policy.h"
44#include "xlat/pr_set_mm.h"
Elliott Hughes03a418e2018-06-15 13:11:40 -070045#include "xlat/pr_spec_cmds.h"
46#include "xlat/pr_spec_get_store_bypass_flags.h"
47#include "xlat/pr_spec_set_store_bypass_flags.h"
Elliott Hughes28e98bc2018-06-14 16:59:04 -070048#include "xlat/pr_sve_vl_flags.h"
Dmitry V. Levin1e880732015-02-14 01:51:03 +000049#include "xlat/pr_tsc.h"
Dmitry V. Levineb76c4b2015-12-06 15:33:53 +000050#include "xlat/pr_unalign_flags.h"
Dmitry V. Levin53c993d2014-12-11 19:25:02 +000051
Dmitry V. Levin1e880732015-02-14 01:51:03 +000052#ifndef TASK_COMM_LEN
53# define TASK_COMM_LEN 16
Dmitry V. Levin53c993d2014-12-11 19:25:02 +000054#endif
Dmitry V. Levin53c993d2014-12-11 19:25:02 +000055
Dmitry V. Levin2af69032015-02-04 23:50:50 +000056#ifdef HAVE_LINUX_SECCOMP_H
57# include <linux/seccomp.h>
58#endif
Dmitry V. Levin2af69032015-02-04 23:50:50 +000059#include "xlat/seccomp_mode.h"
60
Dmitry V. Levin1e880732015-02-14 01:51:03 +000061#ifdef HAVE_LINUX_SECUREBITS_H
62# include <linux/securebits.h>
63#endif
64#include "xlat/secbits.h"
65
66/* these constants are the same as in <linux/capability.h> */
67enum {
68#include "caps0.h"
69#include "caps1.h"
70};
71
72#include "xlat/cap.h"
73
Elliott Hughes28e98bc2018-06-14 16:59:04 -070074#ifndef PR_SVE_VL_LEN_MASK
75# define PR_SVE_VL_LEN_MASK 0xffff
76#endif
77
78
Dmitry V. Levin36915622015-07-25 09:43:01 +000079static void
80print_prctl_args(struct tcb *tcp, const unsigned int first)
81{
82 unsigned int i;
83
84 for (i = first; i < tcp->s_ent->nargs; ++i)
Elliott Hughesd35df492017-02-15 15:19:05 -080085 tprintf(", %#" PRI_klx, tcp->u_arg[i]);
Dmitry V. Levin36915622015-07-25 09:43:01 +000086}
87
Elliott Hughes28e98bc2018-06-14 16:59:04 -070088static char *
89sprint_sve_val(kernel_ulong_t arg)
90{
91 static char out[sizeof("PR_SVE_SET_VL_ONEXEC|PR_SVE_VL_INHERIT|0x") +
92 sizeof(kernel_ulong_t) * 2];
93
94 kernel_ulong_t vl = arg & PR_SVE_VL_LEN_MASK;
95 kernel_ulong_t flags = arg & ~PR_SVE_VL_LEN_MASK;
96 const char *flags_str = sprintflags("", pr_sve_vl_flags, flags);
97
98 xsprintf(out, "%s%s%#" PRI_klx,
99 flags_str ?: "", flags_str ? "|" : "", vl);
100
101 return out;
102}
103
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000104SYS_FUNC(prctl)
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000105{
Dmitry V. Levinb8eec602016-05-16 22:19:31 +0000106 const unsigned int option = tcp->u_arg[0];
Elliott Hughesd35df492017-02-15 15:19:05 -0800107 const kernel_ulong_t arg2 = tcp->u_arg[1];
108 const kernel_ulong_t arg3 = tcp->u_arg[2];
109 /*
110 * PR_SET_VMA is the only command which actually uses these arguments
111 * currently, and it is available only on Android for now.
112 */
113#ifdef __ANDROID__
114 const kernel_ulong_t arg4 = tcp->u_arg[3];
115 const kernel_ulong_t arg5 = tcp->u_arg[4];
116#endif
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000117 unsigned int i;
118
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000119 if (entering(tcp))
Dmitry V. Levinb8eec602016-05-16 22:19:31 +0000120 printxval(prctl_options, option, "PR_???");
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000121
Dmitry V. Levinb8eec602016-05-16 22:19:31 +0000122 switch (option) {
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000123 case PR_GET_KEEPCAPS:
124 case PR_GET_SECCOMP:
125 case PR_GET_TIMERSLACK:
126 case PR_GET_TIMING:
Dmitry V. Levin1b283302015-12-06 15:29:04 +0000127 return RVAL_DECODED;
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000128
129 case PR_GET_CHILD_SUBREAPER:
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000130 case PR_GET_ENDIAN:
131 case PR_GET_FPEMU:
132 case PR_GET_FPEXC:
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000133 if (entering(tcp))
134 tprints(", ");
135 else
Elliott Hughesd35df492017-02-15 15:19:05 -0800136 printnum_int(tcp, arg2, "%u");
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000137 break;
138
Elliott Hughesd35df492017-02-15 15:19:05 -0800139 case PR_GET_DUMPABLE:
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000140 if (entering(tcp))
Elliott Hughesd35df492017-02-15 15:19:05 -0800141 break;
142 if (syserror(tcp))
143 return 0;
144 tcp->auxstr = xlookup(pr_dumpable, (kernel_ulong_t) tcp->u_rval);
145 return RVAL_STR;
146
147 case PR_GET_NAME:
148 if (entering(tcp)) {
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000149 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800150 } else {
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000151 if (syserror(tcp))
Elliott Hughesd35df492017-02-15 15:19:05 -0800152 printaddr(arg2);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000153 else
Elliott Hughesd35df492017-02-15 15:19:05 -0800154 printstr_ex(tcp, arg2, TASK_COMM_LEN,
155 QUOTE_0_TERMINATED);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000156 }
157 break;
158
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000159 case PR_GET_PDEATHSIG:
Elliott Hughesd35df492017-02-15 15:19:05 -0800160 if (entering(tcp)) {
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000161 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800162 } else if (!umove_or_printaddr(tcp, arg2, &i)) {
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000163 tprints("[");
164 tprints(signame(i));
165 tprints("]");
166 }
167 break;
168
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000169 case PR_GET_SECUREBITS:
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000170 if (entering(tcp))
171 break;
172 if (syserror(tcp) || tcp->u_rval == 0)
173 return 0;
Dmitry V. Levin6274ecc2016-05-15 14:23:06 +0000174 tcp->auxstr = sprintflags("", secbits,
Elliott Hughesd35df492017-02-15 15:19:05 -0800175 (kernel_ulong_t) tcp->u_rval);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000176 return RVAL_STR;
177
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000178 case PR_GET_TID_ADDRESS:
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000179 if (entering(tcp))
180 tprints(", ");
181 else
Elliott Hughesd35df492017-02-15 15:19:05 -0800182 printnum_kptr(tcp, arg2);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000183 break;
184
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000185 case PR_GET_TSC:
Elliott Hughesd35df492017-02-15 15:19:05 -0800186 if (entering(tcp)) {
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000187 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800188 } else if (!umove_or_printaddr(tcp, arg2, &i)) {
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000189 tprints("[");
190 printxval(pr_tsc, i, "PR_TSC_???");
191 tprints("]");
192 }
193 break;
194
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000195 case PR_GET_UNALIGN:
Elliott Hughesd35df492017-02-15 15:19:05 -0800196 if (entering(tcp)) {
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000197 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800198 } else if (!umove_or_printaddr(tcp, arg2, &i)) {
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000199 tprints("[");
200 printflags(pr_unalign_flags, i, "PR_UNALIGN_???");
201 tprints("]");
202 }
203 break;
204
Elliott Hughesd35df492017-02-15 15:19:05 -0800205 case PR_GET_FP_MODE:
206 if (entering(tcp))
207 break;
208 if (syserror(tcp) || tcp->u_rval == 0)
209 return 0;
210 tcp->auxstr = sprintflags("", pr_fp_mode,
211 (kernel_ulong_t) tcp->u_rval);
212 return RVAL_STR;
213
Elliott Hughes28e98bc2018-06-14 16:59:04 -0700214 case PR_SVE_SET_VL:
215 if (entering(tcp)) {
216 tprintf(", %s", sprint_sve_val(arg2));
217 return 0;
218 }
219 ATTRIBUTE_FALLTHROUGH;
220
221 case PR_SVE_GET_VL:
222 if (entering(tcp))
223 break;
224 if (syserror(tcp) || tcp->u_rval == 0)
225 return 0;
226
227 tcp->auxstr = sprint_sve_val(tcp->u_rval);
228
229 return RVAL_STR;
230
Elliott Hughes03a418e2018-06-15 13:11:40 -0700231 case PR_GET_SPECULATION_CTRL:
232 if (entering(tcp)) {
233 tprints(", ");
234 printxval64(pr_spec_cmds, arg2, "PR_SPEC_???");
235
236 break;
237 }
238
239 if (syserror(tcp))
240 return 0;
241
242 switch (arg2) {
243 case PR_SPEC_STORE_BYPASS:
244 tcp->auxstr = sprintflags("",
245 pr_spec_get_store_bypass_flags,
246 (kernel_ulong_t) tcp->u_rval);
247 break;
248 }
249
250 return RVAL_STR;
251
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000252 /* PR_TASK_PERF_EVENTS_* take no arguments. */
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000253 case PR_TASK_PERF_EVENTS_DISABLE:
254 case PR_TASK_PERF_EVENTS_ENABLE:
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000255 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000256
257 case PR_SET_CHILD_SUBREAPER:
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000258 case PR_SET_ENDIAN:
259 case PR_SET_FPEMU:
260 case PR_SET_FPEXC:
261 case PR_SET_KEEPCAPS:
262 case PR_SET_TIMING:
Elliott Hughesd35df492017-02-15 15:19:05 -0800263 tprintf(", %" PRI_klu, arg2);
264 return RVAL_DECODED;
265
266 case PR_SET_DUMPABLE:
267 tprints(", ");
268 printxval64(pr_dumpable, arg2, "SUID_DUMP_???");
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000269 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000270
271 case PR_CAPBSET_DROP:
Dmitry V. Levin1b283302015-12-06 15:29:04 +0000272 case PR_CAPBSET_READ:
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000273 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800274 printxval64(cap, arg2, "CAP_???");
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000275 return RVAL_DECODED;
276
Dmitry V. Levineb76c4b2015-12-06 15:33:53 +0000277 case PR_CAP_AMBIENT:
278 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800279 printxval64(pr_cap_ambient, arg2,
Dmitry V. Levinc5f68632016-05-16 23:22:11 +0000280 "PR_CAP_AMBIENT_???");
Elliott Hughesd35df492017-02-15 15:19:05 -0800281 switch (arg2) {
Dmitry V. Levineb76c4b2015-12-06 15:33:53 +0000282 case PR_CAP_AMBIENT_RAISE:
283 case PR_CAP_AMBIENT_LOWER:
284 case PR_CAP_AMBIENT_IS_SET:
285 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800286 printxval64(cap, arg3, "CAP_???");
Dmitry V. Levineb76c4b2015-12-06 15:33:53 +0000287 print_prctl_args(tcp, 3);
288 break;
289 default:
290 print_prctl_args(tcp, 2);
291 break;
292 }
293 return RVAL_DECODED;
294
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000295 case PR_MCE_KILL:
296 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800297 printxval64(pr_mce_kill, arg2, "PR_MCE_KILL_???");
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000298 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800299 if (PR_MCE_KILL_SET == arg2)
300 printxval64(pr_mce_kill_policy, arg3,
301 "PR_MCE_KILL_???");
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000302 else
Elliott Hughesd35df492017-02-15 15:19:05 -0800303 tprintf("%#" PRI_klx, arg3);
Dmitry V. Levin36915622015-07-25 09:43:01 +0000304 print_prctl_args(tcp, 3);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000305 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000306
307 case PR_SET_NAME:
308 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800309 printstr_ex(tcp, arg2, TASK_COMM_LEN - 1,
310 QUOTE_0_TERMINATED);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000311 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000312
Elliott Hughes1d246ce2015-07-29 22:49:38 +0000313#ifdef __ANDROID__
Elliott Hughes1d246ce2015-07-29 22:49:38 +0000314# ifndef PR_SET_VMA_ANON_NAME
315# define PR_SET_VMA_ANON_NAME 0
316# endif
317 case PR_SET_VMA:
Elliott Hughesd35df492017-02-15 15:19:05 -0800318 if (arg2 == PR_SET_VMA_ANON_NAME) {
319 tprintf(", PR_SET_VMA_ANON_NAME, %#" PRI_klx, arg3);
320 tprintf(", %" PRI_klu ", ", arg4);
321 printstr(tcp, arg5);
Elliott Hughes1d246ce2015-07-29 22:49:38 +0000322 } else {
323 /* There are no other sub-options now, but there
324 * might be in future... */
325 print_prctl_args(tcp, 1);
326 }
327 return RVAL_DECODED;
328#endif
329
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000330 case PR_SET_MM:
331 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800332 printxval(pr_set_mm, arg2, "PR_SET_MM_???");
Dmitry V. Levin36915622015-07-25 09:43:01 +0000333 print_prctl_args(tcp, 2);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000334 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000335
336 case PR_SET_PDEATHSIG:
337 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800338 if (arg2 > 128)
339 tprintf("%" PRI_klu, arg2);
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000340 else
Elliott Hughesd35df492017-02-15 15:19:05 -0800341 tprints(signame(arg2));
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000342 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000343
344 case PR_SET_PTRACER:
345 tprints(", ");
Elliott Hughes03a418e2018-06-15 13:11:40 -0700346 if ((int) arg2 == -1) {
347 print_xlat_ex(arg2, "PR_SET_PTRACER_ANY",
348 XLAT_STYLE_DEFAULT);
349 } else {
Elliott Hughesd35df492017-02-15 15:19:05 -0800350 tprintf("%" PRI_klu, arg2);
Elliott Hughes03a418e2018-06-15 13:11:40 -0700351 }
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000352 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000353
354 case PR_SET_SECCOMP:
355 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800356 printxval64(seccomp_mode, arg2,
357 "SECCOMP_MODE_???");
358 if (SECCOMP_MODE_STRICT == arg2)
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000359 return RVAL_DECODED;
Elliott Hughesd35df492017-02-15 15:19:05 -0800360 if (SECCOMP_MODE_FILTER == arg2) {
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000361 tprints(", ");
Elliott Hughes77c3ff82017-09-08 17:11:00 -0700362 decode_seccomp_fprog(tcp, arg3);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000363 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000364 }
Dmitry V. Levin36915622015-07-25 09:43:01 +0000365 print_prctl_args(tcp, 2);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000366 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000367
368 case PR_SET_SECUREBITS:
369 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800370 printflags64(secbits, arg2, "SECBIT_???");
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000371 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000372
373 case PR_SET_TIMERSLACK:
Elliott Hughesd35df492017-02-15 15:19:05 -0800374 tprintf(", %" PRI_kld, arg2);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000375 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000376
377 case PR_SET_TSC:
378 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800379 printxval(pr_tsc, arg2, "PR_TSC_???");
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000380 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000381
382 case PR_SET_UNALIGN:
383 tprints(", ");
Elliott Hughesd35df492017-02-15 15:19:05 -0800384 printflags(pr_unalign_flags, arg2, "PR_UNALIGN_???");
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000385 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000386
387 case PR_SET_NO_NEW_PRIVS:
388 case PR_SET_THP_DISABLE:
Elliott Hughesd35df492017-02-15 15:19:05 -0800389 tprintf(", %" PRI_klu, arg2);
Dmitry V. Levin36915622015-07-25 09:43:01 +0000390 print_prctl_args(tcp, 2);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000391 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000392
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000393 case PR_MCE_KILL_GET:
Dmitry V. Levin36915622015-07-25 09:43:01 +0000394 if (entering(tcp)) {
395 print_prctl_args(tcp, 1);
396 return 0;
397 }
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000398 if (syserror(tcp))
399 return 0;
Dmitry V. Levin9134aab2016-05-14 21:46:05 +0000400 tcp->auxstr = xlookup(pr_mce_kill_policy,
Elliott Hughesd35df492017-02-15 15:19:05 -0800401 (kernel_ulong_t) tcp->u_rval);
Elliott Hughes28e98bc2018-06-14 16:59:04 -0700402 return RVAL_STR;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000403
Elliott Hughesd35df492017-02-15 15:19:05 -0800404 case PR_SET_FP_MODE:
405 tprints(", ");
406 printflags(pr_fp_mode, arg2, "PR_FP_MODE_???");
407 return RVAL_DECODED;
408
Elliott Hughes03a418e2018-06-15 13:11:40 -0700409 case PR_SET_SPECULATION_CTRL:
410 tprints(", ");
411 printxval64(pr_spec_cmds, arg2, "PR_SPEC_???");
412 tprints(", ");
413
414 switch (arg2) {
415 case PR_SPEC_STORE_BYPASS:
416 printxval64(pr_spec_set_store_bypass_flags, arg3,
417 "PR_SPEC_???");
418 break;
419
420 default:
421 tprintf("%#" PRI_klx, arg3);
422 }
423
424 return RVAL_DECODED;
425
Dmitry V. Levin1b283302015-12-06 15:29:04 +0000426 case PR_GET_NO_NEW_PRIVS:
427 case PR_GET_THP_DISABLE:
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000428 case PR_MPX_DISABLE_MANAGEMENT:
429 case PR_MPX_ENABLE_MANAGEMENT:
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000430 default:
Dmitry V. Levin36915622015-07-25 09:43:01 +0000431 print_prctl_args(tcp, 1);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000432 return RVAL_DECODED;
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000433 }
434 return 0;
435}
436
Elliott Hughes77c3ff82017-09-08 17:11:00 -0700437#if defined X86_64 || defined X32 || defined I386
Dmitry V. Levin53c993d2014-12-11 19:25:02 +0000438# include "xlat/archvals.h"
439
Dmitry V. Levina0bd3742015-04-07 01:36:50 +0000440SYS_FUNC(arch_prctl)
Dmitry V. Levin53c993d2014-12-11 19:25:02 +0000441{
Dmitry V. Levinb8eec602016-05-16 22:19:31 +0000442 const unsigned int option = tcp->u_arg[0];
Elliott Hughesd35df492017-02-15 15:19:05 -0800443 const kernel_ulong_t addr = tcp->u_arg[1];
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000444
Dmitry V. Levinb8eec602016-05-16 22:19:31 +0000445 if (entering(tcp))
446 printxval(archvals, option, "ARCH_???");
447
448 switch (option) {
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000449 case ARCH_GET_GS:
450 case ARCH_GET_FS:
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000451 if (entering(tcp))
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000452 tprints(", ");
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000453 else
Elliott Hughesd35df492017-02-15 15:19:05 -0800454 printnum_ptr(tcp, addr);
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000455 return 0;
Dmitry V. Levin53c993d2014-12-11 19:25:02 +0000456 }
Dmitry V. Levin1e880732015-02-14 01:51:03 +0000457
Elliott Hughesd35df492017-02-15 15:19:05 -0800458 tprintf(", %#" PRI_klx, addr);
Dmitry V. Levin210a6b62015-07-17 21:49:17 +0000459 return RVAL_DECODED;
Dmitry V. Levin53c993d2014-12-11 19:25:02 +0000460}
Elliott Hughes77c3ff82017-09-08 17:11:00 -0700461#endif /* X86_64 || X32 || I386 */