2 * Copyright 2015, Cyril Bur, IBM Corp.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version
7 * 2 of the License, or (at your option) any later version.
10 #include "basic_asm.h"
17 * Large caveat here being that the caller cannot expect the
18 * signal to always be sent! The hardware can (AND WILL!) abort
19 * the transaction between the tbegin and the tsuspend (however
20 * unlikely it seems or infrequently it actually happens).
21 * You have been warned.
23 /* long tm_signal_self(pid_t pid, long *gprs, double *fps, vector *vms, vector *vss); */
24 FUNC_START(tm_signal_self_context_load)
27 * Don't strictly need to save and restore as it depends on if
28 * we're going to use them, however this reduces messy logic
30 PUSH_VMX(STACK_FRAME_LOCAL(5,0),r8)
32 PUSH_NVREGS_BELOW_FPU(512)
33 std r3, STACK_FRAME_PARAM(0)(sp) /* pid */
34 std r4, STACK_FRAME_PARAM(1)(sp) /* gps */
35 std r5, STACK_FRAME_PARAM(2)(sp) /* fps */
36 std r6, STACK_FRAME_PARAM(3)(sp) /* vms */
37 std r7, STACK_FRAME_PARAM(4)(sp) /* vss */
39 ld r3, STACK_FRAME_PARAM(1)(sp)
44 ld r3, STACK_FRAME_PARAM(2)(sp)
49 ld r3, STACK_FRAME_PARAM(3)(sp)
54 ld r3, STACK_FRAME_PARAM(4)(sp)
60 * Set r3 (return value) before tbegin. Use the pid as a known
61 * 'all good' return value, zero is used to indicate a non-doomed
64 ld r3, STACK_FRAME_PARAM(0)(sp)
67 tsuspend. /* Can't enter a syscall transactionally */
68 ld r3, STACK_FRAME_PARAM(1)(sp)
71 /* Get the second half of the array */
75 ld r3, STACK_FRAME_PARAM(2)(sp)
78 /* Get the second half of the array */
82 ld r3, STACK_FRAME_PARAM(3)(sp)
85 /* Get the second half of the array */
89 ld r3, STACK_FRAME_PARAM(4)(sp)
92 /* Get the second half of the array */
96 li r0, 37 /* sys_kill */
97 ld r3, STACK_FRAME_PARAM(0)(sp) /* pid */
98 li r4, 10 /* SIGUSR1 */
99 sc /* Taking the signal will doom the transaction */
101 tresume. /* Be super sure we abort */
103 * This will cause us to resume doomed transaction and cause
104 * hardware to cleanup, we'll end up at 1: anything between
105 * tresume. and 1: shouldn't ever run.
109 POP_VMX(STACK_FRAME_LOCAL(5,0),r4)
111 POP_NVREGS_BELOW_FPU(512)
114 FUNC_END(tm_signal_self_context_load)