diff --git a/collection.go b/collection.go index ac7108e62..a5532220f 100644 --- a/collection.go +++ b/collection.go @@ -626,17 +626,20 @@ func resolveKconfig(m *MapSpec) error { internal.NativeEndian.PutUint32(data[vsi.Offset:], kv.Kernel()) case "LINUX_HAS_SYSCALL_WRAPPER": - if integer, ok := v.Type.(*btf.Int); !ok || integer.Size != 4 { - return fmt.Errorf("variable %s must be a 32 bits integer, got %s", n, v.Type) + integer, ok := v.Type.(*btf.Int) + if !ok { + return fmt.Errorf("variable %s must be an integer, got %s", n, v.Type) } - var value uint32 = 1 + var value uint64 = 1 if err := haveSyscallWrapper(); errors.Is(err, ErrNotSupported) { value = 0 } else if err != nil { return fmt.Errorf("unable to derive a value for LINUX_HAS_SYSCALL_WRAPPER: %w", err) } - internal.NativeEndian.PutUint32(data[vsi.Offset:], value) + if err := kconfig.PutInteger(data[vsi.Offset:], integer, value); err != nil { + return fmt.Errorf("set LINUX_HAS_SYSCALL_WRAPPER: %w", err) + } default: // Catch CONFIG_*. configs[n] = configInfo{ diff --git a/internal/kconfig/kconfig.go b/internal/kconfig/kconfig.go index d95e7eb0e..fa5308578 100644 --- a/internal/kconfig/kconfig.go +++ b/internal/kconfig/kconfig.go @@ -250,7 +250,20 @@ func putValueNumber(data []byte, typ btf.Type, value string) error { return fmt.Errorf("cannot parse value: %w", err) } - switch size { + return PutInteger(data, integer, n) +} + +// PutInteger writes n into data. +// +// integer determines how much is written into data and what the valid values +// are. +func PutInteger(data []byte, integer *btf.Int, n uint64) error { + // This function should match set_kcfg_value_num in libbpf. + if integer.Encoding == btf.Bool && n > 1 { + return fmt.Errorf("invalid boolean value: %d", n) + } + + switch integer.Size { case 1: data[0] = byte(n) case 2: @@ -260,7 +273,7 @@ func putValueNumber(data []byte, typ btf.Type, value string) error { case 8: internal.NativeEndian.PutUint64(data, uint64(n)) default: - return fmt.Errorf("size (%d) is not valid, expected: 1, 2, 4 or 8", size) + return fmt.Errorf("size (%d) is not valid, expected: 1, 2, 4 or 8", integer.Size) } return nil diff --git a/testdata/kconfig-eb.elf b/testdata/kconfig-eb.elf index 776c8485f..c1f1494f2 100644 Binary files a/testdata/kconfig-eb.elf and b/testdata/kconfig-eb.elf differ diff --git a/testdata/kconfig-el.elf b/testdata/kconfig-el.elf index 8cd4ebd29..f8eb61922 100644 Binary files a/testdata/kconfig-el.elf and b/testdata/kconfig-el.elf differ diff --git a/testdata/kconfig.c b/testdata/kconfig.c index e436f67f4..6d655cf02 100644 --- a/testdata/kconfig.c +++ b/testdata/kconfig.c @@ -3,7 +3,7 @@ char __license[] __section("license") = "MIT"; extern int LINUX_KERNEL_VERSION __kconfig; -extern int LINUX_HAS_SYSCALL_WRAPPER __kconfig; +extern _Bool LINUX_HAS_SYSCALL_WRAPPER __kconfig; __section("socket") int kernel_version() { return LINUX_KERNEL_VERSION;