1*4882a593SmuzhiyunUpstream-Statue: Pending
2*4882a593Smuzhiyun[from ftp://195.220.108.108/linux/fedora/linux/development/rawhide/source/SRPMS/l/libx86-1.1-21.fc23.src.rpm]
3*4882a593Smuzhiyun
4*4882a593Smuzhiyundiff -ur libx86-1.1/lrmi.c libx86-1.1.hack/lrmi.c
5*4882a593Smuzhiyun--- libx86-1.1/lrmi.c	2006-10-30 15:10:16.000000000 -0500
6*4882a593Smuzhiyun+++ libx86-1.1.hack/lrmi.c	2009-10-26 15:55:42.000000000 -0400
7*4882a593Smuzhiyun@@ -136,7 +136,7 @@
8*4882a593Smuzhiyun 	if (context.ready)
9*4882a593Smuzhiyun 		return 1;
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun-	if (!LRMI_common_init())
12*4882a593Smuzhiyun+	if (!LRMI_common_init(0))
13*4882a593Smuzhiyun 		return 0;
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun 	/*
16*4882a593Smuzhiyundiff -ur libx86-1.1/thunk.c libx86-1.1.hack/thunk.c
17*4882a593Smuzhiyun--- libx86-1.1/thunk.c	2008-04-02 20:48:00.000000000 -0400
18*4882a593Smuzhiyun+++ libx86-1.1.hack/thunk.c	2009-10-26 16:05:39.000000000 -0400
19*4882a593Smuzhiyun@@ -139,11 +139,11 @@
20*4882a593Smuzhiyun 	int i;
21*4882a593Smuzhiyun 	X86EMU_intrFuncs intFuncs[256];
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun-	if (!LRMI_common_init())
24*4882a593Smuzhiyun+	mmap_addr = LRMI_common_init(1);
25*4882a593Smuzhiyun+
26*4882a593Smuzhiyun+	if (!mmap_addr)
27*4882a593Smuzhiyun 		return 0;
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun-	mmap_addr = 0;
30*4882a593Smuzhiyun-
31*4882a593Smuzhiyun 	X86EMU_pioFuncs pioFuncs = {
32*4882a593Smuzhiyun 		(&x_inb),
33*4882a593Smuzhiyun 		(&x_inw),
34*4882a593Smuzhiyun@@ -169,10 +169,10 @@
35*4882a593Smuzhiyun 	X86_ESP = 0xFFF9;
36*4882a593Smuzhiyun 	memset (stack, 0, 64*1024);
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun-	*((char *)0) = 0x4f; /* Make sure that we end up jumping back to a
39*4882a593Smuzhiyun-				halt instruction */
40*4882a593Smuzhiyun+	*mmap_addr = 0x4f; /* Make sure that we end up jumping back to a
41*4882a593Smuzhiyun+			      halt instruction */
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun-	M.mem_base = 0;
44*4882a593Smuzhiyun+	M.mem_base = (unsigned long)mmap_addr;
45*4882a593Smuzhiyun 	M.mem_size = 1024*1024;
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun 	return 1;
48*4882a593Smuzhiyundiff -ur libx86-1.1/x86-common.c libx86-1.1.hack/x86-common.c
49*4882a593Smuzhiyun--- libx86-1.1/x86-common.c	2008-05-16 12:56:23.000000000 -0400
50*4882a593Smuzhiyun+++ libx86-1.1.hack/x86-common.c	2009-10-26 16:03:21.000000000 -0400
51*4882a593Smuzhiyun@@ -45,14 +45,15 @@
52*4882a593Smuzhiyun static struct {
53*4882a593Smuzhiyun 	int ready;
54*4882a593Smuzhiyun 	int count;
55*4882a593Smuzhiyun+	void *offset;
56*4882a593Smuzhiyun 	struct mem_block blocks[REAL_MEM_BLOCKS];
57*4882a593Smuzhiyun } mem_info = { 0 };
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun static int
60*4882a593Smuzhiyun-real_mem_init(void)
61*4882a593Smuzhiyun+real_mem_init(int high_page)
62*4882a593Smuzhiyun {
63*4882a593Smuzhiyun 	void *m;
64*4882a593Smuzhiyun-	int fd_zero;
65*4882a593Smuzhiyun+	int fd_zero, flags = MAP_SHARED;
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun 	if (mem_info.ready)
68*4882a593Smuzhiyun 		return 1;
69*4882a593Smuzhiyun@@ -63,9 +64,12 @@
70*4882a593Smuzhiyun 		return 0;
71*4882a593Smuzhiyun 	}
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun+	if (!high_page)
74*4882a593Smuzhiyun+		flags |= MAP_FIXED;
75*4882a593Smuzhiyun+
76*4882a593Smuzhiyun 	m = mmap((void *)REAL_MEM_BASE, REAL_MEM_SIZE,
77*4882a593Smuzhiyun-	 PROT_READ | PROT_WRITE | PROT_EXEC,
78*4882a593Smuzhiyun-	 MAP_FIXED | MAP_SHARED, fd_zero, 0);
79*4882a593Smuzhiyun+		 PROT_READ | PROT_WRITE | PROT_EXEC,
80*4882a593Smuzhiyun+		 flags, fd_zero, 0);
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun 	if (m == (void *)-1) {
83*4882a593Smuzhiyun 		perror("mmap /dev/zero");
84*4882a593Smuzhiyun@@ -76,6 +80,7 @@
85*4882a593Smuzhiyun 	close(fd_zero);
86*4882a593Smuzhiyun
87*4882a593Smuzhiyun 	mem_info.ready = 1;
88*4882a593Smuzhiyun+	mem_info.offset = m;
89*4882a593Smuzhiyun 	mem_info.count = 1;
90*4882a593Smuzhiyun 	mem_info.blocks[0].size = REAL_MEM_SIZE;
91*4882a593Smuzhiyun 	mem_info.blocks[0].free = 1;
92*4882a593Smuzhiyun@@ -87,7 +92,7 @@
93*4882a593Smuzhiyun real_mem_deinit(void)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun 	if (mem_info.ready) {
96*4882a593Smuzhiyun-		munmap((void *)REAL_MEM_BASE, REAL_MEM_SIZE);
97*4882a593Smuzhiyun+		munmap(mem_info.offset, REAL_MEM_SIZE);
98*4882a593Smuzhiyun 		mem_info.ready = 0;
99*4882a593Smuzhiyun 	}
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun@@ -119,7 +124,7 @@
102*4882a593Smuzhiyun LRMI_alloc_real(int size)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	int i;
105*4882a593Smuzhiyun-	char *r = (char *)REAL_MEM_BASE;
106*4882a593Smuzhiyun+	char *r = (char *)mem_info.offset;
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun 	if (!mem_info.ready)
109*4882a593Smuzhiyun 		return NULL;
110*4882a593Smuzhiyun@@ -151,7 +156,7 @@
111*4882a593Smuzhiyun LRMI_free_real(void *m)
112*4882a593Smuzhiyun {
113*4882a593Smuzhiyun 	int i;
114*4882a593Smuzhiyun-	char *r = (char *)REAL_MEM_BASE;
115*4882a593Smuzhiyun+	char *r = (char *)mem_info.offset;
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun 	if (!mem_info.ready)
118*4882a593Smuzhiyun 		return;
119*4882a593Smuzhiyun@@ -200,13 +205,15 @@
120*4882a593Smuzhiyun 	return *(unsigned short *)(i * 4);
121*4882a593Smuzhiyun }
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun-int LRMI_common_init(void)
124*4882a593Smuzhiyun+void *LRMI_common_init(int high_page)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun-	void *m;
127*4882a593Smuzhiyun+	void *m, *offset;
128*4882a593Smuzhiyun 	int fd_mem;
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun-	if (!real_mem_init())
131*4882a593Smuzhiyun-		return 0;
132*4882a593Smuzhiyun+	if (!real_mem_init(high_page))
133*4882a593Smuzhiyun+		return NULL;
134*4882a593Smuzhiyun+
135*4882a593Smuzhiyun+	offset = mem_info.offset - REAL_MEM_BASE;
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun 	/*
138*4882a593Smuzhiyun 	 Map the Interrupt Vectors (0x0 - 0x400) + BIOS data (0x400 - 0x502)
139*4882a593Smuzhiyun@@ -217,33 +224,33 @@
140*4882a593Smuzhiyun 	if (fd_mem == -1) {
141*4882a593Smuzhiyun 		real_mem_deinit();
142*4882a593Smuzhiyun 		perror("open /dev/mem");
143*4882a593Smuzhiyun-		return 0;
144*4882a593Smuzhiyun+		return NULL;
145*4882a593Smuzhiyun 	}
146*4882a593Smuzhiyun
147*4882a593Smuzhiyun-	m = mmap((void *)0, 0x502,
148*4882a593Smuzhiyun-	 PROT_READ | PROT_WRITE | PROT_EXEC,
149*4882a593Smuzhiyun-	 MAP_FIXED | MAP_SHARED, fd_mem, 0);
150*4882a593Smuzhiyun+	m = mmap(offset, 0x502,
151*4882a593Smuzhiyun+		 PROT_READ | PROT_WRITE | PROT_EXEC,
152*4882a593Smuzhiyun+		 MAP_FIXED | MAP_SHARED, fd_mem, 0);
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun 	if (m == (void *)-1) {
155*4882a593Smuzhiyun 		close(fd_mem);
156*4882a593Smuzhiyun 		real_mem_deinit();
157*4882a593Smuzhiyun 		perror("mmap /dev/mem");
158*4882a593Smuzhiyun-		return 0;
159*4882a593Smuzhiyun+		return NULL;
160*4882a593Smuzhiyun 	}
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun-	m = mmap((void *)0xa0000, 0x100000 - 0xa0000,
163*4882a593Smuzhiyun+	m = mmap(offset+0xa0000, 0x100000 - 0xa0000,
164*4882a593Smuzhiyun 	 PROT_READ | PROT_WRITE | PROT_EXEC,
165*4882a593Smuzhiyun 	 MAP_FIXED | MAP_SHARED, fd_mem, 0xa0000);
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun 	if (m == (void *)-1) {
168*4882a593Smuzhiyun-		munmap((void *)0, 0x502);
169*4882a593Smuzhiyun+		munmap(offset, 0x502);
170*4882a593Smuzhiyun 		close(fd_mem);
171*4882a593Smuzhiyun 		real_mem_deinit();
172*4882a593Smuzhiyun 		perror("mmap /dev/mem");
173*4882a593Smuzhiyun-		return 0;
174*4882a593Smuzhiyun+		return NULL;
175*4882a593Smuzhiyun 	}
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun 	close(fd_mem);
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun-	return 1;
180*4882a593Smuzhiyun+	return offset;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyundiff -ur libx86-1.1/x86-common.h libx86-1.1.hack/x86-common.h
183*4882a593Smuzhiyun--- libx86-1.1/x86-common.h	2006-09-07 18:44:27.000000000 -0400
184*4882a593Smuzhiyun+++ libx86-1.1.hack/x86-common.h	2009-10-26 16:01:19.000000000 -0400
185*4882a593Smuzhiyun@@ -40,4 +40,4 @@
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun void *LRMI_alloc_real(int size);
188*4882a593Smuzhiyun void LRMI_free_real(void *m);
189*4882a593Smuzhiyun-int LRMI_common_init(void);
190*4882a593Smuzhiyun+void *LRMI_common_init(int high_page);
191