lib/seccomp-tools/asm/sasm.tab.rb
#
# DO NOT MODIFY!!!!
# This file is automatically generated by Racc 1.4.16
# from Racc grammar file "".
#
require 'racc/parser.rb'
require 'seccomp-tools/asm/scalar'
require 'seccomp-tools/asm/scanner'
require 'seccomp-tools/asm/statement'
module SeccompTools
module Asm
class SeccompAsmParser < Racc::Parser
module_eval(<<'...end sasm.y/module_eval...', 'sasm.y', 136)
def initialize(scanner)
@scanner = scanner
super()
end
# @return [Array<Statement>]
def parse
@tokens = @scanner.scan.dup
return [] if @tokens.empty?
@cur_idx = 0
do_parse
end
def next_token
token = @tokens[@cur_idx]
return [false, '$'] if token.nil?
@cur_idx += 1
[token.sym, token.str]
end
def on_error(t, val, vstack)
raise_error("unexpected string #{last_token.str.inspect}")
end
# @param [String] msg
# @param [Integer] offset
# @private
def raise_error(msg, offset = 0)
raise SeccompTools::ParseError, @scanner.format_error(last_token(offset), msg)
end
# @param [Integer] off
# 0 for the last parsed token, -n for the n-th previous parsed token, n for the future n-th token.
def last_token(off = 0)
@tokens[@cur_idx - 1 + off]
end
...end sasm.y/module_eval...
##### State transition tables begin ###
racc_action_table = [
49, 49, 32, 121, 17, 29, 32, 49, 17, 58,
25, 35, 106, 35, 35, 40, 45, 42, 50, 49,
55, 58, 58, 58, 49, 58, 51, 52, 53, 33,
103, 103, 40, 33, 19, 50, 29, 20, 56, 25,
58, -55, 35, 51, 52, 53, 6, 12, 40, 40,
16, 42, 94, 17, 58, 18, 55, 19, 55, 106,
33, 108, 70, 71, 42, 20, 110, 40, 106, 108,
58, 19, 50, 73, 74, 75, 77, 78, 79, 20,
51, 52, 53, 108, 106, 21, 40, 6, 12, nil,
nil, 16, nil, nil, 17, nil, 18, nil, 19, nil,
6, 12, nil, nil, 16, nil, 20, 17, 50, 18,
nil, 19, nil, nil, nil, 20, 51, 52, 53, 20,
50, nil, 40, 50, nil, nil, nil, nil, 51, 52,
53, 51, 52, 53, 40, 50, nil, 40, nil, nil,
nil, nil, 20, 51, 52, 53, 50, 58, nil, 40,
nil, nil, nil, 50, 51, 52, 53, nil, nil, nil,
40, 51, 52, 53, 50, nil, nil, 40, nil, nil,
nil, nil, 51, 52, 53, 50, nil, nil, 40, nil,
nil, nil, 20, 51, 52, 53, nil, 58, nil, 40 ]
racc_action_check = [
88, 116, 12, 113, 87, 12, 72, 18, 126, 114,
2, 13, 114, 14, 15, 16, 18, 17, 18, 37,
19, 87, 113, 88, 36, 126, 18, 18, 18, 12,
88, 116, 18, 72, 36, 36, 115, 37, 21, 22,
24, 30, 31, 36, 36, 36, 26, 26, 45, 36,
26, 62, 71, 26, 115, 26, 75, 26, 76, 90,
115, 91, 34, 34, 93, 26, 95, 102, 104, 111,
26, 34, 34, 34, 34, 34, 34, 34, 34, 34,
34, 34, 34, 112, 125, 1, 34, 1, 1, nil,
nil, 1, nil, nil, 1, nil, 1, nil, 1, nil,
0, 0, nil, nil, 0, nil, 1, 0, 28, 0,
nil, 0, nil, nil, nil, 28, 28, 28, 28, 0,
48, nil, 28, 54, nil, nil, nil, nil, 48, 48,
48, 54, 54, 54, 48, 61, nil, 54, nil, nil,
nil, nil, 61, 61, 61, 61, 89, 61, nil, 61,
nil, nil, nil, 97, 89, 89, 89, nil, nil, nil,
89, 97, 97, 97, 98, nil, nil, 97, nil, nil,
nil, nil, 98, 98, 98, 127, nil, nil, 98, nil,
nil, nil, 127, 127, 127, 127, nil, 127, nil, 127 ]
racc_action_pointer = [
98, 85, -15, nil, nil, nil, nil, nil, nil, nil,
nil, nil, -3, -16, -14, -13, -13, 7, 4, -10,
nil, 38, 14, nil, 14, nil, 44, nil, 94, nil,
14, 15, nil, nil, 58, nil, 21, 16, nil, nil,
nil, nil, nil, nil, nil, 20, nil, nil, 106, nil,
nil, nil, nil, nil, 109, nil, nil, nil, nil, nil,
nil, 121, 41, nil, nil, nil, nil, nil, nil, nil,
nil, 49, 1, nil, nil, 26, 28, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, -5, -3, 132,
30, 30, nil, 54, nil, 52, nil, 139, 150, nil,
nil, nil, 39, nil, 39, nil, nil, nil, nil, nil,
nil, 38, 52, -4, -17, 28, -2, nil, nil, nil,
nil, nil, nil, nil, nil, 55, -1, 161, nil, nil,
nil ]
racc_action_default = [
-77, -77, -69, -69, -4, -5, -7, -8, -9, -10,
-11, -12, -60, -77, -77, -77, -77, -77, -77, -77,
-61, -77, -69, -1, -66, -67, -77, -69, -77, -32,
-33, -77, -54, -75, -77, -70, -77, -77, -69, -69,
-71, -34, -35, -36, -37, -38, -40, -56, -77, -60,
-62, -63, -64, -65, -77, -73, 131, -2, -68, -3,
-6, -77, -77, -42, -43, -53, -14, -20, -21, -22,
-23, -77, -44, -46, -47, -77, -77, -50, -51, -52,
-15, -17, -18, -19, -16, -58, -59, -77, -77, -77,
-77, -77, -13, -77, -24, -77, -55, -77, -77, -69,
-69, -69, -77, -76, -77, -57, -72, -41, -74, -26,
-45, -77, -77, -28, -77, -77, -77, -39, -48, -49,
-25, -69, -29, -69, -33, -77, -77, -77, -31, -27,
-30 ]
racc_goto_table = [
26, 28, 30, 44, 62, 39, 41, 31, 46, 54,
67, 99, 100, 23, 1, 14, 14, 69, 105, 82,
59, 83, 85, 60, 61, 107, 81, 2, 22, 34,
36, 37, 117, 57, 89, 87, 88, 92, 90, 27,
125, 14, 122, 66, 91, 118, 119, 65, 80, 84,
129, 93, 86, 128, 68, 38, 120, 43, 72, 76,
nil, nil, 96, nil, nil, 97, 98, 95, nil, nil,
nil, nil, nil, 101, nil, nil, nil, nil, nil, 104,
nil, nil, 109, nil, nil, nil, nil, 111, 112, nil,
nil, 116, nil, nil, nil, nil, 113, 114, 115, nil,
nil, 101, nil, 130, 123, 124, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, 126, nil,
127 ]
racc_goto_check = [
5, 26, 32, 15, 14, 28, 27, 37, 22, 34,
14, 11, 29, 3, 1, 18, 18, 20, 30, 20,
6, 15, 15, 7, 5, 35, 22, 2, 2, 16,
16, 16, 30, 3, 28, 5, 5, 14, 22, 13,
29, 18, 30, 17, 22, 35, 35, 16, 19, 21,
11, 27, 18, 30, 23, 24, 25, 33, 36, 38,
nil, nil, 32, nil, nil, 34, 34, 37, nil, nil,
nil, nil, nil, 15, nil, nil, nil, nil, nil, 22,
nil, nil, 27, nil, nil, nil, nil, 22, 22, nil,
nil, 28, nil, nil, nil, nil, 5, 5, 5, nil,
nil, 15, nil, 14, 26, 32, nil, nil, nil, nil,
nil, nil, nil, nil, nil, nil, nil, nil, 5, nil,
5 ]
racc_goto_pointer = [
nil, 14, 27, 11, nil, -3, -6, -3, nil, nil,
nil, -76, nil, 27, -24, -15, 16, 9, 15, 12,
-17, 12, -10, 20, 39, -57, -11, -11, -11, -76,
-72, nil, -10, 39, -10, -66, 24, -5, 25, nil ]
racc_goto_default = [
nil, nil, nil, nil, 3, 24, 4, 5, 7, 8,
9, 10, 11, nil, nil, 13, nil, nil, 63, nil,
15, nil, 64, nil, nil, nil, nil, nil, 48, nil,
nil, 102, nil, nil, nil, nil, nil, nil, nil, 47 ]
racc_reduce_table = [
0, 0, :racc_error,
2, 35, :_reduce_1,
3, 35, :_reduce_2,
3, 36, :_reduce_3,
1, 36, :_reduce_4,
1, 38, :_reduce_5,
3, 38, :_reduce_6,
1, 41, :_reduce_7,
1, 40, :_reduce_8,
1, 40, :_reduce_9,
1, 40, :_reduce_10,
1, 40, :_reduce_11,
1, 40, :_reduce_12,
4, 42, :_reduce_13,
3, 43, :_reduce_14,
3, 43, :_reduce_15,
3, 43, :_reduce_16,
1, 53, :_reduce_none,
1, 53, :_reduce_none,
1, 53, :_reduce_none,
1, 51, :_reduce_none,
1, 51, :_reduce_21,
1, 51, :_reduce_none,
1, 51, :_reduce_23,
2, 51, :_reduce_24,
6, 44, :_reduce_25,
5, 44, :_reduce_26,
3, 59, :_reduce_27,
0, 59, :_reduce_28,
5, 58, :_reduce_29,
5, 63, :_reduce_30,
4, 63, :_reduce_31,
1, 60, :_reduce_none,
1, 60, :_reduce_none,
2, 45, :_reduce_34,
1, 61, :_reduce_35,
2, 46, :_reduce_36,
1, 67, :_reduce_none,
1, 67, :_reduce_38,
4, 67, :_reduce_39,
1, 67, :_reduce_none,
4, 54, :_reduce_41,
1, 48, :_reduce_none,
1, 48, :_reduce_none,
1, 57, :_reduce_none,
3, 57, :_reduce_45,
1, 57, :_reduce_46,
1, 57, :_reduce_47,
4, 57, :_reduce_48,
4, 70, :_reduce_49,
1, 70, :_reduce_50,
1, 72, :_reduce_none,
1, 72, :_reduce_none,
2, 47, :_reduce_53,
1, 71, :_reduce_none,
1, 71, :_reduce_none,
1, 56, :_reduce_56,
3, 56, :_reduce_57,
1, 55, :_reduce_none,
1, 55, :_reduce_none,
1, 49, :_reduce_60,
1, 52, :_reduce_61,
1, 73, :_reduce_62,
1, 73, :_reduce_63,
1, 73, :_reduce_64,
1, 73, :_reduce_65,
1, 37, :_reduce_none,
1, 37, :_reduce_none,
2, 39, :_reduce_none,
0, 39, :_reduce_none,
1, 50, :_reduce_none,
1, 62, :_reduce_none,
1, 64, :_reduce_none,
1, 68, :_reduce_none,
1, 69, :_reduce_none,
1, 66, :_reduce_none,
1, 65, :_reduce_none ]
racc_reduce_n = 77
racc_shift_n = 131
racc_token_table = {
false => 0,
:error => 1,
:SYMBOL => 2,
:A => 3,
:LEN => 4,
:ALU_OP => 5,
:IF => 6,
:ELSE => 7,
:COMPARE => 8,
:GOTO => 9,
:GOTO_SYMBOL => 10,
:RETURN => 11,
:ACTION => 12,
:MEM => 13,
:INT => 14,
:SYS_NUMBER => 15,
:ARCH => 16,
:DATA => 17,
:INSTRUCTION_POINTER => 18,
:ARGS => 19,
:ARGS_H => 20,
:X => 21,
:HEX_INT => 22,
:ARCH_VAL => 23,
:SYSCALL => 24,
:false => 25,
:NEWLINE => 26,
"=" => 27,
"(" => 28,
")" => 29,
"[" => 30,
"]" => 31,
"&" => 32,
"!" => 33 }
racc_nt_base = 34
racc_use_result_var = false
Racc_arg = [
racc_action_table,
racc_action_check,
racc_action_default,
racc_action_pointer,
racc_goto_table,
racc_goto_check,
racc_goto_default,
racc_goto_pointer,
racc_nt_base,
racc_reduce_table,
racc_token_table,
racc_shift_n,
racc_reduce_n,
racc_use_result_var ]
Racc_token_to_s_table = [
"$end",
"error",
"SYMBOL",
"A",
"LEN",
"ALU_OP",
"IF",
"ELSE",
"COMPARE",
"GOTO",
"GOTO_SYMBOL",
"RETURN",
"ACTION",
"MEM",
"INT",
"SYS_NUMBER",
"ARCH",
"DATA",
"INSTRUCTION_POINTER",
"ARGS",
"ARGS_H",
"X",
"HEX_INT",
"ARCH_VAL",
"SYSCALL",
"false",
"NEWLINE",
"\"=\"",
"\"(\"",
"\")\"",
"\"[\"",
"\"]\"",
"\"&\"",
"\"!\"",
"$start",
"prog",
"normalized_statement",
"terminator",
"symbols",
"newlines",
"statement",
"symbol",
"arithmetic",
"assignment",
"conditional",
"goto_expr",
"return_stat",
"alu_op_eq",
"x_constexpr",
"a",
"ASSIGN",
"a_rval",
"x",
"x_rval",
"memory",
"ax",
"constexpr",
"argument",
"comparison",
"else_block",
"compare",
"goto_symbol",
"LPAREN",
"comparison_",
"RPAREN",
"BANG",
"AND",
"ret_val",
"LBRACK",
"RBRACK",
"argument_long",
"alu_op",
"args",
"number" ]
Racc_debug_parser = false
##### State transition tables end #####
# reduce 0 omitted
module_eval(<<'.,.,', 'sasm.y', 3)
def _reduce_1(val, _values)
[val[0]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 4)
def _reduce_2(val, _values)
val[0] << val[1]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 5)
def _reduce_3(val, _values)
Statement.new(*val[2], val[0])
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 6)
def _reduce_4(val, _values)
Statement.new(*val[0], [])
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 7)
def _reduce_5(val, _values)
val
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 8)
def _reduce_6(val, _values)
val[0] << val[2]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 10)
def _reduce_7(val, _values)
t = val[0]
raise_error("'next' is a reserved label") if t == 'next'
last_token
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 14)
def _reduce_8(val, _values)
[:alu, val[0]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 15)
def _reduce_9(val, _values)
[:assign, val[0]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 16)
def _reduce_10(val, _values)
[:if, val[0]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 17)
def _reduce_11(val, _values)
[:if, [nil, val[0], val[0]]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 18)
def _reduce_12(val, _values)
[:ret, val[0]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 19)
def _reduce_13(val, _values)
[val[1], val[3]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 20)
def _reduce_14(val, _values)
[val[0], val[2]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 21)
def _reduce_15(val, _values)
[val[0], val[2]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 22)
def _reduce_16(val, _values)
[val[0], val[2]]
end
.,.,
# reduce 17 omitted
# reduce 18 omitted
# reduce 19 omitted
# reduce 20 omitted
module_eval(<<'.,.,', 'sasm.y', 29)
def _reduce_21(val, _values)
Scalar::Data.new(val[0])
end
.,.,
# reduce 22 omitted
module_eval(<<'.,.,', 'sasm.y', 31)
def _reduce_23(val, _values)
Scalar::Len.instance
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 34)
def _reduce_24(val, _values)
raise_error('do you mean A = -A?', -1) if val[0] != '-'
:neg
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 38)
def _reduce_25(val, _values)
op, rval, parity = val[1]
jt, jf = val[3], val[5]
jt, jf = jf, jt if parity.odd?
[[op, rval], jt, jf]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 43)
def _reduce_26(val, _values)
[[val[1], val[2]], val[3], val[4]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 44)
def _reduce_27(val, _values)
val[2]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 45)
def _reduce_28(val, _values)
:next
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 46)
def _reduce_29(val, _values)
val[2]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 47)
def _reduce_30(val, _values)
[val[2], val[4], 0]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 48)
def _reduce_31(val, _values)
val[2][2] += 1; val[2]
end
.,.,
# reduce 32 omitted
# reduce 33 omitted
module_eval(<<'.,.,', 'sasm.y', 51)
def _reduce_34(val, _values)
val[1]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 52)
def _reduce_35(val, _values)
last_token
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 53)
def _reduce_36(val, _values)
val[1]
end
.,.,
# reduce 37 omitted
module_eval(<<'.,.,', 'sasm.y', 55)
def _reduce_38(val, _values)
Scalar::ConstVal.new(Const::BPF::ACTION[val[0].to_sym])
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 57)
def _reduce_39(val, _values)
Scalar::ConstVal.new(Const::BPF::ACTION[val[0].to_sym] |
(val[2].to_i & Const::BPF::SECCOMP_RET_DATA))
end
.,.,
# reduce 40 omitted
module_eval(<<'.,.,', 'sasm.y', 62)
def _reduce_41(val, _values)
idx = val[2].to_i
raise_error(format("index of mem[] must between 0 and 15, got %d", idx), -1) unless idx.between?(0, 15)
Scalar::Mem.new(idx)
end
.,.,
# reduce 42 omitted
# reduce 43 omitted
# reduce 44 omitted
module_eval(<<'.,.,', 'sasm.y', 70)
def _reduce_45(val, _values)
if val[1] != '>>' || val[2].to_i != 32
off = val[1] == '>>' ? 0 : -1
raise_error("operator after an argument can only be '>> 32'", off)
end
val[0] + 4
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 76)
def _reduce_46(val, _values)
0
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 77)
def _reduce_47(val, _values)
4
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 79)
def _reduce_48(val, _values)
idx = val[2].to_i
if idx % 4 != 0 || idx >= 64
raise_error(format('index of data[] must be a multiple of 4 and less than 64, got %d', idx), -1)
end
idx
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 87)
def _reduce_49(val, _values)
idx = val[2].to_i
s = val[0]
raise_error(format('index of %s[] must between 0 and 5, got %d', s, idx), -1) unless idx.between?(0, 5)
16 + idx * 8 + (s.downcase.end_with?('h') ? 4 : 0)
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 92)
def _reduce_50(val, _values)
8
end
.,.,
# reduce 51 omitted
# reduce 52 omitted
module_eval(<<'.,.,', 'sasm.y', 95)
def _reduce_53(val, _values)
val[0] + val[1]
end
.,.,
# reduce 54 omitted
# reduce 55 omitted
module_eval(<<'.,.,', 'sasm.y', 98)
def _reduce_56(val, _values)
Scalar::ConstVal.new(val[0] & 0xffffffff)
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 99)
def _reduce_57(val, _values)
val[1]
end
.,.,
# reduce 58 omitted
# reduce 59 omitted
module_eval(<<'.,.,', 'sasm.y', 102)
def _reduce_60(val, _values)
Scalar::A.instance
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 103)
def _reduce_61(val, _values)
Scalar::X.instance
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 104)
def _reduce_62(val, _values)
val[0].to_i
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 105)
def _reduce_63(val, _values)
val[0].to_i(16)
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 106)
def _reduce_64(val, _values)
Const::Audit::ARCH[val[0]]
end
.,.,
module_eval(<<'.,.,', 'sasm.y', 108)
def _reduce_65(val, _values)
s = val[0]
return @scanner.syscalls[s.to_sym] unless s.include?('.')
arch, sys = s.split('.')
Const::Syscall.const_get(arch.upcase)[sys.to_sym].tap do |v|
raise_error("syscall '#{sys}' doesn't exist on #{arch}") if v.nil?
end
end
.,.,
# reduce 66 omitted
# reduce 67 omitted
# reduce 68 omitted
# reduce 69 omitted
# reduce 70 omitted
# reduce 71 omitted
# reduce 72 omitted
# reduce 73 omitted
# reduce 74 omitted
# reduce 75 omitted
# reduce 76 omitted
def _reduce_none(val, _values)
val[0]
end
end # class SeccompAsmParser
end # module Asm
end # module SeccompTools