github.com/dylandreimerink/gobpfld@v0.6.1-0.20220205171531-e79c330ad608/emulator/inst_arsh.go (about) 1 package emulator 2 3 import ( 4 "fmt" 5 6 "github.com/dylandreimerink/gobpfld/ebpf" 7 ) 8 9 var _ Instruction = (*ARSH32)(nil) 10 11 type ARSH32 struct { 12 ebpf.ARSH32 13 } 14 15 func (i *ARSH32) Clone() Instruction { 16 c := *i 17 return &c 18 } 19 20 func (i *ARSH32) Execute(vm *VM) error { 21 rv, r, err := readReg(vm, i.Dest) 22 if err != nil { 23 return err 24 } 25 26 err = r.Assign(int64(int32(rv) >> i.Value)) 27 if err != nil { 28 return fmt.Errorf("assign value %s: %w", i.Dest.String(), err) 29 } 30 31 return nil 32 } 33 34 var _ Instruction = (*ARSH64)(nil) 35 36 type ARSH64 struct { 37 ebpf.ARSH64 38 } 39 40 func (i *ARSH64) Clone() Instruction { 41 c := *i 42 return &c 43 } 44 45 func (i *ARSH64) Execute(vm *VM) error { 46 rv, r, err := readReg(vm, i.Dest) 47 if err != nil { 48 return err 49 } 50 51 err = r.Assign(rv >> int64(i.Value)) 52 if err != nil { 53 return fmt.Errorf("assign value %s: %w", i.Dest.String(), err) 54 } 55 56 return nil 57 } 58 59 var _ Instruction = (*ARSH32Register)(nil) 60 61 type ARSH32Register struct { 62 ebpf.ARSH32Register 63 } 64 65 func (i *ARSH32Register) Clone() Instruction { 66 c := *i 67 return &c 68 } 69 70 func (i *ARSH32Register) Execute(vm *VM) error { 71 dv, dr, err := readReg(vm, i.Dest) 72 if err != nil { 73 return err 74 } 75 76 sv, _, err := readReg(vm, i.Src) 77 if err != nil { 78 return err 79 } 80 81 err = dr.Assign(int64(int32(dv) >> int32(sv))) 82 if err != nil { 83 return fmt.Errorf("assign value %s: %w", i.Dest.String(), err) 84 } 85 86 return nil 87 } 88 89 var _ Instruction = (*ARSH64Register)(nil) 90 91 type ARSH64Register struct { 92 ebpf.ARSH64Register 93 } 94 95 func (i *ARSH64Register) Clone() Instruction { 96 c := *i 97 return &c 98 } 99 100 func (i *ARSH64Register) Execute(vm *VM) error { 101 dv, dr, err := readReg(vm, i.Dest) 102 if err != nil { 103 return err 104 } 105 106 sv, _, err := readReg(vm, i.Src) 107 if err != nil { 108 return err 109 } 110 111 err = dr.Assign(dv >> sv) 112 if err != nil { 113 return fmt.Errorf("assign value %s: %w", i.Dest.String(), err) 114 } 115 116 return nil 117 }