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