Exemplo n.º 1
0
 def cpsr_write_by_instr(self, value, bytemask, is_excp_return):
     privileged = self.current_mode_is_not_user()
     nmfi = self.sctlr.nmfi
     if bit_at(bytemask, 3):
         self.cpsr.value = set_substring(self.cpsr.value, 31, 27,
                                         substring(value, 31, 27))
         if is_excp_return:
             self.cpsr.value = set_substring(self.cpsr.value, 26, 24,
                                             substring(value, 26, 24))
     if bit_at(bytemask, 2):
         self.cpsr.value = set_substring(self.cpsr.value, 19, 16,
                                         substring(value, 19, 16))
     if bit_at(bytemask, 1):
         if is_excp_return:
             self.cpsr.value = set_substring(self.cpsr.value, 15, 10,
                                             substring(value, 15, 10))
         self.cpsr.value = set_bit_at(self.cpsr.value, 9, bit_at(value, 9))
         if privileged and (self.is_secure() or self.scr.aw
                            or have_virt_ext()):
             self.cpsr.value = set_bit_at(self.cpsr.value, 8,
                                          bit_at(value, 8))
     if bit_at(bytemask, 0):
         if privileged:
             self.cpsr.value = set_bit_at(self.cpsr.value, 7,
                                          bit_at(value, 7))
         if (privileged and (not nmfi or not bit_at(value, 6))
                 and (self.is_secure() or self.scr.fw or have_virt_ext())):
             self.cpsr.value = set_bit_at(self.cpsr.value, 6,
                                          bit_at(value, 6))
         if is_excp_return:
             self.cpsr.value = set_bit_at(self.cpsr.value, 5,
                                          bit_at(value, 5))
         if privileged:
             value_mode = substring(value, 4, 0)
             if self.bad_mode(value_mode):
                 print('unpredictable')
             else:
                 if not self.is_secure() and value_mode == 0b10110:
                     print('unpredictable')
                 elif not self.is_secure(
                 ) and value_mode == 0b10001 and self.nsacr.rfr:
                     print('unpredictable')
                 elif not self.scr.ns and value_mode == 0b11010:
                     print('unpredictable')
                 elif not self.is_secure(
                 ) and self.cpsr.m != 0b11010 and value_mode == 0b11010:
                     print('unpredictable')
                 elif self.cpsr.m == 0b11010 and value_mode != 0b11010 and not is_excp_return:
                     print('unpredictable')
                 else:
                     self.cpsr.m = value_mode
Exemplo n.º 2
0
 def execute(self, processor):
     if processor.condition_passed():
         result = 0
         m = processor.registers.get(self.m)
         for i in range(32):
             result = set_bit_at(result, 31 - i, bit_at(m, i))
         processor.registers.set(self.d, result)
Exemplo n.º 3
0
 def execute(self, processor):
     if processor.condition_passed():
         n = processor.registers.get(self.n)
         m = processor.registers.get(self.m)
         sum1 = substring(n, 7, 0) + substring(m, 7, 0)
         sum2 = substring(n, 15, 8) + substring(m, 15, 8)
         sum3 = substring(n, 23, 16) + substring(m, 23, 16)
         sum4 = substring(n, 31, 24) + substring(m, 31, 24)
         d = set_substring(0, 7, 0, lower_chunk(sum1, 8))
         d = set_substring(d, 15, 8, lower_chunk(sum2, 8))
         d = set_substring(d, 23, 16, lower_chunk(sum3, 8))
         d = set_substring(d, 31, 24, lower_chunk(sum4, 8))
         processor.registers.set(self.d, d)
         ge = set_bit_at(0, 0, 0b1 if sum1 >= 0x100 else 0b0)
         ge = set_bit_at(ge, 1, 0b1 if sum2 >= 0x100 else 0b0)
         ge = set_bit_at(ge, 2, 0b1 if sum3 >= 0x100 else 0b0)
         ge = set_bit_at(ge, 3, 0b1 if sum4 >= 0x100 else 0b0)
         processor.registers.cpsr.ge = ge
Exemplo n.º 4
0
 def from_bitarray(instr, processor):
     registers_list = substring(instr, 7, 0)
     m = bit_at(instr, 8)
     registers = set_bit_at(registers_list, 14, m)
     unaligned_allowed = False
     if not registers:
         print('unpredictable')
     else:
         return PushT1(instr, registers=registers, unaligned_allowed=unaligned_allowed)
