On 01/03/2014 01:49, BALATON Zoltan wrote:
On Fri, 28 Feb 2014, BALATON Zoltan wrote:
On Thu, 27 Feb 2014, Mark Cave-Ayland wrote:
FWIW there is a known issue with PPC's next-property iterator being implemented differently to the standard (see Olivier's tentative patch at http://www.openfirmware.info/pipermail/openbios/2014-February/008141.html). It's likely that a broken device tree iteration could be the cause of the MorphOS bootloader not being able to locate a suitable console mode which could be related to your issue.
I think I did not hit this one yet at least the console problem is surely not caused by this but by MorphOS only supporting some specific Radeon GPUs that are found in the PPC Macs it is supporting. It is looking for them by their vendor-id:device-id and fails if not found, but tries to continue anyway.
While the next property iterator is not the cause of the console failed message it may very well be related to the hang in CPU detection later that I'm currently facing. I see the following openbios debug output with DEBUG_CIF enabled in libopenbios/client.c while MorphOS tries to detect the CPU:
finddevice("/cpus") = 0xfff4bbec child(0xfff4bbec) = 0xfff5194c nextprop(0xfff5194c, "", 0x07de7e30) = 1 0x07de7e30 6e __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ n getprop(0xfff5194c, "name", 0x07de7df0, 64) = 11 0x07de7df0 50 6f 77 65 72 50 43 2c 47 34 00 __ __ __ __ __ PowerPC,G4. nextprop(0xfff5194c, "name", 0x07de7e30) = -1 child(0xfff5194c) = 0x00000000
and here it gives up and freezes. This is with Olivier's patch applied, which does not change anything in the above, I'm seeing this with or without this patch. It seems to be a case of nextprop failing which the patch does not correct. Any hints how to debug it further? I don't know how to test or trace forth so I'd need some help with this.
I am afraid the patch cannot change anything to that. The nextprop(..."name"...) behavior is very strange.
It is possible to invoke manually "nextprop" from the OpenBIOS prompt :
------------------------------------------------------------------- cd /cpus/PowerPC,G4
\ Empty string : Returns 1 "name"= first property " mmmmmmmmmmmm" drop dup " "(00)" drop ?active-package " nextprop" client-call-iface . cr . dup cstrlen cr type cr
\ Nonexistant : Returns -1 "" " mmmmmmmmmmmm" drop dup " mmmmm"(00)" drop ?active-package " nextprop" client-call-iface . cr . dup cstrlen cr type cr
\ Property : Returns 1 and the following one : "device_type" " mmmmmmmmmmmm" drop dup " name"(00)" drop ?active-package " nextprop" client-call-iface . cr . dup cstrlen cr type cr
\ Last : Returns 0 "" " mmmmmmmmmmmm" drop dup " translations"(00)" drop ?active-package " nextprop" client-call-iface . cr . dup cstrlen cr type cr
------------------------------------------------------------------- ... and it works!
Maybe you could try this :
Index: libopenbios/client.c =================================================================== --- libopenbios/client.c (révision 1269) +++ libopenbios/client.c (copie de travail) @@ -189,7 +189,7 @@ memdump(arg2pointer(pb->args[2]), MIN(pb->args[3], pb->args[pb->nargs])); } else if (strcmp(service, "nextprop") == 0) { printk(FMT_prom_arg "\n", pb->args[pb->nargs]); - memdump(arg2pointer(pb->args[2]), pb->args[pb->nargs]); + memdump(arg2pointer(pb->args[2]), 32); } else if (strcmp(service, "setprop") == 0) { printk(FMT_prom_arg "\n", pb->args[pb->nargs]); } else if (strcmp(service, "canon") == 0) { ===================================================================
It will not solve the problem, but it will show if nextprop changes the memory buffer.
"pb->args[pb->nargs]" is wrong, because the return value of nextprop is not the lenght of the property.
Finally, you can also try this :
Index: forth/system/ciface.fs =================================================================== --- forth/system/ciface.fs (révision 1269) +++ forth/system/ciface.fs (copie de travail) @@ -110,18 +110,7 @@ ( buf prev prev_len ) 0 3 pick c!
- \ verify that prev exists (overkill...) - dup if - 2dup r@ get-package-property if - r> 2drop 2drop -1 exit - else - 2drop - then - then - - ( buf prev prev_len ) - - r> next-property if + r> next-property if ( buf name name_len ) dup 1+ -rot ci-strcpy drop 1 else =================================================================== (or next-property-std above if you applied my previous patch)
Maybe it will change something.
Olivier