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