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?
On Fri, Dec 11, 2015 at 10:31:03AM -0500, Programmingkid wrote:
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.
It is an extension: they have a separate return stack in interpret mode (access to this cannot be mixed with R accesses from compiled code). This is well in line with DO LOOP and other structure words in interpret mode, which is an OF requirement.
The <DESCRIPTION> tag looks like this in yaboot (Used by Linux):
<DESCRIPTION> PowerPC GNU/Linux First Stage Bootstrap </DESCRIPTION>
Yaboot does not necessarily use CHRP boot scripts, fwiw.
Segher
On Dec 13, 2015, at 11:17 PM, Segher Boessenkool wrote:
On Fri, Dec 11, 2015 at 10:31:03AM -0500, Programmingkid wrote:
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.
It is an extension: they have a separate return stack in interpret mode (access to this cannot be mixed with R accesses from compiled code). This is well in line with DO LOOP and other structure words in interpret mode, which is an OF requirement.
The <DESCRIPTION> tag looks like this in yaboot (Used by Linux):
<DESCRIPTION> PowerPC GNU/Linux First Stage Bootstrap </DESCRIPTION>
Yaboot does not necessarily use CHRP boot scripts, fwiw.
Segher
Thank you very much Segher.