78e1a10
From eea2b6113c2f17ed5755b23242457948025bfd33 Mon Sep 17 00:00:00 2001
bc092b9
From: Masahiro Matsuya <mmatsuya@redhat.com>
bc092b9
Date: Sat, 29 Oct 2016 08:35:26 +0900
78e1a10
Subject: [PATCH 150/216] bz1374141 fix incorrect mask for ppc64
bc092b9
bc092b9
The netmask configured in firmware is not respected on ppc64 (big endian).
bc092b9
When 255.255.252.0 is set as netmask in firmware, the following is the value of bootpath string in grub_ieee1275_parse_bootpath().
bc092b9
bc092b9
 /vdevice/l-lan@30000002:speed=auto,duplex=auto,192.168.88.10,,192.168.89.113,192.168.88.1,5,5,255.255.252.0,512
bc092b9
bc092b9
The netmask in this bootpath is no problem, since it's a value specified in firmware. But,
bc092b9
The value of 'subnet_mask.ipv4' was set with 0xfffffc00, and __builtin_ctz (~grub_le_to_cpu32 (subnet_mask.ipv4)) returned 16 (not 22).
bc092b9
As a result, 16 was used for netmask wrongly.
bc092b9
bc092b9
1111 1111 1111 1111 1111 1100 0000 0000 # subnet_mask.ipv4 (=0xfffffc00)
bc092b9
0000 0000 1111 1100 1111 1111 1111 1111 # grub_le_to_cpu32 (subnet_mask.ipv4)
bc092b9
1111 1111 0000 0011 0000 0000 0000 0000 # ~grub_le_to_cpu32 (subnet_mask.ipv4)
bc092b9
bc092b9
And, the count of zero with __builtin_ctz can be 16.
bc092b9
This patch changes it as below.
bc092b9
bc092b9
1111 1111 1111 1111 1111 1100 0000 0000 # subnet_mask.ipv4 (=0xfffffc00)
bc092b9
0000 0000 1111 1100 1111 1111 1111 1111 # grub_le_to_cpu32 (subnet_mask.ipv4)
bc092b9
1111 1111 1111 1111 1111 1100 0000 0000 # grub_swap_bytes32(grub_le_to_cpu32 (subnet_mask.ipv4))
bc092b9
0000 0000 0000 0000 0000 0011 1111 1111 # ~grub_swap_bytes32(grub_le_to_cpu32 (subnet_mask.ipv4))
bc092b9
bc092b9
The count of zero with __builtin_clz can be 22. (clz counts the number of one bits preceding the most significant zero bit)
bc092b9
---
bc092b9
 grub-core/net/drivers/ieee1275/ofnet.c | 3 +--
bc092b9
 1 file changed, 1 insertion(+), 2 deletions(-)
bc092b9
bc092b9
diff --git a/grub-core/net/drivers/ieee1275/ofnet.c b/grub-core/net/drivers/ieee1275/ofnet.c
ec4acbb
index 002446be1c3..3df75357a70 100644
bc092b9
--- a/grub-core/net/drivers/ieee1275/ofnet.c
bc092b9
+++ b/grub-core/net/drivers/ieee1275/ofnet.c
bc092b9
@@ -220,8 +220,7 @@ grub_ieee1275_parse_bootpath (const char *devpath, char *bootpath,
bc092b9
                                  flags);
bc092b9
       inter->vlantag = vlantag;
bc092b9
       grub_net_add_ipv4_local (inter,
bc092b9
-                          __builtin_ctz (~grub_le_to_cpu32 (subnet_mask.ipv4)));
bc092b9
-
bc092b9
+                          __builtin_clz (~grub_swap_bytes32(grub_le_to_cpu32 (subnet_mask.ipv4))));
bc092b9
     }
bc092b9
 
bc092b9
   if (gateway_addr.ipv4 != 0)
bc092b9
-- 
ec4acbb
2.15.0
bc092b9