1 /*
2 * Check decoding of getrusage syscall.
3 *
4 * Copyright (c) 2016 Fei Jie <feij.fnst@cn.fujitsu.com>
5 * Copyright (c) 2016 Dmitry V. Levin <ldv@strace.io>
6 * Copyright (c) 2016-2021 The strace developers.
7 * All rights reserved.
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
12 #include "tests.h"
13 #include "scno.h"
14
15 #include <stdio.h>
16 #include <stdint.h>
17 #include <sys/resource.h>
18 #include <unistd.h>
19 #include <errno.h>
20
21 #include "kernel_rusage.h"
22 #include "xlat.h"
23 #include "xlat/usagewho.h"
24
25 static int
26 invoke_print(int who, const char *who_str, kernel_rusage_t *usage)
27 {
28 int rc = syscall(__NR_getrusage, who, usage);
29 int saved_errno = errno;
30 printf("getrusage(%s, {ru_utime={tv_sec=%lld, tv_usec=%llu}"
31 ", ru_stime={tv_sec=%lld, tv_usec=%llu}, ru_maxrss=%llu"
32 ", ru_ixrss=%llu, ru_idrss=%llu, ru_isrss=%llu, ru_minflt=%llu"
33 ", ru_majflt=%llu, ru_nswap=%llu, ru_inblock=%llu"
34 ", ru_oublock=%llu, ru_msgsnd=%llu, ru_msgrcv=%llu"
35 ", ru_nsignals=%llu, ru_nvcsw=%llu, ru_nivcsw=%llu}) = %s\n",
36 who_str,
37 (long long) usage->ru_utime.tv_sec,
38 zero_extend_signed_to_ull(usage->ru_utime.tv_usec),
39 (long long) usage->ru_stime.tv_sec,
40 zero_extend_signed_to_ull(usage->ru_stime.tv_usec),
41 zero_extend_signed_to_ull(usage->ru_maxrss),
42 zero_extend_signed_to_ull(usage->ru_ixrss),
43 zero_extend_signed_to_ull(usage->ru_idrss),
44 zero_extend_signed_to_ull(usage->ru_isrss),
45 zero_extend_signed_to_ull(usage->ru_minflt),
46 zero_extend_signed_to_ull(usage->ru_majflt),
47 zero_extend_signed_to_ull(usage->ru_nswap),
48 zero_extend_signed_to_ull(usage->ru_inblock),
49 zero_extend_signed_to_ull(usage->ru_oublock),
50 zero_extend_signed_to_ull(usage->ru_msgsnd),
51 zero_extend_signed_to_ull(usage->ru_msgrcv),
52 zero_extend_signed_to_ull(usage->ru_nsignals),
53 zero_extend_signed_to_ull(usage->ru_nvcsw),
54 zero_extend_signed_to_ull(usage->ru_nivcsw),
55 sprintrc(rc));
56 errno = saved_errno;
57 return rc;
58 }
59
60 int
61 main(void)
62 {
63 TAIL_ALLOC_OBJECT_CONST_PTR(kernel_rusage_t, usage);
64 if (invoke_print(ARG_STR(RUSAGE_SELF), usage)) {
65 perror_msg_and_fail("RUSAGE_SELF");
66 }
67 if (invoke_print(ARG_STR(RUSAGE_THREAD), usage) && errno != EINVAL) {
68 perror_msg_and_fail("RUSAGE_THREAD");
69 }
70
71 puts("+++ exited with 0 +++");
72 return 0;
73 }