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)
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)
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
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
def tf(op,pc): log_tp.debug("#%s: cleaning up", self.name) if trap_func != None: trap_func() self.ctx.alloc.free_memory(mem)
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__)