Commit caaa9ad2af

Matt Knight <mattnite@protonmail.com>
2020-09-07 06:44:16
added btf
1 parent d7268cb
Changed files (3)
lib
std
lib/std/os/linux/bpf/btf.zig
@@ -0,0 +1,151 @@
+const magic = 0xeb9f;
+const version = 1;
+
+pub const ext = @import("ext.zig");
+
+/// All offsets are in bytes relative to the end of this header
+pub const Header = packed struct {
+    magic: u16,
+    version: u8,
+    flags: u8,
+    hdr_len: u32,
+
+    /// offset of type section
+    type_off: u32,
+
+    /// length of type section
+    type_len: u32,
+
+    /// offset of string section
+    str_off: u32,
+
+    /// length of string section
+    str_len: u32,
+};
+
+/// Max number of type identifiers
+pub const max_type = 0xfffff;
+
+/// Max offset into string section
+pub const max_name_offset = 0xffffff;
+
+/// Max number of struct/union/enum member of func args
+pub const max_vlen = 0xffff;
+
+pub const Type = packed struct {
+    name_off: u32,
+    info: struct {
+        /// number of struct's members
+        vlen: u16,
+
+        unused_1: u8,
+        kind: Kind,
+        unused_2: u3,
+
+        /// used by Struct, Union, and Fwd
+        kind_flag: bool,
+    },
+
+    /// size is used by Int, Enum, Struct, Union, and DataSec, it tells the size
+    /// of the type it is describing
+    ///
+    /// type is used by Ptr, Typedef, Volatile, Const, Restrict, Func,
+    /// FuncProto, and Var. It is a type_id referring to another type
+    size_type: union { size: u32, typ: u32 },
+};
+
+/// For some kinds, Type is immediately followed by extra data
+pub const Kind = enum(u4) {
+    Unknown,
+    Int,
+    Ptr,
+    Array,
+    Struct,
+    Union,
+    Enum,
+    Fwd,
+    Typedef,
+    Volatile,
+    Const,
+    Restrict,
+    Func,
+    FuncProto,
+    Var,
+    DataSec,
+};
+
+/// Int kind is followed by this struct
+pub const IntInfo = packed struct {
+    bits: u8,
+    unused: u8,
+    offset: u8,
+    encoding: enum(u4) {
+        Signed = 1 << 0,
+        Char = 1 << 1,
+        Bool = 1 << 2,
+    },
+};
+
+test "IntInfo is 32 bits" {
+    std.testing.expectEqual(@bitSizeOf(IntInfo), 32);
+}
+
+/// Enum kind is followed by this struct
+pub const Enum = packed struct {
+    name_off: u32,
+    val: i32,
+};
+
+/// Array kind is followd by this struct
+pub const Array = packed struct {
+    typ: u32,
+    index_type: u32,
+    nelems: u32,
+};
+
+/// Struct and Union kinds are followed by multiple Member structs. The exact
+/// number is stored in vlen
+pub const Member = packed struct {
+    name_off: u32,
+    typ: u32,
+
+    /// if the kind_flag is set, offset contains both member bitfield size and
+    /// bit offset, the bitfield size is set for bitfield members. If the type
+    /// info kind_flag is not set, the offset contains only bit offset
+    offset: packed struct {
+        bit: u24,
+        bitfield_size: u8,
+    },
+};
+
+/// FuncProto is followed by multiple Params, the exact number is stored in vlen
+pub const Param = packed struct {
+    name_off: u32,
+    typ: u32,
+};
+
+pub const VarLinkage = enum {
+    Static,
+    GlobalAllocated,
+    GlobalExtern,
+};
+
+pub const FuncLinkage = enum {
+    Static,
+    Global,
+    Extern,
+};
+
+/// Var kind is followd by a single Var struct to describe additional
+/// information related to the variable such as its linkage
+pub const Var = packed struct {
+    linkage: u32,
+};
+
+/// Datasec kind is followed by multible VarSecInfo to describe all Var kind
+/// types it contains along with it's in-section offset as well as size.
+pub const VarSecInfo = packed struct {
+    typ: u32,
+    offset: u32,
+    size: u32,
+};
lib/std/os/linux/bpf/btf_ext.zig
@@ -0,0 +1,19 @@
+pub const Header = packed struct {
+    magic: u16,
+    version: u8,
+    flags: u8,
+    hdr_len: u32,
+
+    /// All offsets are in bytes relative to the end of this header
+    func_info_off: u32,
+    func_info_len: u32,
+    line_info_off: u32,
+    line_info_len: u32,
+};
+
+pub const InfoSec = packed struct {
+    sec_name_off: u32,
+    num_info: u32,
+    // TODO: communicate that there is data here
+    //data: [0]u8,
+};
lib/std/os/linux/bpf.zig
@@ -7,6 +7,8 @@ usingnamespace std.os;
 const std = @import("../../std.zig");
 const expectEqual = std.testing.expectEqual;
 
+pub const btf = @import("bpf/btf.zig");
+
 // instruction classes
 pub const LD = 0x00;
 pub const LDX = 0x01;