From: Paulo Flabiano Smorigo <pfsmor...@br.ibm.com>

Disable GRUB Video Support from IBM Power Machines. This patch fixes what
is describe above and should fix 
https://bugzilla.redhat.com/show_bug.cgi?id=973205.
C&P the bz problem's description:

Grub crashes if it tries to run in video mode.

I'm currently testing with grub rpm from f18 in a lpar inside a Power 7R2 
machine using a matrox video card attached.

To reproduce you need to redirect the console to the video output.

This will happens:

IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM                             IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM     STARTING SOFTWARE       IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM        PLEASE WAIT...       IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM                             IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM
IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM IBM

Welcome to GRUB

DEFAULT CATCH!, exception-handler=fff00300
at   %SRR0: 000000000020ac80   %SRR1: 0000000000003002
Open Firmware exception handler entered from non-OF code

Client's Fix Pt Regs:
 00 0000000000780c38 0000000001adfc40 0000000000000000 0000000018000000
 04 0000000000780850 000000000004afff 00000000001d2bb0 0000000000000000
 08 0000000018000000 fffffffffffb5000 000000001804b000 0000000001adfc50
 0c 0000000000000008 0000000000000000 0000000000800050 0000000002000066
 10 0000000002000065 0000000002000070 000000000200006e 0000000002000067
 14 0000000002000063 0000000000000001 00000000001a0000 0000000000000002
 18 0000000000000002 0000000000000000 0000000000780dce 00000000ffff8080
 1c 0000000000000067 00000000001d3de0 00000000001d2b30 0000000000000002
Special Regs:
    %IV: 00000300     %CR: 22002084    %XER: 20000000  %DSISR: 42000000
  %SRR0: 000000000020ac80   %SRR1: 0000000000003002
    %LR: 0000000000006584    %CTR: 000000000004b000
   %DAR: 000000001804afff
Virtual PID = 0
 ok
0 >

In Power, GRUB has video support and works fine with PowerMAC.

Theorically it should works with IBM machines as well but, using a Matrox 
videocard and grub.cfg with the video option enabled, GRUB crashes as we saw 
above.

Using GRUB debug we saw that the crash happens because GRUB tries to access the 
video card address:

video/ieee1275.c:236: IEEE1275: keeping current mode 640x480
video/ieee1275.c:266: IEEE1275: initialising FB @ 0x18000000 640x480x8

GRUB gets the address from the display card node from openfirmware. The 
property is called "address":

0 > dev /pci@80000002000000d/pci@0/display@0  ok
0 > .properties
ibm,loc-code            U78AB.001.WZSHS9P-P1-C7-T1
vendor-id               0000102b
device-id               00002527
revision-id             00000001
class-code              00030000
interrupts              00000001
min-grant               00000010
max-latency             00000020
subsystem-vendor-id     0000102b
subsystem-id            00002300
devsel-speed            00000001
fast-back-to-back
built-in
name                    display
compatible              MTRX,G550
                        pci102b,2527
                        pciclass,030000
                        display
reg                     00990000 00000000 00000000  00000000 00000000
                        02990030 00000000 00000000  00000000 00010000
                        02990010 00000000 00000000  00000000 04000000
                        02990014 00000000 00000000  00000000 00800000
                        02990018 00000000 00000000  00000000 00800000
fcode-rom-offset        00009000
device_type             display
character-set           ISO8859-1
iso6429-1983-colors
power-consumption       00000000 00000000 007270e0 007270e0 00000000 00000000 
007b98a0 007b98a0
ibm,fw-revision-level   00000100
assigned-addresses      82990010 00000000 f8000000  00000000 04000000
                        82990014 00000000 f7000000  00000000 00800000
                        82990018 00000000 f7800000  00000000 00800000
                        82990030 00000000 f6fe0000  00000000 00020000
address                 18000000 17000000
width                   00000280
height                  000001e0
depth                   00000008
linebytes               00000280
bios release            01000000

 ok
0 >

Kleber Sacilotto sent me the address that linux returned from the probe:

99:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. Millennium 
G550 (rev 01) (prog-if 00 [VGA controller])
        Subsystem: Matrox Electronics Systems Ltd. Millennium G550 LP PCIE
        Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- 
Stepping- SERR- FastB2B- DisINTx-
        Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- 
