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

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