dcavalca / rpms / grub2

Forked from rpms/grub2 3 years ago
Clone

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

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