Exemplo n.º 5
0
 def execute(self, processor):
     if processor.condition_passed():
         n = processor.registers.get(self.n)
         m = processor.registers.get(self.m)
         diff1 = substring(n, 7, 0) - substring(m, 7, 0)
         diff2 = substring(n, 15, 8) - substring(m, 15, 8)
         diff3 = substring(n, 23, 16) - substring(m, 23, 16)
         diff4 = substring(n, 31, 24) - substring(m, 31, 24)
         d = set_substring(0, 7, 0, lower_chunk(diff1, 8))
         d = set_substring(d, 15, 8, lower_chunk(diff2, 8))
         d = set_substring(d, 23, 16, lower_chunk(diff3, 8))
         d = set_substring(d, 31, 24, lower_chunk(diff4, 8))
         processor.registers.set(self.d, d)
         ge = set_bit_at(0, 0, 0b1 if diff1 >= 0 else 0b0)
         ge = set_bit_at(ge, 1, 0b1 if diff2 >= 0 else 0b0)
         ge = set_bit_at(ge, 2, 0b1 if diff3 >= 0 else 0b0)
         ge = set_bit_at(ge, 3, 0b1 if diff4 >= 0 else 0b0)
         processor.registers.cpsr.ge = ge
Exemplo n.º 6
0
 def execute(self, processor):
     if processor.condition_passed():
         n = processor.registers.get(self.n)
         m = processor.registers.get(self.m)
         sum1 = to_signed(substring(n, 7, 0), 8) + to_signed(substring(m, 7, 0), 8)
         sum2 = to_signed(substring(n, 15, 8), 8) + to_signed(substring(m, 15, 8), 8)
         sum3 = to_signed(substring(n, 23, 16), 8) + to_signed(substring(m, 23, 16), 8)
         sum4 = to_signed(substring(n, 31, 24), 8) + to_signed(substring(m, 31, 24), 8)
         d = set_substring(0, 7, 0, to_unsigned(sum1, 8))
         d = set_substring(d, 15, 8, to_unsigned(sum2, 8))
         d = set_substring(d, 23, 16, to_unsigned(sum3, 8))
         d = set_substring(d, 31, 24, to_unsigned(sum4, 8))
         processor.registers.set(self.d, d)
         ge = set_bit_at(0, 0, 0b1 if sum1 >= 0 else 0b0)
         ge = set_bit_at(ge, 1, 0b1 if sum2 >= 0 else 0b0)
         ge = set_bit_at(ge, 2, 0b1 if sum3 >= 0 else 0b0)
         ge = set_bit_at(ge, 3, 0b1 if sum4 >= 0 else 0b0)
         processor.registers.cpsr.ge = ge
Exemplo n.º 7
0
 def from_bitarray(instr, processor):
     rt = substring(instr, 15, 12)
     registers = set_bit_at(0, rt, 1)
     unaligned_allowed = True
     if rt == 13:
         print('unpredictable')
     else:
         return PushA2(instr,
                       registers=registers,
                       unaligned_allowed=unaligned_allowed)
Exemplo n.º 8
0
 def from_bitarray(instr, processor):
     rt = substring(instr, 15, 12)
     registers = set_bit_at(0, rt, 1)
     unaligned_allowed = True
     if rt == 13 or (rt == 15 and processor.in_it_block()
                     and not processor.last_in_it_block()):
         print('unpredictable')
     else:
         return PopThumbT3(instr,
                           registers=registers,
                           unaligned_allowed=unaligned_allowed)
Exemplo n.º 9
0
 def execute(self, processor):
     if processor.condition_passed():
         target = processor.registers.get(self.m)
         if processor.registers.current_instr_set() == InstrSet.ARM:
             next_instr_addr = processor.registers.get_pc() - 4
             processor.registers.set_lr(next_instr_addr)
         else:
             next_instr_addr = processor.registers.get_pc() - 2
             next_instr_addr = set_bit_at(next_instr_addr, 0, 1)
             processor.registers.set_lr(next_instr_addr)
         processor.bx_write_pc(target)
Exemplo n.º 10
0
 def execute(self, processor):
     if processor.registers.current_mode_is_not_user():
         cpsr_val = processor.registers.cpsr.value
         if self.enable:
             if self.affect_a:
                 cpsr_val = set_bit_at(cpsr_val, 8, 0)
             if self.affect_i:
                 cpsr_val = set_bit_at(cpsr_val, 7, 0)
             if self.affect_f:
                 cpsr_val = set_bit_at(cpsr_val, 6, 0)
         if self.disable:
             if self.affect_a:
                 cpsr_val = set_bit_at(cpsr_val, 8, 1)
             if self.affect_i:
                 cpsr_val = set_bit_at(cpsr_val, 7, 1)
             if self.affect_f:
                 cpsr_val = set_bit_at(cpsr_val, 6, 1)
         if self.change_mode:
             cpsr_val = set_substring(cpsr_val, 4, 0, self.mode)
         processor.registers.cpsr_write_by_instr(cpsr_val, 0b1111, False)
Exemplo n.º 11
0
 def __setitem__(self, item, value):
     if isinstance(item, int):
         self.value = set_bit_at(self.value, item, value)
         return
     self.value = set_substring(self.value, item.start, item.stop, value)
Exemplo n.º 12
0
 def _set_at(self, index, value):
     self.value = set_bit_at(self.value, index, value)