[OpenBIOS] [PATCHv2 2/6] ppc: fix ESCC reg properties

Programmingkid programmingkidx at gmail.com
Tue Feb 23 21:15:46 CET 2016


On Feb 23, 2016, at 2:38 PM, Howard Spoelstra wrote:

> 
>> On 23 Feb 2016, at 20:33, Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk> wrote:
>> 
>> On 23/02/16 03:58, Programmingkid wrote:
>> 
>>> On Feb 20, 2016, at 12:18 PM, Mark Cave-Ayland wrote:
>>> 
>>>> I/O offsets were wrong in legacy mode and some were missing in non-legacy mode.
>>>> This fixes serial port detection in NetBSD, which was ignoring it.
>>>> This also partly fixes MacOS 9.2, which relies on them to initialize OpenTransport.
>>>> 
>>>> Based upon an original patch from Hervé Poussineau <hpoussin at reactos.org>.
>>>> 
>>>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>
>>>> ---
>>>> openbios-devel/drivers/escc.c |   43 ++++++++++++++++++++++++++++-------------
>>>> 1 file changed, 30 insertions(+), 13 deletions(-)
>>>> 
>>>> diff --git a/openbios-devel/drivers/escc.c b/openbios-devel/drivers/escc.c
>>>> index 9b87083..44b73f0 100644
>>>> --- a/openbios-devel/drivers/escc.c
>>>> +++ b/openbios-devel/drivers/escc.c
>>>> @@ -388,7 +388,20 @@ escc_add_channel(const char *path, const char *node, phys_addr_t addr,
>>>>    cell props[10];
>>>>    int index;
>>>>    int legacy;
>>>> -
>>>> +    int reg_offsets[2][2][3] = {
>>>> +        {
>>>> +            /* ch-b */
>>>> +            { 0x00, 0x10, 0x40 },
>>>> +            /* ch-a */
>>>> +            { 0x20, 0x30, 0x50 }
>>>> +        },{
>>>> +            /* legacy ch-b */
>>>> +            { 0x0, 0x2, 0x8 },
>>>> +            /* legacy ch-a */
>>>> +            { 0x4, 0x6, 0xa }
>>>> +        }
>>>> +    };
>>>> +    
>>>>    switch (esnum) {
>>>>        case 2: index = 1; legacy = 0; break;
>>>>        case 3: index = 0; legacy = 0; break;
>>>> @@ -425,17 +438,21 @@ escc_add_channel(const char *path, const char *node, phys_addr_t addr,
>>>>    set_property(dnode, "compatible", buf, 9);
>>>> 
>>>>    if (legacy) {
>>>> -        props[0] = IO_ESCC_LEGACY_OFFSET + index * 0x4;
>>>> -        props[1] = 0x00000001;
>>>> -        props[2] = IO_ESCC_LEGACY_OFFSET + index * 0x4 + 2;
>>>> -        props[3] = 0x00000001;
>>>> -        props[4] = IO_ESCC_LEGACY_OFFSET + index * 0x4 + 6;
>>>> -        props[5] = 0x00000001;
>>>> +        props[0] = IO_ESCC_LEGACY_OFFSET + reg_offsets[legacy][index][0];
>>>> +        props[1] = 0x1;
>>>> +        props[2] = IO_ESCC_LEGACY_OFFSET + reg_offsets[legacy][index][1];
>>>> +        props[3] = 0x1;
>>>> +        props[4] = IO_ESCC_LEGACY_OFFSET + reg_offsets[legacy][index][2];
>>>> +        props[5] = 0x1;
>>>>        set_property(dnode, "reg", (char *)&props, 6 * sizeof(cell));
>>>>    } else {
>>>> -        props[0] = IO_ESCC_OFFSET + index * 0x20;
>>>> -        props[1] = 0x00000020;
>>>> -        set_property(dnode, "reg", (char *)&props, 2 * sizeof(cell));
>>>> +        props[0] = IO_ESCC_OFFSET + reg_offsets[legacy][index][0];
>>>> +        props[1] = 0x1;
>>>> +        props[2] = IO_ESCC_OFFSET + reg_offsets[legacy][index][1];
>>>> +        props[3] = 0x1;
>>>> +        props[4] = IO_ESCC_OFFSET + reg_offsets[legacy][index][2];
>>>> +        props[5] = 0x1;
>>>> +        set_property(dnode, "reg", (char *)&props, 6 * sizeof(cell));
>>>>    }
>>>> 
>>>>    if (legacy) {
>>>> @@ -446,13 +463,13 @@ escc_add_channel(const char *path, const char *node, phys_addr_t addr,
>>>>    OLDWORLD(set_property(dnode, "AAPL,address",
>>>>            (char *)&props, 1 * sizeof(cell)));
>>>> 
>>>> -    props[0] = 0x00000010 - index;
>>>> +    props[0] = 0x10 - index;
>>>>    OLDWORLD(set_property(dnode, "AAPL,interrupts",
>>>>            (char *)&props, 1 * sizeof(cell)));
>>>> 
>>>>    props[0] = (0x24) + index;
>>>> -    props[1] = 0;
>>>> -    props[2] = 0;
>>>> +    props[1] = 0x0;
>>>> +    props[2] = 0x0;
>>>>    NEWWORLD(set_property(dnode, "interrupts",
>>>>             (char *)&props, 3 * sizeof(cell)));
>>>> 
>>>> -- 
>>>> 1.7.10.4
>>> 
>>> 
>>> I had a lot of problems applying this patch. Eventually I just applied it by hand. Testing your v2 patch set with Mac OS 9.2 ends with an Illegal Instruction error for me. When I tested Mac OS 9.0, the OS just stops booting and does nothing. It doesn't crash. I just sits there doing nothing. The mouse cursor still can move. I tried this OS again and it crashed on the second time. The third time it just sat there doing nothing like the first time. 
>> 
>> Just this one patch, or the entire patchset? Pretty much everything just
>> works with "git am" these days?
>> 
>> I think there are two issues here: firstly something does cause memory
>> corruption which can cause random crashes under OS 9, and secondly the
>> changes to the serial ports. We know that OT probe causes OS 9 to
>> crash/hang when booting from a vanilla image, but the probe doesn't take
>> place on pre-installed images. In these cases the hang is almost better
>> than the crash in that at least the OS gets to the point where it can
>> probe the serial ports, it is just that the QEMU emulation is lacking.
>> 
>> If the change in behaviour occurs when booting from a fresh ISO then I'm
>> not too worried because everyone testing at the moment will have removed
>> these extensions from their images. However if existing installed images
>> start to fail then perhaps the patch needs more work.
>> 
>> Howard, is this something that you can test? I believe this is a good
>> candidate to be applied to trunk this week in time for QEMU freeze since
>> it definitely fixes the properties in terms of the reference device tree
>> and indeed it works to the point where NetBSD/Linux can now see the
>> serial ports and use them.
>> 
>> 
>> ATB,
>> 
>> Mark.
>> 
> 
> Hi, yes, I can test. Can you provide a build? I tried building, but the resulting binary doesn’t boot my OS 9 images, only the OSX images ;-)

I know what is wrong. There is a patch needed that filters out linefeed and carriage return characters that needs to be applied. Here is the patch.

---
 openbios-devel/forth/bootstrap/interpreter.fs |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/openbios-devel/forth/bootstrap/interpreter.fs b/openbios-devel/forth/bootstrap/interpreter.fs
index 5187058..74a109f 100644
--- a/openbios-devel/forth/bootstrap/interpreter.fs
+++ b/openbios-devel/forth/bootstrap/interpreter.fs
@@ -163,7 +163,7 @@ defer outer-interpreter
 : evaluate ( str len -- ?? )
   2dup + -rot
   over + over do 
-    i c@ 0a = if 
+    i c@ dup 0a = swap 0d = or if 
       i over - 
       (evaluate)
       i 1+ 
-- 
1.7.10.4

Mark hasn't applied this patch because it causes problems with Linux.


More information about the OpenBIOS mailing list