Log of /SheepShaver/src/rom_patches.cpp
Parent Directory
|
Revision Log
Revision
1.46 -
(
view)
(
annotate)
-
[select for diffs]
Tue Aug 18 18:26:10 2009 UTC
(3 years, 9 months ago)
by
asvitkine
Branch:
MAIN
CVS Tags:
HEAD
Changes since
1.45: +53 -53 lines
Diff to
previous 1.45
[Michael Schmitt]
Attached is a patch to SheepShaver to fix memory allocation problems when OS X 10.5 is the host. It also relaxes the 512 MB RAM limit on OS X hosts.
Problem
-------
Some users have been unable to run SheepShaver on OS X 10.5 (Leopard) hosts. The symptom is error "ERROR: Cannot map RAM: File already exists".
SheepShaver allocates RAM at fixed addresses. If it is running in "Real" addressing mode, and can't allocate at address 0, then it was hard-coded to allocate the RAM area at 0x20000000. The ROM area as allocated at 0x40800000.
The normal configuration is for SheepShaver to run under SDL, which is a Cocoa wrapper. By the time SheepShaver does its memory allocations, the Cocoa application has already started. The result is the SheepShaver memory address space already contains libraries, fonts, Input Managers, and IOKit areas.
On Leopard hosts these areas can land on the same addresses SheepShaver needs, so SheepShaver's memory allocation fails.
Solution
--------
The approach is to change SheepShaver (on Unix & OS X hosts) to allocate the RAM area anywhere it can find the space, rather than at a fixed address.
This could result in the RAM allocated higher than the ROM area, which causes a crash. To prevent this from occurring, the RAM and ROM areas are allocated contiguously.
Previously the ROM starting address was a constant ROM_BASE, which was used throughout the source files. The ROM start address is now a variable ROMBase. ROMBase is allocated and set by main_*.cpp just like RAMBase.
A side-effect of this change is that it lifts the 512 MB RAM limit for OS X hosts. The limit was because the fixed RAM and ROM addresses were such that the RAM could only be 512 MB before it overlapped the ROM area.
Impact
------
The change to make ROMBase a variable is throughout all hosts & addressing modes.
The RAM and ROM areas will only shift when run on Unix & OS X hosts, otherwise the same fixed allocation address is used as before.
This change is limited to "Real" addressing mode. Unlike Basilisk II, SheepShaver *pre-calculates* the offset for "Direct" addressing mode; the offset is compiled into the program. If the RAM address were allowed to shift, it could result in the RAM area wrapping around address 0.
Changes to main_unix.cpp
------------------------
1. Real addressing mode no longer defines a RAM_BASE constant.
2. The base address of the Mac ROM (ROMBase) is defined and exported by this program.
3. Memory management helper vm_mac_acquire is renamed to vm_mac_acquire_fixed. Added a new memory management helper vm_mac_acquire, which allocates memory at any address.
4. Changed and rearranged the allocation of RAM and ROM areas.
Before it worked like this:
- Allocate ROM area
- If can, attempt to allocate RAM at address zero
- If RAM not allocated at 0, allocate at fixed address
We still want to try allocating the RAM at zero, and if using DIRECT addressing we're still going to use the fixed addresses. So we don't know where the ROM should be until after we do the RAM. The new logic is:
- If can, attempt to allocate RAM at address zero
- If RAM not allocated at 0
if REAL addressing
allocate RAM and ROM together. The ROM address is aligned to a 1 MB boundary
else (direct addressing)
allocate RAM at fixed address
- If ROM hasn't been allocated yet, allocate at fixed address
5. Calculate ROMBase and ROMBaseHost based on where the ROM was loaded.
6. There is a crash if the RAM is allocated too high. To try and catch this, check if it was allocated higher than the kernel data address.
7. Change subsequent code from using constant ROM_BASE to variable ROMBase.
Changes to Other Programs
-------------------------
emul_op.cpp, main.cpp, name_registery.cpp, rom_patches.cpp, rsrc_patches.cpp, emul_ppc.cpp, sheepshaver_glue.cpp, ppc-translate-cpp:
Change from constant ROM_BASE to variable ROMBase.
ppc_asm.S: It was setting register to a hard-coded literal address: 0x40b0d000. Changed to set it to ROMBase + 0x30d000.
ppc_asm.tmpl: It defined a macro ASM_LO16 but it assumed that the macro would always be used with operands that included a register specification. This is not true. Moved the register specification from the macro to the macro invocations.
main_beos.cpp, main_windows.cpp: Since the subprograms are all expecting a variable ROMBase, all the main_*.cpp pgrams have to define and export it. The ROM_BASE constant is moved here for consistency. The mains for beos and windows just allocate the ROM at the same fixed address as before, set ROMBaseHost and ROMBase to that address, and then use ROMBase for the subsequent code.
cpu_emulation.h: removed ROM_BASE constant. This value is moved to the main_*.cpp modules, to be consistent with RAM_BASE.
user_strings_unix.cpp, user_strings_unix.h: Added new error messages related to errors that occur when the RAM and ROM are allocated anywhere.
Revision
1.43 -
(
view)
(
annotate)
-
[select for diffs]
Sat May 6 10:30:00 2006 UTC
(7 years ago)
by
gbeauche
Branch:
MAIN
Changes since
1.42: +43 -2 lines
Diff to
previous 1.42
Add a few FE0A opcode patches. This slightly improves stability.
Revision
1.42 -
(
view)
(
annotate)
-
[select for diffs]
Mon Dec 12 20:46:31 2005 UTC
(7 years, 5 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.41: +20 -24 lines
Diff to
previous 1.41
avoid unaligned memory accessed when patching the ROM (IRIX/mips)
Revision
1.41 -
(
view)
(
annotate)
-
[select for diffs]
Sat Mar 5 15:44:03 2005 UTC
(8 years, 2 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.40: +9 -5 lines
Diff to
previous 1.40
Don't require an instruction skipper to fake SCSI globals
Revision
1.39 -
(
view)
(
annotate)
-
[select for diffs]
Thu Dec 16 23:14:25 2004 UTC
(8 years, 5 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.38: +2 -2 lines
Diff to
previous 1.38
patch the right branch instruction, it seems it doesn't much matter whether
we return success (0) or error (-1) in the previous casse.
Revision
1.37 -
(
view)
(
annotate)
-
[select for diffs]
Sun Dec 12 18:45:44 2004 UTC
(8 years, 5 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.36: +2 -2 lines
Diff to
previous 1.36
fix regression introduced in the load of OldWorld ROMs when Direct Addressing
mode was impemented
Revision
1.36 -
(
view)
(
annotate)
-
[select for diffs]
Sat Nov 13 14:09:15 2004 UTC
(8 years, 6 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.35: +190 -189 lines
Diff to
previous 1.35
Implement Direct Addressing mode similarly to Basilisk II. This is to get
SheepShaver working on OSes that don't support maipping of Low Memory globals
at 0x00000000, e.g. Windows.
Revision
1.33 -
(
view)
(
annotate)
-
[select for diffs]
Thu Jul 1 22:55:00 2004 UTC
(8 years, 10 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.32: +11 -0 lines
Diff to
previous 1.32
Try to recognize and handle PowerPC 970 (G5). Untested as I don't have such
platforms handy.
Revision
1.30 -
(
view)
(
annotate)
-
[select for diffs]
Tue Jun 22 17:10:06 2004 UTC
(8 years, 11 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.29: +0 -21 lines
Diff to
previous 1.29
Don't handle XLM_IRQ_NEST atomically in emulated mode. That's useless since
this variable is modified only within a single thread and interrupts are
not handled asynchronously.
Revision
1.29 -
(
view)
(
annotate)
-
[select for diffs]
Mon May 31 09:04:42 2004 UTC
(8 years, 11 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.28: +16 -7 lines
Diff to
previous 1.28
Enable Apple DR emulator from NewWorld ROMs only.
Revision
1.27 -
(
view)
(
annotate)
-
[select for diffs]
Tue Feb 24 11:12:51 2004 UTC
(9 years, 3 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.26: +1 -1 lines
Diff to
previous 1.26
Make SheepShaver work with OS 8.6 out-of-the-box with no extra patch for
the time being. i.e. ignore writes to the zero page when faking SCSIGlobals
Revision
1.26 -
(
view)
(
annotate)
-
[select for diffs]
Sun Feb 15 17:20:36 2004 UTC
(9 years, 3 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.25: +2 -13 lines
Diff to
previous 1.25
Now that we have AltiVec emulation, we can pretend for a G4 processor
Also make sure to actually fix PVR code for 7400
Revision
1.22 -
(
view)
(
annotate)
-
[select for diffs]
Mon Dec 15 15:25:38 2003 UTC
(9 years, 5 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.21: +1 -1 lines
Diff to
previous 1.21
There may be extra instructions before moving stuff to SCC registers.
Revision
1.21 -
(
view)
(
annotate)
-
[select for diffs]
Mon Dec 15 15:23:59 2003 UTC
(9 years, 5 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.20: +23 -6 lines
Diff to
previous 1.20
Fix SCC initialization code detection. Move up AddrMap patch space since
we clobber 40 bytes below it and it may intersect with GetScrap patch space.
Revision
1.20 -
(
view)
(
annotate)
-
[select for diffs]
Sun Dec 14 14:23:46 2003 UTC
(9 years, 5 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.19: +227 -133 lines
Diff to
previous 1.19
Generic ROM patches from ROMTYPE_PARCELS experiments, no apparent
regession. There is no improvement either.
Revision
1.19 -
(
view)
(
annotate)
-
[select for diffs]
Fri Dec 5 12:37:14 2003 UTC
(9 years, 5 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.18: +11 -2 lines
Diff to
previous 1.18
Fake reading from [HpChk]+4 (FIXME: the callchain reports some function
from DriverServicesLib). Also make fake SCSIGlobals map to zero page.
Revision
1.17 -
(
view)
(
annotate)
-
[select for diffs]
Tue Oct 7 19:28:09 2003 UTC
(9 years, 7 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.16: +4 -4 lines
Diff to
previous 1.16
Adapt ROM patches space to Gossamer ROMs layout. Weird that it passed the
other day.
Revision
1.14 -
(
view)
(
annotate)
-
[select for diffs]
Mon Oct 6 21:00:48 2003 UTC
(9 years, 7 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.13: +13 -2 lines
Diff to
previous 1.13
- Add checks against ROM patches space
- Make sure to also load the floppy disk driver with Gossamer ROMs so
that exfs feature can work too
Revision
1.13 -
(
view)
(
annotate)
-
[select for diffs]
Sun Oct 5 23:49:19 2003 UTC
(9 years, 7 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.12: +3 -11 lines
Diff to
previous 1.12
tm_task is actually correct for both nw & gossamer ROMs
Revision
1.8 -
(
view)
(
annotate)
-
[select for diffs]
Sun Sep 28 21:27:33 2003 UTC
(9 years, 7 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.7: +28 -6 lines
Diff to
previous 1.7
Try to handle XLM_IRQ_NEST atomically in emulated PPC views. Fix placement
of fake SCSIGlobals (disabled for now). Switch back to mono core emulation
until things are debugged enough. Implement get_resource() et al.
Revision
1.7 -
(
view)
(
annotate)
-
[select for diffs]
Sun Sep 7 14:33:51 2003 UTC
(9 years, 8 months ago)
by
gbeauche
Branch:
MAIN
Changes since
1.6: +45 -25 lines
Diff to
previous 1.6
- Integrate new NativeOp instructions to be used as trampolines to call
native functions from ppc code.
- Little endian fixes in emul_op.cpp
- Add new 'gpch' 750 patch to workaround crash with MacOS 8.6
- Don't crash in Process Manager on reset/shutdown with MacOS 8.6
- We also have an experimental interrupt thread in emulation mode
Revision
1.6 -
(
view)
(
annotate)
-
[select for diffs]
Wed May 21 19:31:57 2003 UTC
(10 years ago)
by
gbeauche
Branch:
MAIN
Changes since
1.5: +3 -1 lines
Diff to
previous 1.5
Don't call FE0A opcode in Shutdown Manager: handle better NewWorld ROMs.
i.e. don't force a "bra" if there was no "beq" beforehand.
Revision
1.5 -
(
view)
(
annotate)
-
[select for diffs]
Wed May 21 18:57:17 2003 UTC
(10 years ago)
by
gbeauche
Branch:
MAIN
Changes since
1.4: +14 -0 lines
Diff to
previous 1.4
Force installation of floppy driver with NewWorld ROMs otherwise we fail
to open it and further install ExtFS & NQD acceleration.
Revision
1.4 -
(
view)
(
annotate)
-
[select for diffs]
Sat May 17 08:42:34 2003 UTC
(10 years ago)
by
gbeauche
Branch:
MAIN
Changes since
1.3: +10 -7 lines
Diff to
previous 1.3
Finally enable boot on MacOS 8.6 Update CD from iMac DV
- Don't read PVR at ROM_BASE + 0x314600
- Generated code for FC1E and FE0A don't really match comments
- Move FC1E routine base to ROM_BASE + 0x36fb00
- Recognize iMacUpdate 1.1 ROM (nwrom v1.2.1)
Revision
1.2 -
(
view)
(
annotate)
-
[select for diffs]
Sun Apr 21 15:07:07 2002 UTC
(11 years, 1 month ago)
by
gbeauche
Branch:
MAIN
Changes since
1.1: +123 -0 lines
Diff to
previous 1.1
Add support to decode parcels-based ROMs
- include/rom_patches.h (DecodeROM): Declare.
- rom_patches.cpp (DecodeROM): Define.
- Unix/main_unix.cpp, BeOS/main_beos.cpp (decode_lzss): Move to...
- rom_patches.cpp (decode_lzss): ... here.
- Unix/main_unix.cpp (main): Call DecodeROM().
- BeOS/main_beos.cpp (SheepShaver::load_rom): Call DecodeROM().
This form allows you to request diffs between any two revisions of this file.
For each of the two "sides" of the diff,
select a symbolic revision name using the selection box, or choose
'Use Text Field' and enter a numeric revision.