diff --git a/src/target/riscv_debug.c b/src/target/riscv_debug.c
index bfe98611f69..1d5747a7d17 100644
--- a/src/target/riscv_debug.c
+++ b/src/target/riscv_debug.c
@@ -747,10 +747,12 @@ static bool riscv_check_error(target_s *const target)
 
 static bool riscv_dm_poll_state(riscv_dm_s *const dbg_module, const uint32_t state)
 {
+	platform_timeout_s timeout;
+	platform_timeout_set(&timeout, 500U);
 	/* Poll for the requested state to become set */
 	uint32_t status = 0;
 	while (!(status & state)) {
-		if (!riscv_dm_read(dbg_module, RV_DM_STATUS, &status))
+		if (!riscv_dm_read(dbg_module, RV_DM_STATUS, &status) || platform_timeout_is_expired(&timeout))
 			return false;
 	}
 	return true;