Пример #1
0
uint8_t debug_read_byte(uint32_t address) {
    uint8_t *ptr, value = 0;

    address &= 0xFFFFFF;
    if (address < 0xE00000) {
        if ((ptr = phys_mem_ptr(address, 1))) {
            value = *ptr;
        }
    } else {
        value = debug_port_read_byte(mmio_range(address)<<12 | addr_range(address));
    }

    if (debugger.data.block[address]) {
        disasmHighlight.hit_read_breakpoint = debugger.data.block[address] & DBG_READ_BREAKPOINT;
        disasmHighlight.hit_write_breakpoint = debugger.data.block[address] & DBG_WRITE_BREAKPOINT;
        disasmHighlight.hit_exec_breakpoint = debugger.data.block[address] & DBG_EXEC_BREAKPOINT;
        disasmHighlight.hit_run_breakpoint = debugger.data.block[address] & DBG_RUN_UNTIL_BREAKPOINT;
    }

    if (cpu.registers.PC == address) {
        disasmHighlight.hit_pc = true;
    }

    return value;
}
Пример #2
0
tlm::tlm_response_status
Bus::write(const basic::addr_t &a, const basic::data_t &d)
{
    
    // Testing the bypass
    BASIC_TRACE_DEBUG("[!] CALL THE BUS'S WRITE FUNCTION [!]\n");
    
	if(a % sizeof(basic::data_t)) {
		SC_REPORT_ERROR(name(),
				"unaligned write");
		return tlm::TLM_ADDRESS_ERROR_RESPONSE;
	}

	addr_map_t::iterator it = addr_map.find(addr_range(a, a));
	if(it == addr_map.end()) {
		std::cerr << name() << ": no target at address " <<
			std::hex << a << std::endl;
		return tlm::TLM_ADDRESS_ERROR_RESPONSE;
	}

#ifdef DEBUG
	std::cout << "Debug: " << name() <<
		": write access at 0x" << std::hex << a <<
		" (data: 0x" << d << ")\n";
#endif

	tlm::tlm_response_status s =
		initiator.write(a - (*it).first.begin, d, (*it).second);

	return s;
}
Пример #3
0
tlm::tlm_response_status
Bus::write(ensitlm::addr_t a, ensitlm::data_t d)
{
	if(a % sizeof(ensitlm::data_t)) {
		SC_REPORT_ERROR(name(),
				"unaligned write");
		return tlm::TLM_ADDRESS_ERROR_RESPONSE;
	}

	addr_map_t::iterator it = addr_map.find(addr_range(a, a));
	if(it == addr_map.end()) {
		std::cerr << name() << ": no target at address " <<
			std::hex << a << std::endl;
		return tlm::TLM_ADDRESS_ERROR_RESPONSE;
	}

#ifdef DEBUG
	std::cout << "Debug: " << name() <<
		": write access at 0x" << std::hex << a <<
		" (data: 0x" << d << ")\n";
#endif

	tlm::tlm_response_status s =
		initiator.write(a - (*it).first.begin, d, (*it).second);

	return s;
}
Пример #4
0
bool 
Bus::checkAdressRange(const basic::addr_t &a) {
    addr_map_t::iterator it = addr_map.find(addr_range(a, a));
    if(it==addr_map.end()) {
        return true; // not in range
    } else {
        return false; // target available
    }

}
Пример #5
0
void debug_write_byte(uint32_t address, uint8_t value) {
    uint8_t *ptr;
    address &= 0xFFFFFF;
    if (address < 0xE00000) {
        if ((ptr = phys_mem_ptr(address, 1))) {
            *ptr = value;
        }
    } else {
        debug_port_write_byte(mmio_range(address)<<12 | addr_range(address), value);
    }
}
Пример #6
0
bool
Bus::checkAdressConcordance(basic::compatible_socket *target, 
                            const basic::addr_t &a) {
    
    addr_range range = addr_range(a, a);    
    
    for(port_map_t::iterator it = port_map.begin(); it != port_map.end(); ++it) {
        addr_range current = (*it).second;
        basic::compatible_socket *socket = (*it).first; 
        if(!(current<range) && !(range<current) && socket==target) {
            //std::cout << "         range : " << std::hex
            //<< "[0x" << current.begin << "-0x" << current.end << "["
            //<< std::endl;
            return true;
        }
    }
    return false;
}
Пример #7
0
void Bus::map(ensitlm::compatible_socket &port, ensitlm::addr_t start_addr,
              ensitlm::addr_t size) {
	port_map.insert(std::pair<ensitlm::compatible_socket *, addr_range>(
	    &port, addr_range(start_addr, start_addr + size - 1)));
}
Пример #8
0
void debug_port_write_byte(uint32_t address, uint8_t value) {
    apb_map[port_range(address)].range->write_out(addr_range(address), value);
}
Пример #9
0
uint8_t debug_port_read_byte(uint32_t address) {
    return apb_map[port_range(address)].range->read_in(addr_range(address));
}