xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/testsuite/gdb.arch/s390-tdbregs.c (revision eceb233b9bd0dfebb902ed73b531ae6964fa3f9b)
1 /* Copyright 2008-2019 Free Software Foundation, Inc.
2 
3    This file is part of GDB.
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 3 of the License, or
8    (at your option) any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
17 
18 #include <stdio.h>
19 
20 /* Start a transaction.  To avoid the need for FPR save/restore, assume
21    that no FP- or vector registers are modified within the transaction.
22    Thus invoke TBEGIN with the "allow floating-point operation" flag set
23    to zero, which forces a transaction abort when hitting an FP- or vector
24    instruction.  Also assume that TBEGIN will eventually succeed, so just
25    retry indefinitely.  */
26 
27 static void
28 my_tbegin ()
29 {
30   __asm__ volatile
31     ( "1:  .byte 0xe5,0x60,0x00,0x00,0xff,0x00\n"
32       "    jnz 1b"
33       : /* no return value */
34       : /* no inputs */
35       : "cc", "memory" );
36 }
37 
38 /* End a transaction.  */
39 
40 static void
41 my_tend ()
42 {
43   __asm__ volatile
44     ( "    .byte 0xb2,0xf8,0x00,0x00"
45       : /* no return value */
46       : /* no inputs */
47       : "cc", "memory" );
48 }
49 
50 void
51 try_transaction (void)
52 {
53   my_tbegin ();
54   my_tend ();
55 }
56 
57 void
58 crash_in_transaction (void)
59 {
60   volatile char *p = 0;
61 
62   my_tbegin ();
63   *p = 5;			/* FAULT */
64   my_tend ();
65 }
66 
67 int
68 main (int argc, char *argv[])
69 {
70   try_transaction ();
71   crash_in_transaction ();
72   return 0;
73 }
74