summaryrefslogtreecommitdiffstats
path: root/tools/testing/selftests/powerpc/signal/signal.S
blob: 228fba49935d03bb26a5e161b6c7e336dc1a3491 (plain) (blame)
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
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright 2015, Cyril Bur, IBM Corp.
 */

#include "basic_asm.h"

/* long signal_self(pid_t pid, int sig); */
FUNC_START(signal_self)
	li	r0,37 /* sys_kill */
	/* r3 already has our pid in it */
	/* r4 already has signal type in it */
	sc
	bc	4,3,1f
	subfze	r3,r3
1:	blr
FUNC_END(signal_self)

/* long tm_signal_self(pid_t pid, int sig, int *ret); */
FUNC_START(tm_signal_self)
	PUSH_BASIC_STACK(8)
	std	r5,STACK_FRAME_PARAM(0)(sp) /* ret */
	tbegin.
	beq	1f
	tsuspend.
	li	r0,37 /* sys_kill */
	/* r3 already has our pid in it */
	/* r4 already has signal type in it */
	sc
	ld	r5,STACK_FRAME_PARAM(0)(sp) /* ret */
	bc	4,3,2f
	subfze	r3,r3
2:	std	r3,0(r5)
	tabort. 0
	tresume. /* Be nice to some cleanup, jumps back to tbegin then to 1: */
	/*
	 * Transaction should be proper doomed and we should never get
	 * here
	 */
	li	r3,1
	POP_BASIC_STACK(8)
	blr
1:	li	r3,0
	POP_BASIC_STACK(8)
	blr
FUNC_END(tm_signal_self)