summaryrefslogtreecommitdiff
path: root/emulators/xcopilot/patches/patch-ac
blob: 3ebe55a582a39c889421e2db5eb649d881ba8225 (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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
$NetBSD: patch-ac,v 1.2 2006/06/30 22:14:49 tron Exp $

--- mc68k/memory.c.orig	1998-08-25 05:52:56.000000000 +0100
+++ mc68k/memory.c	2006-06-30 23:09:38.000000000 +0100
@@ -346,9 +346,11 @@
 			       0xff, 0xff, 0x00 };
 
     const unsigned char *bootsign = _bootsign, *bootmask = _bootmask;
-    
+    char *p;
+
+    p = (const char *)rom;
     while ((*bootsign & *bootmask) == *bootsign)
-	if ((*((char *)rom)++ & *bootmask++) != *bootsign++)
+	if ((*p++ & *bootmask++) != *bootsign++)
 	    return 0;
 
     return 1;
@@ -377,6 +379,7 @@
   int i;
   char *rombuf;
   char *resetv;
+  void *tmpmemory;
   int f;
   struct stat st;
   
@@ -405,12 +408,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 +445,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);
       }
     }
   }