369 |
|
uint32 rom_size, actual; |
370 |
|
uint8 *rom_tmp; |
371 |
|
time_t now, expire; |
372 |
+ |
bool memory_mapped_from_zero; |
373 |
|
|
374 |
|
// Initialize variables |
375 |
|
RAMBase = 0; |
744 |
|
goto quit; |
745 |
|
} |
746 |
|
|
746 |
– |
#ifndef PAGEZERO_HACK |
747 |
– |
// Create Low Memory area (0x0000..0x3000) |
748 |
– |
if (vm_mac_acquire(0, 0x3000) < 0) { |
749 |
– |
sprintf(str, GetString(STR_LOW_MEM_MMAP_ERR), strerror(errno)); |
750 |
– |
ErrorAlert(str); |
751 |
– |
goto quit; |
752 |
– |
} |
753 |
– |
lm_area_mapped = true; |
754 |
– |
#endif |
755 |
– |
|
747 |
|
// Create areas for Kernel Data |
748 |
|
if (!kernel_data_init()) |
749 |
|
goto quit; |
806 |
|
WarningAlert(GetString(STR_SMALL_RAM_WARN)); |
807 |
|
RAMSize = 8*1024*1024; |
808 |
|
} |
809 |
< |
|
810 |
< |
if (vm_mac_acquire(RAM_BASE, RAMSize) < 0) { |
811 |
< |
sprintf(str, GetString(STR_RAM_MMAP_ERR), strerror(errno)); |
812 |
< |
ErrorAlert(str); |
813 |
< |
goto quit; |
809 |
> |
memory_mapped_from_zero = false; |
810 |
> |
#if REAL_ADDRESSING && HAVE_LINKER_SCRIPT |
811 |
> |
if (vm_mac_acquire(0, RAMSize) == 0) { |
812 |
> |
D(bug("Could allocate RAM from 0x0000\n")); |
813 |
> |
RAMBase = 0; |
814 |
> |
memory_mapped_from_zero = true; |
815 |
> |
} |
816 |
> |
#endif |
817 |
> |
if (!memory_mapped_from_zero) { |
818 |
> |
#ifndef PAGEZERO_HACK |
819 |
> |
// Create Low Memory area (0x0000..0x3000) |
820 |
> |
if (vm_mac_acquire(0, 0x3000) < 0) { |
821 |
> |
sprintf(str, GetString(STR_LOW_MEM_MMAP_ERR), strerror(errno)); |
822 |
> |
ErrorAlert(str); |
823 |
> |
goto quit; |
824 |
> |
} |
825 |
> |
lm_area_mapped = true; |
826 |
> |
#endif |
827 |
> |
if (vm_mac_acquire(RAM_BASE, RAMSize) < 0) { |
828 |
> |
sprintf(str, GetString(STR_RAM_MMAP_ERR), strerror(errno)); |
829 |
> |
ErrorAlert(str); |
830 |
> |
goto quit; |
831 |
> |
} |
832 |
> |
RAMBase = RAM_BASE; |
833 |
|
} |
834 |
< |
RAMBaseHost = Mac2HostAddr(RAM_BASE); |
834 |
> |
RAMBaseHost = Mac2HostAddr(RAMBase); |
835 |
|
#if !EMULATED_PPC |
836 |
|
if (vm_protect(RAMBaseHost, RAMSize, VM_PAGE_READ | VM_PAGE_WRITE | VM_PAGE_EXECUTE) < 0) { |
837 |
|
sprintf(str, GetString(STR_RAM_MMAP_ERR), strerror(errno)); |
839 |
|
goto quit; |
840 |
|
} |
841 |
|
#endif |
832 |
– |
RAMBase = RAM_BASE; |
842 |
|
ram_area_mapped = true; |
843 |
|
D(bug("RAM area at %p (%08x)\n", RAMBaseHost, RAMBase)); |
844 |
|
|
994 |
|
|
995 |
|
// Delete RAM area |
996 |
|
if (ram_area_mapped) |
997 |
< |
vm_mac_release(RAM_BASE, RAMSize); |
997 |
> |
vm_mac_release(RAMBase, RAMSize); |
998 |
|
|
999 |
|
// Delete ROM area |
1000 |
|
if (rom_area_mapped) |