[PATCH bpf-next 2/3] libbpf: Fix relocating big-endian bitfields

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is the same as commit c9e982b87946 ("libbpf: Fix dumping
big-endian bitfields"), but for CO-RE. Make the code structure as
similar as possible to that of btf_dump_get_bitfield_value().

Signed-off-by: Ilya Leoshkevich <iii@xxxxxxxxxxxxx>
---
 tools/lib/bpf/relo_core.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/tools/lib/bpf/relo_core.c b/tools/lib/bpf/relo_core.c
index b5b8956a1be8..fd814b985e1e 100644
--- a/tools/lib/bpf/relo_core.c
+++ b/tools/lib/bpf/relo_core.c
@@ -661,13 +661,18 @@ static int bpf_core_calc_field_relo(const char *prog_name,
 		if (validate)
 			*validate = true; /* signedness is never ambiguous */
 		break;
-	case BPF_FIELD_LSHIFT_U64:
+	case BPF_FIELD_LSHIFT_U64: {
+		__u32 bits_offset = bit_off - byte_off * 8;
+		__u8 nr_copy_bits;
+
 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-		*val = 64 - (bit_off + bit_sz - byte_off  * 8);
+		nr_copy_bits = bit_sz + bits_offset;
 #else
-		*val = (8 - byte_sz) * 8 + (bit_off - byte_off * 8);
+		nr_copy_bits = byte_sz * 8 - bits_offset;
 #endif
+		*val = 64 - nr_copy_bits;
 		break;
+	}
 	case BPF_FIELD_RSHIFT_U64:
 		*val = 64 - bit_sz;
 		if (validate)
-- 
2.31.1




[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux