File: bvar_execargs.S

package info (click to toggle)
dtrace 2.0.5-1
  • links: PTS
  • area: main
  • in suites: sid
  • size: 24,408 kB
  • sloc: ansic: 61,247; sh: 17,997; asm: 1,717; lex: 947; awk: 754; yacc: 695; perl: 37; sed: 17; makefile: 15
file content (97 lines) | stat: -rw-r--r-- 2,013 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2025, Oracle and/or its affiliates.
 */

#include <bpf_asm_helpers.h>
#include <dtrace/faults_defines.h>

/*
 * uint64_t dt_bvar_execargs(const dt_dctx_t *dctx, char *args)
 */
	.text
	.align	4
	.global	dt_bvar_execargs
	.type	dt_bvar_execargs, @function
dt_bvar_execargs:
	stxdw	[%fp+-8], %r1			/* save dctx to stack */
	mov	%r9, %r2			/* %r9 = args */

	mov	%r6, 0				/* set %r6 in case of error */
	call	BPF_FUNC_get_current_task	/* get curthread (T) */
	jeq	%r0, 0, .Lerror

	mov	%r6, %r0
	add	%r6, TASK_MM			/* %r6 = &(T->mm) */

	mov	%r1, %r9
	mov	%r2, 8
	mov	%r3, %r6
	call	BPF_FUNC_probe_read
	jne	%r0, 0, .Lerror

	ldxdw	%r8, [%r9+0]			/* %r8 = T->mm */
	jeq	%r8, 0, .Lempty
	mov	%r6, %r8
	add	%r6, TASK_MM_ARG_START		/* ptr = &(T->mm->arg_start) */

	mov	%r1, %r9
	mov	%r2, 8
	mov	%r3, %r6
	call	BPF_FUNC_probe_read
	jne	%r0, 0, .Lerror

	ldxdw	%r7, [%r9+0]			/* %r7 = T->mm->arg_start */
	mov	%r6, %r8
	add	%r6, TASK_MM_ARG_END		/* ptr = &(T->mm->arg_end) */

	mov	%r1, %r9
	mov	%r2, 8
	mov	%r3, %r6
	call	BPF_FUNC_probe_read
	jne	%r0, 0, .Lerror

	ldxdw	%r6, [%r9+0]			/* %r6 = T->mm->arg_end */

	mov	%r8, %r6
	sub	%r8, %r7			/* %r8 = len = arg_end - arg_start */
	jslt	%r8, 2, .Lempty
	mov	%r0, STRSZ
	jslt	%r8, %r0, .Llen_ok
	mov	%r8, %r0
.Llen_ok:

	/* read data from arg_start to arg_end */
	mov	%r1, %r9
	mov	%r2, %r8
	mov	%r3, %r7
	call	BPF_FUNC_probe_read_user	/* bpf_probe_read_user(&args, len + 1, arg_start) */
	jne	%r0, 0, .Lerror

	/* loop over args and replace '\0' with ' ' */
	mov	%r1, %r8
	sub	%r1, 2
.Lloop:
	mov	%r2, %r9
	add	%r2, %r1
	ldxb	%r0, [%r2+0]
	jne	%r0, 0, .Lnot_nil
	stb	[%r2+0], 32
.Lnot_nil:
	sub	%r1, 1
	jsge	%r1, 0, .Lloop

.Ldone:
	mov	%r0, %r9
	exit					/* return args */
.Lerror:
	ldxdw	%r1, [%fp+-8]
	mov	%r2, PC
	mov	%r3, DTRACEFLT_BADADDR
	mov	%r4, %r6
	call	dt_probe_error
.Lempty:
	mov	%r0, %r9
	stb	[%r9+0], 0			/* args[0] = 0 */
	exit					/* return args */
	.size	dt_bvar_execargs, .-dt_bvar_execargs