xref: /aosp_15_r20/external/bcc/src/lua/bpf/spec/helper.lua (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Workerlocal ffi = require('ffi')
2*387f9dfdSAndroid Build Coastguard Worker
3*387f9dfdSAndroid Build Coastguard Worker-- Define basic ctypes
4*387f9dfdSAndroid Build Coastguard Workerffi.cdef [[
5*387f9dfdSAndroid Build Coastguard Worker	struct bpf_insn {
6*387f9dfdSAndroid Build Coastguard Worker	  uint8_t code;   /* opcode */
7*387f9dfdSAndroid Build Coastguard Worker	  uint8_t dst_reg:4;  /* dest register */
8*387f9dfdSAndroid Build Coastguard Worker	  uint8_t src_reg:4;  /* source register */
9*387f9dfdSAndroid Build Coastguard Worker	  uint16_t off;   /* signed offset */
10*387f9dfdSAndroid Build Coastguard Worker	  uint32_t imm;   /* signed immediate constant */
11*387f9dfdSAndroid Build Coastguard Worker	};
12*387f9dfdSAndroid Build Coastguard Worker]]
13*387f9dfdSAndroid Build Coastguard Worker
14*387f9dfdSAndroid Build Coastguard Worker-- Inject mock ljsyscall for tests
15*387f9dfdSAndroid Build Coastguard Workerpackage.loaded['syscall'] = {
16*387f9dfdSAndroid Build Coastguard Worker	bpf = function() error('mock') end,
17*387f9dfdSAndroid Build Coastguard Worker	c = { BPF_MAP = {}, BPF_PROG = {} },
18*387f9dfdSAndroid Build Coastguard Worker	abi = { arch = 'x64' },
19*387f9dfdSAndroid Build Coastguard Worker}
20*387f9dfdSAndroid Build Coastguard Worker
21*387f9dfdSAndroid Build Coastguard Workerpackage.loaded['syscall.helpers'] = {
22*387f9dfdSAndroid Build Coastguard Worker	strflag = function (tab)
23*387f9dfdSAndroid Build Coastguard Worker		local function flag(cache, str)
24*387f9dfdSAndroid Build Coastguard Worker			if type(str) ~= "string" then return str end
25*387f9dfdSAndroid Build Coastguard Worker			if #str == 0 then return 0 end
26*387f9dfdSAndroid Build Coastguard Worker			local s = str:upper()
27*387f9dfdSAndroid Build Coastguard Worker			if #s == 0 then return 0 end
28*387f9dfdSAndroid Build Coastguard Worker			local val = rawget(tab, s)
29*387f9dfdSAndroid Build Coastguard Worker			if not val then return nil end
30*387f9dfdSAndroid Build Coastguard Worker			cache[str] = val
31*387f9dfdSAndroid Build Coastguard Worker			return val
32*387f9dfdSAndroid Build Coastguard Worker		end
33*387f9dfdSAndroid Build Coastguard Worker		return setmetatable(tab, {__index = setmetatable({}, {__index = flag}), __call = function(t, a) return t[a] end})
34*387f9dfdSAndroid Build Coastguard Worker	end
35*387f9dfdSAndroid Build Coastguard Worker}