|
Lines 45-58
Link Here
|
| 45 |
static struct { |
45 |
static struct { |
| 46 |
int ready; |
46 |
int ready; |
| 47 |
int count; |
47 |
int count; |
|
|
48 |
void *offset; |
| 48 |
struct mem_block blocks[REAL_MEM_BLOCKS]; |
49 |
struct mem_block blocks[REAL_MEM_BLOCKS]; |
| 49 |
} mem_info = { 0 }; |
50 |
} mem_info = { 0 }; |
| 50 |
|
51 |
|
| 51 |
static int |
52 |
static int |
| 52 |
real_mem_init(void) |
53 |
real_mem_init(int high_page) |
| 53 |
{ |
54 |
{ |
| 54 |
void *m; |
55 |
void *m; |
| 55 |
int fd_zero; |
56 |
int fd_zero, flags = MAP_SHARED; |
| 56 |
|
57 |
|
| 57 |
if (mem_info.ready) |
58 |
if (mem_info.ready) |
| 58 |
return 1; |
59 |
return 1; |
|
Lines 63-71
Link Here
|
| 63 |
return 0; |
64 |
return 0; |
| 64 |
} |
65 |
} |
| 65 |
|
66 |
|
|
|
67 |
if (!high_page) |
| 68 |
flags |= MAP_FIXED; |
| 69 |
|
| 66 |
m = mmap((void *)REAL_MEM_BASE, REAL_MEM_SIZE, |
70 |
m = mmap((void *)REAL_MEM_BASE, REAL_MEM_SIZE, |
| 67 |
PROT_READ | PROT_WRITE | PROT_EXEC, |
71 |
PROT_READ | PROT_WRITE | PROT_EXEC, |
| 68 |
MAP_FIXED | MAP_SHARED, fd_zero, 0); |
72 |
flags, fd_zero, 0); |
| 69 |
|
73 |
|
| 70 |
if (m == (void *)-1) { |
74 |
if (m == (void *)-1) { |
| 71 |
perror("mmap /dev/zero"); |
75 |
perror("mmap /dev/zero"); |
|
Lines 76-81
Link Here
|
| 76 |
close(fd_zero); |
80 |
close(fd_zero); |
| 77 |
|
81 |
|
| 78 |
mem_info.ready = 1; |
82 |
mem_info.ready = 1; |
|
|
83 |
mem_info.offset = m; |
| 79 |
mem_info.count = 1; |
84 |
mem_info.count = 1; |
| 80 |
mem_info.blocks[0].size = REAL_MEM_SIZE; |
85 |
mem_info.blocks[0].size = REAL_MEM_SIZE; |
| 81 |
mem_info.blocks[0].free = 1; |
86 |
mem_info.blocks[0].free = 1; |
|
Lines 87-93
Link Here
|
| 87 |
real_mem_deinit(void) |
92 |
real_mem_deinit(void) |
| 88 |
{ |
93 |
{ |
| 89 |
if (mem_info.ready) { |
94 |
if (mem_info.ready) { |
| 90 |
munmap((void *)REAL_MEM_BASE, REAL_MEM_SIZE); |
95 |
munmap(mem_info.offset, REAL_MEM_SIZE); |
| 91 |
mem_info.ready = 0; |
96 |
mem_info.ready = 0; |
| 92 |
} |
97 |
} |
| 93 |
} |
98 |
} |
|
Lines 119-125
Link Here
|
| 119 |
LRMI_alloc_real(int size) |
124 |
LRMI_alloc_real(int size) |
| 120 |
{ |
125 |
{ |
| 121 |
int i; |
126 |
int i; |
| 122 |
char *r = (char *)REAL_MEM_BASE; |
127 |
char *r = (char *)mem_info.offset; |
| 123 |
|
128 |
|
| 124 |
if (!mem_info.ready) |
129 |
if (!mem_info.ready) |
| 125 |
return NULL; |
130 |
return NULL; |
|
Lines 151-157
Link Here
|
| 151 |
LRMI_free_real(void *m) |
156 |
LRMI_free_real(void *m) |
| 152 |
{ |
157 |
{ |
| 153 |
int i; |
158 |
int i; |
| 154 |
char *r = (char *)REAL_MEM_BASE; |
159 |
char *r = (char *)mem_info.offset; |
| 155 |
|
160 |
|
| 156 |
if (!mem_info.ready) |
161 |
if (!mem_info.ready) |
| 157 |
return; |
162 |
return; |
|
Lines 200-212
Link Here
|
| 200 |
return *(unsigned short *)(i * 4); |
205 |
return *(unsigned short *)(i * 4); |
| 201 |
} |
206 |
} |
| 202 |
|
207 |
|
| 203 |
int LRMI_common_init(void) |
208 |
void *LRMI_common_init(int high_page) |
| 204 |
{ |
209 |
{ |
| 205 |
void *m; |
210 |
void *m, *offset; |
| 206 |
int fd_mem; |
211 |
int fd_mem; |
| 207 |
|
212 |
|
| 208 |
if (!real_mem_init()) |
213 |
if (!real_mem_init(high_page)) |
| 209 |
return 0; |
214 |
return NULL; |
|
|
215 |
|
| 216 |
offset = mem_info.offset - REAL_MEM_BASE; |
| 210 |
|
217 |
|
| 211 |
/* |
218 |
/* |
| 212 |
Map the Interrupt Vectors (0x0 - 0x400) + BIOS data (0x400 - 0x502) |
219 |
Map the Interrupt Vectors (0x0 - 0x400) + BIOS data (0x400 - 0x502) |
|
Lines 217-249
Link Here
|
| 217 |
if (fd_mem == -1) { |
224 |
if (fd_mem == -1) { |
| 218 |
real_mem_deinit(); |
225 |
real_mem_deinit(); |
| 219 |
perror("open /dev/mem"); |
226 |
perror("open /dev/mem"); |
| 220 |
return 0; |
227 |
return NULL; |
| 221 |
} |
228 |
} |
| 222 |
|
229 |
|
| 223 |
m = mmap((void *)0, 0x502, |
230 |
m = mmap(offset, 0x502, |
| 224 |
PROT_READ | PROT_WRITE | PROT_EXEC, |
231 |
PROT_READ | PROT_WRITE | PROT_EXEC, |
| 225 |
MAP_FIXED | MAP_SHARED, fd_mem, 0); |
232 |
MAP_FIXED | MAP_SHARED, fd_mem, 0); |
| 226 |
|
233 |
|
| 227 |
if (m == (void *)-1) { |
234 |
if (m == (void *)-1) { |
| 228 |
close(fd_mem); |
235 |
close(fd_mem); |
| 229 |
real_mem_deinit(); |
236 |
real_mem_deinit(); |
| 230 |
perror("mmap /dev/mem"); |
237 |
perror("mmap /dev/mem"); |
| 231 |
return 0; |
238 |
return NULL; |
| 232 |
} |
239 |
} |
| 233 |
|
240 |
|
| 234 |
m = mmap((void *)0xa0000, 0x100000 - 0xa0000, |
241 |
m = mmap(offset+0xa0000, 0x100000 - 0xa0000, |
| 235 |
PROT_READ | PROT_WRITE | PROT_EXEC, |
242 |
PROT_READ | PROT_WRITE | PROT_EXEC, |
| 236 |
MAP_FIXED | MAP_SHARED, fd_mem, 0xa0000); |
243 |
MAP_FIXED | MAP_SHARED, fd_mem, 0xa0000); |
| 237 |
|
244 |
|
| 238 |
if (m == (void *)-1) { |
245 |
if (m == (void *)-1) { |
| 239 |
munmap((void *)0, 0x502); |
246 |
munmap(offset, 0x502); |
| 240 |
close(fd_mem); |
247 |
close(fd_mem); |
| 241 |
real_mem_deinit(); |
248 |
real_mem_deinit(); |
| 242 |
perror("mmap /dev/mem"); |
249 |
perror("mmap /dev/mem"); |
| 243 |
return 0; |
250 |
return NULL; |
| 244 |
} |
251 |
} |
| 245 |
|
252 |
|
| 246 |
close(fd_mem); |
253 |
close(fd_mem); |
| 247 |
|
254 |
|
| 248 |
return 1; |
255 |
return offset; |
| 249 |
} |
256 |
} |