diff --git a/src/video/SDL_stretch.c b/src/video/SDL_stretch.c
index 2e08c10f36a35b02393d79d80b8bae8b7802ac8d..fd3193963ebb00abd1f19b149cea571a6a190fe5 100644
--- a/src/video/SDL_stretch.c
+++ b/src/video/SDL_stretch.c
@@ -42,6 +42,15 @@
 
 #ifdef USE_ASM_STRETCH
 
+/* OpenBSD has non-executable memory by default, so use mprotect() */
+#ifdef __OpenBSD__
+#define USE_MPROTECT
+#endif
+#ifdef USE_MPROTECT
+#include <sys/types.h>
+#include <sys/mman.h>
+#endif
+
 #if defined(_M_IX86) || defined(i386)
 #define PREFIX16	0x66
 #define STORE_BYTE	0xAA
@@ -91,6 +100,9 @@ static int generate_rowbytes(int src_w, int dst_w, int bpp)
 		SDL_SetError("ASM stretch of %d bytes isn't supported\n", bpp);
 		return(-1);
 	}
+#ifdef USE_MPROTECT
+	mprotect(copy_row, sizeof(copy_row), PROT_READ|PROT_WRITE|PROT_EXEC);
+#endif
 	pos = 0x10000;
 	inc = (src_w << 16) / dst_w;
 	eip = copy_row;