dcavalca / rpms / grub2

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