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