diff --git a/gdb/testsuite/gdb.base/watch-bitfields.exp b/gdb/testsuite/gdb.base/watch-bitfields.exp
index 9d5293b..b7896bb 100644
--- a/gdb/testsuite/gdb.base/watch-bitfields.exp
+++ b/gdb/testsuite/gdb.base/watch-bitfields.exp
@@ -43,6 +43,8 @@ proc expect_watchpoint { expr old new } {
 
 # Check that -location watchpoints against bitfields trigger properly.
 proc test_watch_location {} {
+    global timeout
+
     with_test_prefix "-location watch against bitfields" {
 	if {![runto_main]} {
 	    return -1
@@ -54,13 +56,22 @@ proc test_watch_location {} {
 	expect_watchpoint "q.e" 0 5
 	expect_watchpoint "q.a" 1 0
 	expect_watchpoint "q.e" 5 4
-	gdb_continue_to_end
+
+	# It'll execute a large amount of code with software watchpoint
+	# enabled, which means GDB will single stepping all the way
+	# through til the inferior exits.  Increase the timeout by a
+	# factor of 4.
+	with_timeout_factor 4 {
+	    gdb_continue_to_end
+	}
     }
 }
 
 # Check that regular watchpoints against expressions involving
 # bitfields trigger properly.
 proc test_regular_watch {} {
+    global timeout
+
     with_test_prefix "regular watch against bitfields" {
 	if {![runto_main]} {
 	    return -1
@@ -73,7 +84,14 @@ proc test_regular_watch {} {
 	expect_watchpoint "q.d + q.f + q.g" 3 2
 	expect_watchpoint "q.d + q.f + q.g" 2 1
 	expect_watchpoint "q.d + q.f + q.g" 1 0
-	gdb_continue_to_end
+
+	# It'll execute a large amount of code with software watchpoint
+	# enabled, which means GDB will single stepping all the way
+	# through til the inferior exits.  Increase the timeout by a
+	# factor of 4.
+	with_timeout_factor 4 {
+	    gdb_continue_to_end
+	}
     }
 }
 
diff --git a/gdb/testsuite/gdb.base/watchpoint-solib.exp b/gdb/testsuite/gdb.base/watchpoint-solib.exp
index 85e83f7..9475b37 100644
--- a/gdb/testsuite/gdb.base/watchpoint-solib.exp
+++ b/gdb/testsuite/gdb.base/watchpoint-solib.exp
@@ -75,17 +75,8 @@ gdb_test "watch g" "atchpoint 3: g" "set watchpoint on g"
 gdb_test "continue" ".*New value = 1.*" "continue to watchpoint hit"
 rerun_to_main
 
-set savedtimeout $timeout
-if { [target_info exists gdb,timeout]
-     && $timeout < [target_info gdb,timeout] } {
-    set oldtimeout [target_info gdb,timeout]
-} else {
-    set oldtimeout $timeout
+with_timeout_factor 30 {
+    gdb_test "continue" ".*Breakpoint 2.*foo.*" "continue to foo again"
 }
-set timeout [expr $oldtimeout * 30]
-
-gdb_test "continue" ".*Breakpoint 2.*foo.*" "continue to foo again"
-
-set timeout $savedtimeout
 
 gdb_test "continue" ".*New value = 1.*" "continue to watchpoint hit again"
diff --git a/gdb/testsuite/gdb.reverse/sigall-reverse.exp b/gdb/testsuite/gdb.reverse/sigall-reverse.exp
index 69152d4..065eea7 100644
--- a/gdb/testsuite/gdb.reverse/sigall-reverse.exp
+++ b/gdb/testsuite/gdb.reverse/sigall-reverse.exp
@@ -251,18 +251,11 @@ gdb_test "continue" \
     "get signal TERM"
 gdb_test "continue" "Breakpoint.*handle_TERM.*" "send signal TERM"
 
-set savedtimeout $timeout
-if { [target_info exists gdb,timeout]
-     && $timeout < [target_info gdb,timeout] } {
-    set oldtimeout [target_info gdb,timeout]
-} else {
-    set oldtimeout $timeout
+with_timeout_factor 2 {
+    gdb_test "continue" "\[process \[0-9\]+ .*" "continue to signal exit" \
+	"The next instruction is syscall exit_group.* program...y. or n. " \
+	"yes"
 }
-set timeout [expr $oldtimeout * 2]
-gdb_test "continue" "\[process \[0-9\]+ .*" "continue to signal exit" \
-    "The next instruction is syscall exit_group.* program...y. or n. " \
-    "yes"
-set timeout $savedtimeout
 
 foreach sig [lreverse $signals] {
     test_one_sig_reverse $sig
diff --git a/gdb/testsuite/gdb.reverse/until-precsave.exp b/gdb/testsuite/gdb.reverse/until-precsave.exp
index 1684645..640839f 100644
--- a/gdb/testsuite/gdb.reverse/until-precsave.exp
+++ b/gdb/testsuite/gdb.reverse/until-precsave.exp
@@ -49,22 +49,17 @@ gdb_test "break $end_of_main" \
     "BP at end of main"
 
 # This can take awhile.
-set savedtimeout $timeout
-if { [target_info exists gdb,timeout]
-     && $timeout < [target_info gdb,timeout] } {
-    set oldtimeout [target_info gdb,timeout]
-} else {
-    set oldtimeout $timeout
+with_timeout_factor 15 {
+    gdb_test "continue" "Breakpoint .* set breakpoint 10a here .*" "run to end of main"
 }
-set timeout [expr $oldtimeout * 15]
-gdb_test "continue" "Breakpoint .* set breakpoint 10a here .*" "run to end of main"
 
 # So can this, against gdbserver, for example.
-set timeout [expr $oldtimeout * 3]
-gdb_test "record save $precsave" \
-    "Saved core file $precsave with execution log\."  \
-    "save process recfile"
-set timeout $savedtimeout
+
+with_timeout_factor 3 {
+    gdb_test "record save $precsave" \
+	"Saved core file $precsave with execution log\."  \
+	"save process recfile"
+}
 
 gdb_test "kill" "" "Kill process, prepare to debug log file" \
     "Kill the program being debugged\\? \\(y or n\\) " "y"
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 1448fba..bf72c53 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -1919,6 +1919,32 @@ proc with_target_charset { target_charset body } {
     }
 }
 
+# Run tests in BODY with timeout increased by factor of FACTOR.  When
+# BODY is finished, restore timeout.
+
+proc with_timeout_factor { factor body } {
+    global timeout
+
+    set savedtimeout $timeout
+    if { [target_info exists gdb,timeout]
+	 && $timeout < [target_info gdb,timeout] } {
+	set oldtimeout [target_info gdb,timeout]
+    } else {
+	set oldtimeout $timeout
+    }
+    set timeout [expr $oldtimeout * $factor]
+
+    set code [catch {uplevel 1 $body} result]
+    if {$code == 1} {
+	global errorInfo errorCode
+	return -code $code -errorinfo $errorInfo -errorcode $errorCode $result
+    } else {
+	return -code $code $result
+    }
+
+    set timeout $savedtimeout
+}
+
 # Return 1 if _Complex types are supported, otherwise, return 0.
 
 gdb_caching_proc support_complex_tests {