<TAbort- <MAbort- >SERR- <PERR- INTx-
        Interrupt: pin A routed to IRQ 0
        Region 0: Memory at 3da318000000 (32-bit, prefetchable) [size=64M]
        Region 1: Memory at 3da317000000 (32-bit, non-prefetchable) [size=8M]
        Region 2: Memory at 3da317800000 (32-bit, non-prefetchable) [size=8M]
        Expansion ROM at 3da316fe0000 [disabled] [size=128K]
        Capabilities: [dc] Power Management version 2
                Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA 
PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [f0] AGP version 2.0
                Status: RQ=32 Iso- ArqSz=0 Cal=0 SBA+ ITACoh- GART64- HTrans- 
64bit- FW- AGP3- Rate=x1,x2
                Command: RQ=1 ArqSz=0 Cal=0 SBA- AGP- GART64- 64bit- FW- 
Rate=<none>
        Kernel driver in use: matroxfb

The address is 64bit and display property in openfirmware was cut because it's 
"encode-int" (32bit):

From linux:
Region 0: Memory at 3da318000000 (32-bit, prefetchable) [size=64M]
Region 1: Memory at 3da317000000 (32-bit, non-prefetchable) [size=8M]

From openfirmware:
address                 18000000 17000000

David Randall confirmed that the linux address is right after getting the full 
address using other properties from the videocard node.

We talked with Colleen about the address property from the Matrox card and she 
said that the node is generated from a FCode that is inside the card, owned by 
Matrox.

Openfirmware works in 32bit mode so GRUB for Power is hotwired in 32bit, even 
for 64bit machines.

David taught us how to get the full address but, as GRUB is build in 32bit and 
the value is 64 we need to implement an asm helper in order to access it.

Marcelo Cerri, from ltc security team, helped me writing an asm help to access 
the address but we still didn't managed to make it work.

We will continue to work in the asm to see if we can access the address.

Besides that, I'm going to implement an address validation in GRUB before it 
tries to access the address. If the address is invalid it will return an 
exception and will continue to run in text mode.

Signed-off-by: Paulo Flabiano Smorigo <pfsmor...@br.ibm.com>
Signed-off-by: Robbie Harwood <rharw...@redhat.com>
---
 grub-core/kern/ieee1275/cmain.c  | 5 ++++-
 grub-core/video/ieee1275.c       | 9 ++++++---
 include/grub/ieee1275/ieee1275.h | 2 ++
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/grub-core/kern/ieee1275/cmain.c b/grub-core/kern/ieee1275/cmain.c
index e74de3248..810a089a9 100644
--- a/grub-core/kern/ieee1275/cmain.c
+++ b/grub-core/kern/ieee1275/cmain.c
@@ -89,7 +89,10 @@ grub_ieee1275_find_options (void)
   }
 
   if (rc >= 0 && grub_strncmp (tmp, "IBM", 3) == 0)
-    grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS);
+    {
+      grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS);
+      grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_DISABLE_VIDEO_SUPPORT);
+    }
 
   /* Old Macs have no key repeat, newer ones have fully working one.
      The ones inbetween when repeated key generates an escaoe sequence
diff --git a/grub-core/video/ieee1275.c b/grub-core/video/ieee1275.c
index ca3d3c3b2..5592e4bb7 100644
--- a/grub-core/video/ieee1275.c
+++ b/grub-core/video/ieee1275.c
@@ -351,9 +351,12 @@ static struct grub_video_adapter 
grub_video_ieee1275_adapter =
 
 GRUB_MOD_INIT(ieee1275_fb)
 {
-  find_display ();
-  if (display)
-    grub_video_register (&grub_video_ieee1275_adapter);
+  if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_DISABLE_VIDEO_SUPPORT))
+    {
+      find_display ();
+      if (display)
+        grub_video_register (&grub_video_ieee1275_adapter);
+    }
 }
 
 GRUB_MOD_FINI(ieee1275_fb)
diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h
index 4f6e6aaa0..db0ec5f4c 100644
--- a/include/grub/ieee1275/ieee1275.h
+++ b/include/grub/ieee1275/ieee1275.h
@@ -145,6 +145,8 @@ enum grub_ieee1275_flag
   GRUB_IEEE1275_FLAG_POWER_VM,
 
   GRUB_IEEE1275_FLAG_POWER_KVM,
+
+  GRUB_IEEE1275_FLAG_DISABLE_VIDEO_SUPPORT
 };
 
 extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag);
-- 
2.46.2


_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to