2 * Copyright 2016, 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 * Test the kernel's signal frame code.
12 * The kernel sets up two sets of ucontexts if the signal was to be
13 * delivered while the thread was in a transaction.
14 * Expected behaviour is that the checkpointed state is in the user
15 * context passed to the signal handler. The speculated state can be
16 * accessed with the uc_link pointer.
18 * The rationale for this is that if TM unaware code (which linked
19 * against TM libs) installs a signal handler it will not know of the
20 * speculative nature of the 'live' registers and may infer the wrong
35 #define MAX_ATTEMPT 500000
37 #define NV_VMX_REGS 12
39 long tm_signal_self_context_load(pid_t pid
, long *gprs
, double *fps
, vector
int *vms
, vector
int *vss
);
41 static sig_atomic_t fail
;
44 {1, 2, 3, 4 },{5, 6, 7, 8 },{9, 10,11,12},
45 {13,14,15,16},{17,18,19,20},{21,22,23,24},
46 {25,26,27,28},{29,30,31,32},{33,34,35,36},
47 {37,38,39,40},{41,42,43,44},{45,46,47,48},
48 {-1, -2, -3, -4}, {-5, -6, -7, -8}, {-9, -10,-11,-12},
49 {-13,-14,-15,-16},{-17,-18,-19,-20},{-21,-22,-23,-24},
50 {-25,-26,-27,-28},{-29,-30,-31,-32},{-33,-34,-35,-36},
51 {-37,-38,-39,-40},{-41,-42,-43,-44},{-45,-46,-47,-48}
54 static void signal_usr1(int signum
, siginfo_t
*info
, void *uc
)
58 ucontext_t
*tm_ucp
= ucp
->uc_link
;
60 for (i
= 0; i
< NV_VMX_REGS
&& !fail
; i
++) {
61 fail
= memcmp(ucp
->uc_mcontext
.v_regs
->vrregs
[i
+ 20],
62 &vms
[i
], sizeof(vector
int));
63 fail
|= memcmp(tm_ucp
->uc_mcontext
.v_regs
->vrregs
[i
+ 20],
64 &vms
[i
+ NV_VMX_REGS
], sizeof (vector
int));
69 fprintf(stderr
, "Failed on %d vmx 0x", i
);
70 for (j
= 0; j
< 4; j
++)
71 fprintf(stderr
, "%04x", ucp
->uc_mcontext
.v_regs
->vrregs
[i
+ 20][j
]);
72 fprintf(stderr
, " vs 0x");
73 for (j
= 0 ; j
< 4; j
++)
74 fprintf(stderr
, "%04x", tm_ucp
->uc_mcontext
.v_regs
->vrregs
[i
+ 20][j
]);
75 fprintf(stderr
, "\n");
80 static int tm_signal_context_chk()
89 act
.sa_sigaction
= signal_usr1
;
90 sigemptyset(&act
.sa_mask
);
91 act
.sa_flags
= SA_SIGINFO
;
92 if (sigaction(SIGUSR1
, &act
, NULL
) < 0) {
93 perror("sigaction sigusr1");
98 while (i
< MAX_ATTEMPT
&& !fail
) {
99 rc
= tm_signal_self_context_load(pid
, NULL
, NULL
, vms
, NULL
);
109 return test_harness(tm_signal_context_chk
, "tm_signal_context_chk_vmx");