summaryrefslogtreecommitdiff
blob: 109c1c731b7bb8aefa732ec6594aac97696283e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
diff --git a/v86_mem.c b/v86_mem.c
index 4cedbbe..23eb7c0 100644
--- a/v86_mem.c
+++ b/v86_mem.c
@@ -293,7 +293,13 @@ int v86_mem_init(void)
 	}
 	vbios_size = tmp[2] * 0x200;
 	ulog(LOG_DEBUG, "VBIOS at %5x-%5x\n", VBIOS_BASE, VBIOS_BASE + vbios_size - 1);
-	mem_vbios = map_file(NULL, vbios_size, PROT_READ,
+
+	/*
+	 * The Video BIOS and the System BIOS have to be mapped with PROT_WRITE.
+	 * There is at least one case where mapping them without this flag causes
+	 * a segfault during the emulation: https://bugs.gentoo.org/show_bug.cgi?id=245254
+	 */
+	mem_vbios = map_file(NULL, vbios_size, PROT_READ | PROT_WRITE,
 							MAP_SHARED, "/dev/mem", VBIOS_BASE);
 
 	if (!mem_vbios) {
@@ -303,7 +309,7 @@ int v86_mem_init(void)
 	}
 
 	/* Map the system BIOS */
-	mem_sbios = map_file(NULL, SBIOS_SIZE, PROT_READ,
+	mem_sbios = map_file(NULL, SBIOS_SIZE, PROT_READ | PROT_WRITE,
 					MAP_SHARED, "/dev/mem", SBIOS_BASE);
 	if (!mem_sbios) {
 		ulog(LOG_ERR, "Failed to mmap the System BIOS as %5x.", SBIOS_BASE);