Ejemplo n.º 1
0
 def _gen_trap(self, addr, opts):
     """generate a trap in memory"""
     func, auto_rts, final = opts
     # final trap with cleanup func
     if final:
         tf = self._gen_trap_cleanup(self.mem, func)
     # normal trap
     else:
         tf = self._gen_trap_func(func)
     # create a trap
     code = self.ctx.traps.setup(tf, one_shot=True, auto_rts=auto_rts)
     if code == -1:
         raise VamosInternalError("No more traps for trampoline left!")
     # place trap opcode
     opcode = 0xA000 | code
     self.mem.access.w16(addr, opcode)
     if final:
         log_tp.debug("#%s: final trap: opcode=%04x @%08x", self.name, opcode, addr)
Ejemplo n.º 2
0
 def _gen_trap(self, addr, opts):
   """generate a trap in memory"""
   func, auto_rts, final = opts
   # final trap with cleanup func
   if final:
     tf = self._gen_trap_cleanup(self.mem, func)
   # normal trap
   else:
     tf = self._gen_trap_func(func)
   # create a trap
   code = self.ctx.traps.setup(tf, one_shot=True, auto_rts=auto_rts)
   if code == -1:
     raise VamosInternalError("No more traps for trampoline left!")
   # place trap opcode
   self.trapcode = code
   opcode = 0xa000 | code
   self.mem.access.w16(addr, opcode)
   if final:
     log_tp.debug("#%s: final trap: opcode=%04x @%08x", self.name, opcode, addr)
Ejemplo n.º 3
0
    def _generate(self):
        # calc and allocate memory
        size = self.code_size + self.data_size
        self.mem = self.ctx.alloc.alloc_memory(self.name, size)
        addr = self.mem.addr
        log_tp.debug(
            "#%s: @%06x: allocating %d bytes (code=%d, data=%d)", self.name, addr, size, self.code_size, self.data_size
        )

        # abs addresses of code and data
        self.code_addr = addr
        self.data_addr = addr + self.code_size

        # now fill in code
        for w in self.code:
            # === special 'opcode' ===
            if type(w) == tuple:
                special = w[0]
                # --- a trap ---
                if special == "trap":
                    self._gen_trap(addr, w[1:])
                    addr += 2
                # --- data offset ---
                elif special == "data_offset":
                    offset = w[1]
                    data_addr = self.data_addr + offset
                    self.mem.access.w32(addr, data_addr)
                    addr += 4
                # --- unknown special ---
                else:
                    raise VamosInternalError("Invalid special: %s" % special)
            # === normal code word ===
            else:
                self.mem.access.w16(addr, w)
                addr += 2

        # now write data
        for b in self.data:
            width, val = b
            self.mem.access.write_mem(width, addr, val)
            addr += 2 ** width
Ejemplo n.º 4
0
  def _generate(self):
    # calc and allocate memory
    size = self.code_size + self.data_size
    self.mem = self.ctx.alloc.alloc_memory(self.name, size)
    addr = self.mem.addr
    log_tp.debug("#%s: @%06x: allocating %d bytes (code=%d, data=%d)",
      self.name, addr, size, self.code_size, self.data_size)

    # abs addresses of code and data
    self.code_addr = addr
    self.data_addr = addr + self.code_size

    # now fill in code
    for w in self.code:
      # === special 'opcode' ===
      if type(w) == tuple:
        special = w[0]
        # --- a trap ---
        if special == 'trap':
          self._gen_trap(addr, w[1:])
          addr += 2
        # --- data offset ---
        elif special == 'data_offset':
          offset = w[1]
          data_addr = self.data_addr + offset
          self.mem.access.w32(addr, data_addr)
          addr += 4
        # --- unknown special ---
        else:
          raise VamosInternalError("Invalid special: %s" % special)
      # === normal code word ===
      else:
        self.mem.access.w16(addr, w)
        addr += 2

    # now write data
    for b in self.data:
      width,val = b
      self.mem.access.write(width, addr, val)
      addr += 2**width
Ejemplo n.º 5
0
 def tf(op,pc):
   log_tp.debug("#%s: cleaning up", self.name)
   if trap_func != None:
     trap_func()
   self.ctx.alloc.free_memory(mem)
Ejemplo n.º 6
0
 def tf(op,pc):
   log_tp.debug("#%s { trap: %s",self.name, trap_func.__name__)
   trap_func()
   log_tp.debug("#%s } trap: %s",self.name, trap_func.__name__)
Ejemplo n.º 7
0
 def tf(op,pc):
   log_tp.debug("#%s: cleaning up", self.name)
   if trap_func != None:
     trap_func()
   self.ctx.alloc.free_memory(mem)
Ejemplo n.º 8
0
 def tf(op,pc):
   log_tp.debug("#%s { trap: %s",self.name, trap_func.__name__)
   trap_func()
   log_tp.debug("#%s } trap: %s",self.name, trap_func.__name__)