Skip to contentSkip to conversation

fix PPC OpenHackWare for Linux 2.6

PATCH In review René Rebe 2 participants 2 messages May 6, 2008

lore
Share & tools
lore

René Rebe

author
#0 lore raw

PATCH 1/1 fix PPC OpenHackWare for Linux 2.6

Hi all,

after quite some debugging thru the early startup code of Linux 2.6 I fixed some issues in the OpenHackWare "BIOS" for PPC emulation.

The diff below is against the Qemu pc-bios/ohw.diff, I can also provide the resulting binary if interested.

First I fixed the linker script to actually work at all (actually I also installed an old toolchain, just to find out that even that one would not link OHW, ...

Second, Linux 2.6 flatten_device_tree stuff in arch/powerpc/kernel/prom_init.c check for a return value of 1, as I do not have the IEEE spec on my desk I assumed it means success, and with the change the flattened device tree is no longer empty, helping a great deal continuing to boot ...

Third, when selecting a core99 machine, Linux assumes to find an NVRAM, and panics in some init_timer if there isn't one. Though a core99 machine does not yet work perfectly, further investigation to be done.

Linewise the FB CLUT is with Linux 2.6 has some issue and the FB thus shows false colors, but good enough to work with for now.

Oh, and last but not least with a self built prom, I hit this "error booting from CD-ROM bug, that Jocelyn hacked around in r3309. As that was just a binary only blob fix and there is no newer version of OHW I just commented out the "return on error" which allowed to boot CD images on my side.

As this is the first nightly track thru the guts of Qemu any comment welcome:

pc-bios/ohw.diff +55 -12
@@ -1,3 +1,19 @@
+Make it link at al.
+
+  - Rene Rebe <[email protected]>
+
+--- OpenHackWare-release-0.4/src/main.ld	2005-03-31 09:23:33.000000000 +0200
++++ OpenHackWare-release-0.4-hacked/src/main.ld	2008-05-06 11:23:29.000000000 +0200
+@@ -49,7 +49,7 @@
+         _sdata_end = . ;
+         . = ALIGN(4) ;
+         _ro_start = . ;
+-        .rodata    : { *(.rodata) } > bios
++        .rodata    : { *(.rodata*) } > bios
+         _ro_end = . ;
+         . = ALIGN(4) ;
+         _RTAS_start = .;
+
 diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/bios.h OpenHackWare-release-0.4/src/bios.h
 --- OpenHackWare-release-0.4.org/src/bios.h	2005-04-06 23:20:22.000000000 +0200
 +++ OpenHackWare-release-0.4/src/bios.h	2005-07-07 01:10:20.000000000 +0200
@@ -748,24 +764,14 @@
          {
              /* Hack taken 'as-is' from PearPC */
              unsigned char info[] = {
-@@ -1596,7 +1627,9 @@
-         OF_node_put(OF_env, brom);
+@@ -1596,6 +1627,7 @@
          OF_node_put(OF_env, rom);
      }
-+#if 0
      /* From here, hardcoded hacks to get a Mac-like machine */
-+    /* XXX: Core99 does not seem to like this NVRAM tree */
++    /* XXX: Not yet perfect, but Linux 2.6 does oops on boot on Core99 without NVRAM node */
      /* "/nvram@fff04000" node */
      {
          OF_regprop_t regs;
-@@ -1617,6 +1650,7 @@
-         OF_prop_int_new(OF_env, chs, "nvram", OF_pack_handle(OF_env, nvr));
-         OF_node_put(OF_env, nvr);
-     }
-+#endif
-     /* "/pseudo-hid" : hid emulation as Apple does */
-     {
-         OF_node_t *hid;
 @@ -1663,7 +1697,27 @@
          }
          OF_node_put(OF_env, hid);
@@ -1841,3 +1847,40 @@
      case ARCH_MAC99:
          /* We are supposed to have 3 host bridges:
           * - the uninorth AGP bridge at 0xF0000000
+
+
+The 2.6 Linux kernel checks for 1, as I do not have the IEEE spec on
+my desk I can only guess it should return 1 on success, not the
+string length.
+
+  - Rene Rebe <[email protected]>
+
+--- OpenHackWare-release-0.4/src/of.c	2005-04-06 23:17:26.000000000 +0200
++++ OpenHackWare-release-0.4-hacked/src/of.c	2008-05-06 14:50:48.000000000 +0200
+@@ -3841,7 +4061,7 @@
+             OF_DPRINTF("Return property name [%s]\n", next->name);
+             OF_sts(next_name, (void *)(next->name));
+             OF_DUMP_STRING(OF_env, next_name);
+-            pushd(OF_env, strlen(next->name) + 1);
++            pushd(OF_env, 1); /* ReneR: Linux 2.6 flatten_device_tree */
+         }
+     }
+ }
+
+
+In qemu r3309 j_mayer did some "Quickly hack PowerPC BIOS able to boot
+on CDROM again.", as I did not feel like disassemble to find out this
+worked for me for now.
+
+  - Rene Rebe <[email protected]>
+
+--- OpenHackWare-release-0.4/src/bloc.c	2005-04-06 23:21:00.000000000 +0200
++++ OpenHackWare-release-0.4-hacked/src/bloc.c	2008-05-06 14:20:10.000000000 +0200
+@@ -1021,7 +1038,7 @@
+         status = ide_port_read(bd, 0x07);
+         if (status != 0x08) {
+             ERROR("ATAPI TEST_UNIT_READY : status %0x != 0x08\n", status);
+-            return -1;
++            /*return -1;*/ /* fails to boot from cdrom? */
+         }
+         for (i = 0; i < 3; i++) {
Signature · 2 lines
  René Rebe - ExactCODE GmbH - Europe, Germany, Berlin
  http://exactcode.de | http://t2-project.org | http://rene.rebe.name
#1 lore raw

Nice work,

Quoted 42 lines · René Rebe

Hi all,

after quite some debugging thru the early startup code of Linux 2.6 I fixed some issues in the OpenHackWare "BIOS" for PPC emulation.

The diff below is against the Qemu pc-bios/ohw.diff, I can also provide the resulting binary if interested.

First I fixed the linker script to actually work at all (actually I also installed an old toolchain, just to find out that even that one would not link OHW, ...

Second, Linux 2.6 flatten_device_tree stuff in arch/powerpc/kernel/prom_init.c check for a return value of 1, as I do not have the IEEE spec on my desk I assumed it means success, and with the change the flattened device tree is no longer empty, helping a great deal continuing to boot ...

Third, when selecting a core99 machine, Linux assumes to find an NVRAM, and panics in some init_timer if there isn't one. Though a core99 machine does not yet work perfectly, further investigation to be done.

Linewise the FB CLUT is with Linux 2.6 has some issue and the FB thus shows false colors, but good enough to work with for now.

Oh, and last but not least with a self built prom, I hit this "error booting from CD-ROM bug, that Jocelyn hacked around in r3309. As that was just a binary only blob fix and there is no newer version of OHW I just commented out the "return on error" which allowed to boot CD images on my side.

As this is the first nightly track thru the guts of Qemu any comment welcome:

pc-bios/ohw.diff +6 -0
@@ -1,3 +1,19 @@
+Make it link at al.
+
+  - Rene Rebe <[email protected]>
+
+--- OpenHackWare-release-0.4/src/main.ld	2005-03-31 09:23:33.000000000 +0200
++++ OpenHackWare-release-0.4-hacked/src/main.ld	2008-05-06 11:23:29.000000000 +0200

pc-bios/ohw.diff line 16

Quoted 10 lines
pc-bios/ohw.diff +10 -0
+@@ -49,7 +49,7 @@
+         _sdata_end = . ;
+         . = ALIGN(4) ;
+         _ro_start = . ;
+-        .rodata    : { *(.rodata) } > bios
++        .rodata    : { *(.rodata*) } > bios
+         _ro_end = . ;
+         . = ALIGN(4) ;
+         _RTAS_start = .;
+

I think you should also remove .rodata.str1.4 from .data section:

@@ -35,7 +35,7 @@

         .OpenFirmware : { *(.OpenFirmware) } > bios
         . = ALIGN(4) ;
         _data_start = . ;
-        .data     : { *(.data) *(.rodata.str1.4)    } > bios
+        .data     : { *(.data)    } > bios
         _data_end = . ;
         . = ALIGN(4) ;
         _OF_vars_start = . ;
Quoted 62 lines
pc-bios/ohw.diff +29 -12
  diff -wruN --exclude '*~' --exclude '*.o' --exclude '*.bin' --exclude '*.out' --exclude mkdiff OpenHackWare-release-0.4.org/src/bios.h OpenHackWare-release-0.4/src/bios.h
  --- OpenHackWare-release-0.4.org/src/bios.h	2005-04-06 23:20:22.000000000 +0200
  +++ OpenHackWare-release-0.4/src/bios.h	2005-07-07 01:10:20.000000000 +0200
@@ -748,24 +764,14 @@
           {
               /* Hack taken 'as-is' from PearPC */
               unsigned char info[] = {
-@@ -1596,7 +1627,9 @@
-         OF_node_put(OF_env, brom);
+@@ -1596,6 +1627,7 @@
           OF_node_put(OF_env, rom);
       }
-+#if 0
       /* From here, hardcoded hacks to get a Mac-like machine */
-+    /* XXX: Core99 does not seem to like this NVRAM tree */
++    /* XXX: Not yet perfect, but Linux 2.6 does oops on boot on Core99 without NVRAM node */
       /* "/nvram@fff04000" node */
       {
           OF_regprop_t regs;
-@@ -1617,6 +1650,7 @@
-         OF_prop_int_new(OF_env, chs, "nvram", OF_pack_handle(OF_env, nvr));
-         OF_node_put(OF_env, nvr);
-     }
-+#endif
-     /* "/pseudo-hid" : hid emulation as Apple does */
-     {
-         OF_node_t *hid;
  @@ -1663,7 +1697,27 @@
           }
           OF_node_put(OF_env, hid);
@@ -1841,3 +1847,40 @@
       case ARCH_MAC99:
           /* We are supposed to have 3 host bridges:
            * - the uninorth AGP bridge at 0xF0000000
+
+
+The 2.6 Linux kernel checks for 1, as I do not have the IEEE spec on
+my desk I can only guess it should return 1 on success, not the
+string length.
+
+  - Rene Rebe <[email protected]>
+
+--- OpenHackWare-release-0.4/src/of.c	2005-04-06 23:17:26.000000000 +0200
++++ OpenHackWare-release-0.4-hacked/src/of.c	2008-05-06 14:50:48.000000000 +0200
+@@ -3841,7 +4061,7 @@
+             OF_DPRINTF("Return property name [%s]\n", next->name);
+             OF_sts(next_name, (void *)(next->name));
+             OF_DUMP_STRING(OF_env, next_name);
+-            pushd(OF_env, strlen(next->name) + 1);
++            pushd(OF_env, 1); /* ReneR: Linux 2.6 flatten_device_tree */
+         }
+     }
+ }
+
+
+In qemu r3309 j_mayer did some "Quickly hack PowerPC BIOS able to boot
+on CDROM again.", as I did not feel like disassemble to find out this
+worked for me for now.
+
+  - Rene Rebe <[email protected]>
+

pc-bios/ohw.diff line 1886

Quoted 10 lines
pc-bios/ohw.diff +10 -0
+--- OpenHackWare-release-0.4/src/bloc.c	2005-04-06 23:21:00.000000000 +0200
++++ OpenHackWare-release-0.4-hacked/src/bloc.c	2008-05-06 14:20:10.000000000 +0200
+@@ -1021,7 +1038,7 @@
+         status = ide_port_read(bd, 0x07);
+         if (status != 0x08) {
+             ERROR("ATAPI TEST_UNIT_READY : status %0x != 0x08\n", status);
+-            return -1;
++            /*return -1;*/ /* fails to boot from cdrom? */
+         }
+         for (i = 0; i < 3; i++) {

Regards,
Laurent

Signature · 3 lines
------------- [email protected] ---------------
"The best way to predict the future is to invent it."
- Alan Kay