[OpenBIOS] patch that causes a regression with Mac OS X booting
Programmingkid
programmingkidx at gmail.com
Fri Dec 11 16:31:03 CET 2015
On Dec 11, 2015, at 6:28 AM, Mark Cave-Ayland wrote:
> On 10/12/15 15:02, Programmingkid wrote:
>
>> https://lists.gnu.org/archive/html/qemu-devel/2015-10/msg05556.html
>>
>> From the message in the link, you said there was a patch that is needed to boot Mac OS 9, but can't be applied because it causes a regression with Mac OS X. Could you send me the patch. I would like to fix it so that all the patches needed to boot Mac OS 9 can be applied to OpenBIOS. Thanks.
>
> The outstanding OpenBIOS patch is this one:
>
> http://www.openfirmware.info/pipermail/openbios/2015-August/008763.html
>
> The reason it can't be applied is a little complicated. The MacOS 9
> bootloader alters the call stack using >r and r> which is illegal
> outside of a word in Forth - it's like a function changing it's stack
> pointing and hoping the caller can cope upon return.
Apple really made something that does that? What were they thinking?
I can only guess that they didn't like Forth.
> I suspect the above patch only works through chance because OpenBIOS
> uses a trampoline to execute words and so the trampoline is corrupted on
> exit. It also causes yaboot to throw errors in my tests here, as found
> on a Fedora PPC Linux for example which isn't a good solution either :(
Given the info about how Mac OS 9 corrupts the call stack,
maybe we could make it so that this patch only works
when booting Mac OS 9. So that leads to the question - How
do we know when Mac OS 9 is booting? There are several tags
in the bootx and yaboot files that can be used to help.
The <DESCRIPTION> tag looks like this in yaboot (Used by Linux):
<DESCRIPTION>
PowerPC GNU/Linux First Stage Bootstrap
</DESCRIPTION>
It looks like this in Mac OS 9's boot script:
<DESCRIPTION>
MacROM for NewWorld.
</DESCRIPTION>
It looks like this in Mac OS X's bootx:
<DESCRIPTION>
Boot Loader for Mac OS X.
</DESCRIPTION>
Maybe something like this can be added to OpenBIOS:
if(strcmp(descriptionString, "MacROM for NewWorld.") == 0) // Mac OS 9
{
using_Mac_OS_9 = true;
}
Given that the patch looks like this:
- i c@ 0a = if
+ i c@ dup 0a = swap 0d = or if
This might be the solution:
i c@ /* common to both conditions, so always execute it */
if(using_Mac_OS_9 == true) {
0a = if
}
else {
dup 0a = swap 0d = or if
}
The if/else code would probably be in forth. Setting the using_Mac_OS_9 variable can be done in C.
Does this solution sound good?
I know you are not convinced the code added in the patch is the right way to do things, do you have an idea what might be a better solution? Something that isn't so hacky?
More information about the OpenBIOS
mailing list