Blame SOURCES/0052-bz1374141-fix-incorrect-mask-for-ppc64.patch

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