Example #1
0
 def code(self):
   res = ''
   next_ip = self._ip + 5
   res += '\xe8' + numtol(self._label_ip - next_ip)         # call near <label>
   res += '\x48\x81\xc4' + numtol(Word_size * self._nargs)  # add rsp, Word_size*<nargs> ; pop pushed parameters
   for i in range(self._nretvals):
     # take the return values and push them in the stack
     offset = -Word_size * (i + 1)
     res += '\xff\xb7' + numtol(offset) # push qword [rdi - Word_size * i]
   assert len(res) == self.len()
   return res
Example #2
0
 def code_local(self):
   offset = -self._var_num * Word_size
   boom_code = lang.jit.x86_64_builtins.boom_code_for(i18n.i18n('Uninitialized variable'))
   res = ''.join([
     '\x48\x8b\x85' + numtol(offset, nbytes=4),  # mov rax, [rbp + <offset>]
     '\x48\xba\xff\xff\xff\xff\xff\xff\xff\x7f', # mov rdx, <Undefined_value>
     '\x48\x39\xd0',                             # cmp rax, rdx
     '\x0f\x85' + numtol(len(boom_code), 4),     # jne .end
     boom_code,
     '\xff\xb5' + numtol(offset, nbytes=4),      # push qword [rbp + <offset>]
   ])
   return res
Example #3
0
 def code(self):
   offset = self._var_num * Word_size
   if self._local_param == 'local':
     sig = -1
   else:
     sig = 1
   # pop qword [rbp +/- <offset>]
   res = '\x8f'
   if offset < 0x80:
     res += '\x45' + numtol(sig * offset, nbytes=1)
   else:
     res += '\x85' + numtol(sig * offset, nbytes=4)
   return res
Example #4
0
 def code(self):
     offset = self._var_num * Word_size
     if self._local_param == 'local':
         sig = -1
     else:
         sig = 1
     # pop qword [rbp +/- <offset>]
     res = '\x8f'
     if offset < 0x80:
         res += '\x45' + numtol(sig * offset, nbytes=1)
     else:
         res += '\x85' + numtol(sig * offset, nbytes=4)
     return res
Example #5
0
 def code(self):
     res = ''
     next_ip = self._ip + 5
     res += '\xe8' + numtol(self._label_ip - next_ip)  # call near <label>
     res += '\x48\x81\xc4' + numtol(
         Word_size *
         self._nargs)  # add rsp, Word_size*<nargs> ; pop pushed parameters
     for i in range(self._nretvals):
         # take the return values and push them in the stack
         offset = -Word_size * (i + 1)
         res += '\xff\xb7' + numtol(
             offset)  # push qword [rdi - Word_size * i]
     assert len(res) == self.len()
     return res
Example #6
0
 def code_local(self):
     offset = -self._var_num * Word_size
     boom_code = lang.jit.x86_64_builtins.boom_code_for(
         i18n.i18n('Uninitialized variable'))
     res = ''.join([
         '\x48\x8b\x85' +
         numtol(offset, nbytes=4),  # mov rax, [rbp + <offset>]
         '\x48\xba\xff\xff\xff\xff\xff\xff\xff\x7f',  # mov rdx, <Undefined_value>
         '\x48\x39\xd0',  # cmp rax, rdx
         '\x0f\x85' + numtol(len(boom_code), 4),  # jne .end
         boom_code,
         '\xff\xb5' +
         numtol(offset, nbytes=4),  # push qword [rbp + <offset>]
     ])
     return res
Example #7
0
 def code(self):
   res = ''
   if self._num_locals != 0:
     res += '\x48\x81\xc4' + numtol(Word_size * self._num_locals) # add rsp, Word_size * <num_locals> ; pop locals
   res += '\x5d' # pop rbp
   res += '\xc3' # ret
   return res
Example #8
0
 def code(self):
   next_ip = self._ip + self.len()
   res = ''
   res += '\x58'         # pop rax
   res += '\x48\x85\xc0' # test rax, rax
   res += '\x0f\x84' + numtol(self._label_ip - next_ip) # jz near <label>
   assert len(res) == self.len()
   return res
Example #9
0
 def code(self):
     next_ip = self._ip + self.len()
     res = ''
     res += '\x58'  # pop rax
     res += '\x48\x85\xc0'  # test rax, rax
     res += '\x0f\x84' + numtol(self._label_ip - next_ip)  # jz near <label>
     assert len(res) == self.len()
     return res
Example #10
0
 def code(self):
   # to return, leave the values in the stack, but return the
   # stack top as if popping them and save in "rdi" the place
   # where they start
   res = ''
   res += '\x48\x81\xc4' + numtol(Word_size * self._nretvals) # add rsp, Word_size * num_retvals
   res += '\x48\x89\xe7' # mov rdi, rsp
   return res
Example #11
0
 def code(self):
   res = ''
   res += '\x55'         # push rbp
   res += '\x48\x89\xe5' # mov rbp, rsp
   for i in range(self._num_locals):
     res += '\x48\xb8' + numtol(Undefined_value, nbytes=8) # mov rax, <Undefined_value>
     res += '\x50'                                         # push rax
   return res
Example #12
0
 def code(self):
     # to return, leave the values in the stack, but return the
     # stack top as if popping them and save in "rdi" the place
     # where they start
     res = ''
     res += '\x48\x81\xc4' + numtol(
         Word_size * self._nretvals)  # add rsp, Word_size * num_retvals
     res += '\x48\x89\xe7'  # mov rdi, rsp
     return res
