summaryrefslogtreecommitdiff
path: root/emulators/xcopilot/patches/patch-ac
blob: ac3f560abe462d5ee0885104ac8eabbc3937675c (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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
$NetBSD: patch-ac,v 1.1.1.1 1999/02/05 07:38:15 nathanw Exp $

--- mc68k/memory.c.orig	Wed Feb  3 14:11:09 1999
+++ mc68k/memory.c	Fri Feb  5 01:28:39 1999
@@ -377,6 +377,7 @@
   int i;
   char *rombuf;
   char *resetv;
+  void *tmpmemory;
   int f;
   struct stat st;
   
@@ -405,12 +406,24 @@
     rom_size = pow_of_2;
   }
   
-  rommemory = (UWORD*)mmap(0, rom_size, PROT_READ|PROT_WRITE, 
-			   MAP_FILE|MAP_PRIVATE, f, 0);
-  if (rommemory == (UWORD *)-1) {
+  /* mmap'ing a larger region than the underlying object does not work.
+   * Instead, mmap the actual object and copy into a power-of-two sized
+   * buffer.
+   */
+  tmpmemory = mmap(0, st.st_size, PROT_READ|PROT_WRITE, 
+		   MAP_FILE|MAP_PRIVATE, f, 0);
+  if (tmpmemory == (void *)-1) {
     return PILOTCPU_ERROR_LOADING_ROM;
   }
-  
+
+  /* We want the end of the buffer to be zero-filled */
+  rommemory = (UWORD *) calloc(1, rom_size);
+  if (rommemory == 0) {
+    return PILOTCPU_ERROR_LOADING_ROM;
+  }
+  memcpy(rommemory, tmpmemory, st.st_size);
+  munmap(tmpmemory, st.st_size);
+
   if (!nocheck) {
   /* Check if the reset vector looks plausible */
     resetv = (char *)rommemory +
@@ -430,23 +443,15 @@
 	offset = resetv - find_entrypoint((char *)rommemory);
       }
 
-      /* Did we find it? If not, lets go with the original. */
-      if ((char *)offset != resetv) {
-	/* It may not always be page aligned... */
-	pageoffset = ((offset-1) & ~(getpagesize() - 1)) + getpagesize();
-
-	if ((st.st_size + offset) > rom_size)
-          rom_size <<= 1;
-
-	rommemory = (UWORD *)mmap((void*)(rommemory + pageoffset),
-                                  rom_size - pageoffset,
-				  PROT_READ | PROT_WRITE,
-				  MAP_FILE | MAP_PRIVATE | MAP_FIXED, f, 0);
-	if (rommemory == (UWORD *)-1)
-	  return PILOTCPU_ERROR_LOADING_ROM;
-
-	memcpy(((char *)rommemory) - offset, rommemory, 256);
-	((char *)rommemory) -= offset;
+      if (offset != 0) {
+	if ((st.st_size + offset) > rom_size) {
+	  rom_size <<= 1;
+	  rommemory = realloc(rommemory, rom_size);
+	  if (rommemory == 0)
+	    return PILOTCPU_ERROR_LOADING_ROM;
+	}
+	
+	memmove((char *)rommemory + offset, rommemory, st.st_size);
       }
     }
   }