Example #13
0
 def code(self):
     res = ''
     if self._num_locals != 0:
         res += '\x48\x81\xc4' + numtol(
             Word_size * self._num_locals
         )  # add rsp, Word_size * <num_locals> ; pop locals
     res += '\x5d'  # pop rbp
     res += '\xc3'  # ret
     return res
Example #14
0
 def code(self):
     res = ''
     res += '\x55'  # push rbp
     res += '\x48\x89\xe5'  # mov rbp, rsp
     for i in range(self._num_locals):
         res += '\x48\xb8' + numtol(Undefined_value,
                                    nbytes=8)  # mov rax, <Undefined_value>
         res += '\x50'  # push rax
     return res
Example #15
0
 def code(self):
   # to return, leave the values in the stack, but return the
   # stack top as if popping them and save in "rdi" the place
   # where they start
   res = ''.join([
     '\x48\x81\xc4' + numtol(Word_size * self._nretvals), # add rsp, Word_size * num_retvals
     '\x48\x89\xe7', # mov rdi, rsp
     lang.jit.x86_64_builtins.Undo_builtins['leave'],
   ])
   return res
Example #16
0
 def code(self):
     res = []
     res.extend([
         '\x48\xb8' + numtol(self._nretvals, 8)  # mov rax, <nretvals>
     ])
     for i in range(self._nretvals):
         res.extend([
             '\x48\xff\xc8',  # dec rax
             '\x41\x8f\x04\xc7',  # pop qword [r15 + 8 * rax]
         ])
     return ''.join(res)
Example #17
0
 def code(self):
   res = []
   res.extend([
     '\x48\xb8' + numtol(self._nretvals, 8) # mov rax, <nretvals>
   ])
   for i in range(self._nretvals):
     res.extend([
       '\x48\xff\xc8',     # dec rax
       '\x41\x8f\x04\xc7', # pop qword [r15 + 8 * rax]
     ])
   return ''.join(res)
Example #18
0
 def code(self):
     # to return, leave the values in the stack, but return the
     # stack top as if popping them and save in "rdi" the place
     # where they start
     res = ''.join([
         '\x48\x81\xc4' +
         numtol(Word_size *
                self._nretvals),  # add rsp, Word_size * num_retvals
         '\x48\x89\xe7',  # mov rdi, rsp
         lang.jit.x86_64_builtins.Undo_builtins['leave'],
     ])
     return res
Example #19
0
 def code(self):
   next_ip = self._ip + self.len()
   res = []
   res.extend([
     '\x58',         # pop rax       ; reference value
     '\x4d\x31\xc9', # xor r9, r9    ; 0 iff should jump
   ])
   for val in self._values:
     res.extend([
       '\x48\xba' + x86_64_literal(val), # mov rdx, <value> ; compared value
       '\x48\x39\xd0',                   # cmp rax, rdx
       '\x0f\x94\xc2',                   # sete dl
       '\x48\x0f\xb6\xd2',               # movzx rdx, dl
       '\x49\x01\xd1',                   # add r9, rdx
     ])
   res.extend([
     '\x4d\x85\xc9',                                # test r9, r9
     '\x0f\x84' + numtol(self._label_ip - next_ip), # jz near <label>
   ])
   res = ''.join(res)
   assert len(res) == self.len()
   return res
Example #20
0
 def code(self):
     next_ip = self._ip + self.len()
     res = []
     res.extend([
         '\x58',  # pop rax       ; reference value
         '\x4d\x31\xc9',  # xor r9, r9    ; 0 iff should jump
     ])
     for val in self._values:
         res.extend([
             '\x48\xba' +
             x86_64_literal(val),  # mov rdx, <value> ; compared value
             '\x48\x39\xd0',  # cmp rax, rdx
             '\x0f\x94\xc2',  # sete dl
             '\x48\x0f\xb6\xd2',  # movzx rdx, dl
             '\x49\x01\xd1',  # add r9, rdx
         ])
     res.extend([
         '\x4d\x85\xc9',  # test r9, r9
         '\x0f\x84' + numtol(self._label_ip - next_ip),  # jz near <label>
     ])
     res = ''.join(res)
     assert len(res) == self.len()
     return res
Example #21
0
 def code_param(self):
     offset = (self._var_num + 1) * Word_size
     return '\xff\xb5' + numtol(offset,
                                nbytes=4)  # push qword [rbp + <offset>]
Example #22
0
 def _repr(lit):
     if -0x8000000000000000 <= lit and lit < 0x7fffffffffffffff:
         return numtol(lit, nbytes=8)
     else:
         raise GbsJitPrimitiveException('integer literal too big')
Example #23
0
 def _repr(lit):
   if -0x8000000000000000 <= lit and lit < 0x7fffffffffffffff:
     return numtol(lit, nbytes=8)
   else:
     raise GbsJitPrimitiveException('integer literal too big')
Example #24
0
 def code_param(self):
   offset = (self._var_num + 1) * Word_size
   return '\xff\xb5' + numtol(offset, nbytes=4) # push qword [rbp + <offset>]
Example #25
0
 def code(self):
   next_ip = self._ip + self.len()
   res = '\xe9' + numtol(self._label_ip - next_ip) # jmp near <label>
   assert len(res) == self.len()
   return res
Example #26
0
 def code(self):
     next_ip = self._ip + self.len()
     res = '\xe9' + numtol(self._label_ip - next_ip)  # jmp near <label>
     assert len(res) == self.len()
     return res