Added more rrc-as register annotations
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
DataHoarder 2021-08-02 21:05:34 +02:00
parent 6d3760c96e
commit 6a5d9696e7
3 changed files with 64 additions and 42 deletions

View file

@ -203,9 +203,14 @@ void OutputContext::setNop(uint32_t location) {
}
std::string OutputContext::getAddressRegisterName(uint32_t addr, uint8_t offset) const {
if (offset || registers.find(addr) == registers.end()) {
uint64_t k = (uint64_t)addr | ((uint64_t)offset << 32);
if (registers.find(k) == registers.end()) {
return ::getAddressRegisterName(addr, offset);
} else {
return registers.at(addr);
return registers.at(k);
}
}
void OutputContext::addRegister(const Instruction::AddressWithOffset &address, const std::string &name) {
registers[(uint64_t)address.address | ((uint64_t)address.offset << 32)] = name;
}

View file

@ -41,7 +41,7 @@ private:
const ImageFormat &image;
std::unordered_map<uint32_t, std::string> mappings;
std::unordered_map<uint32_t, std::string> comments;
std::unordered_map<uint32_t, std::string> registers;
std::unordered_map<uint64_t, std::string> registers;
std::unordered_map<uint32_t, bool> nop;
public:
@ -56,9 +56,7 @@ public:
void setNop(uint32_t location);
void addRegister(uint32_t addr, const std::string &name) {
registers[addr] = name;
}
void addRegister(const Instruction::AddressWithOffset& address, const std::string &name);
std::string getAddressRegisterName(uint32_t addr, uint8_t offset) const;

View file

@ -299,7 +299,41 @@ void decodeImage(const std::string &fileName) {
};
for(uint32_t i = 10; i < 200; ++i){
if(registerRename.find((uint32_t) KnownRegisters::BSM_SCRATCH_START + i) == registerRename.end()){
std::stringstream s;
s << "api_MASK_BSM_CONFIG_" << std::dec << i;
registerRename[(uint32_t) KnownRegisters::BSM_SCRATCH_START + i] = s.str();
}
}
for(uint32_t i = 400; i < 410; ++i){
if(registerRename.find((uint32_t) KnownRegisters::BSM_SCRATCH_START + i) == registerRename.end()){
std::stringstream s;
s << "api_MASK_BSM_INIT_STATUS_" << std::dec << i;
registerRename[(uint32_t) KnownRegisters::BSM_SCRATCH_START + i] = s.str();
}
}
for(uint32_t i = 430; i < 441; ++i){
if(registerRename.find((uint32_t) KnownRegisters::BSM_SCRATCH_START + i) == registerRename.end()){
std::stringstream s;
s << "api_MASK_BSM_INIT_STATUS_ARCHIVE_" << std::dec << i;
registerRename[(uint32_t) KnownRegisters::BSM_SCRATCH_START + i] = s.str();
}
}
for(uint32_t i = 450; i < 452; ++i){
if(registerRename.find((uint32_t) KnownRegisters::BSM_SCRATCH_START + i) == registerRename.end()){
std::stringstream s;
s << "api_MASK_BSM_INIT_OOR_" << std::dec << i;
registerRename[(uint32_t) KnownRegisters::BSM_SCRATCH_START + i] = s.str();
}
}
for (auto &r : registerRename) {
ctx.addRegister(Instruction::AddressWithOffset{r.first, 0}, r.second);
}
bool isKnownAssembler = false;
if (imageObject.imageSignature.find("rrc-as") != std::string::npos) {
@ -308,6 +342,27 @@ void decodeImage(const std::string &fileName) {
comments.clear();
knownNames.clear();
ctx.addRegister(Instruction::AddressWithOffset{static_cast<uint32_t>(KnownRegisters::BSM_ADDR_OFFSET_3), 0}, "rrcc_STACK_POINTER");
ctx.addRegister(Instruction::AddressWithOffset{static_cast<uint32_t>(KnownRegisters::BSM_ADDR_OFFSET_2), 0}, "rrcc_FRAME_POINTER");
ctx.addRegister(Instruction::AddressWithOffset{static_cast<uint32_t>(KnownRegisters::MGMT_SCRATCH_0), 0}, "rrcc_P0_RRET");
ctx.addRegister(Instruction::AddressWithOffset{static_cast<uint32_t>(KnownRegisters::MGMT_SCRATCH_1), 0}, "rrcc_P1_RRET_X");
for(uint32_t i = 0; i < 16; ++i){
ctx.addRegister(Instruction::AddressWithOffset{i, 3}, "rrcc_STACK_POINTER+" +
std::to_string(i));
}
for(uint32_t i = 0; i < 16; ++i){
ctx.addRegister(Instruction::AddressWithOffset{i, 2}, "rrcc_FRAME_POINTER+" +
std::to_string(i));
}
for(uint32_t i = 0; i < 16; ++i){
ctx.addRegister(Instruction::AddressWithOffset{static_cast<uint32_t>(KnownRegisters::BSM_SCRATCH_START) + 0x1F0, 0}, "rrcc_R" +
std::to_string(i));
}
for (auto& i : imageObject.getInstructions()){
std::unique_ptr<Instruction::Instruction> decodedInstruction = nullptr;
std::unique_ptr<Instruction::Instruction> decodedInstruction2 = nullptr;
@ -376,42 +431,6 @@ void decodeImage(const std::string &fileName) {
ctx.addComment(c.first, c.second);
}
for(uint32_t i = 10; i < 200; ++i){
if(registerRename.find((uint32_t) KnownRegisters::BSM_SCRATCH_START + i) == registerRename.end()){
std::stringstream s;
s << "api_MASK_BSM_CONFIG_" << std::dec << i;
registerRename[(uint32_t) KnownRegisters::BSM_SCRATCH_START + i] = s.str();
}
}
for(uint32_t i = 400; i < 410; ++i){
if(registerRename.find((uint32_t) KnownRegisters::BSM_SCRATCH_START + i) == registerRename.end()){
std::stringstream s;
s << "api_MASK_BSM_INIT_STATUS_" << std::dec << i;
registerRename[(uint32_t) KnownRegisters::BSM_SCRATCH_START + i] = s.str();
}
}
for(uint32_t i = 430; i < 441; ++i){
if(registerRename.find((uint32_t) KnownRegisters::BSM_SCRATCH_START + i) == registerRename.end()){
std::stringstream s;
s << "api_MASK_BSM_INIT_STATUS_ARCHIVE_" << std::dec << i;
registerRename[(uint32_t) KnownRegisters::BSM_SCRATCH_START + i] = s.str();
}
}
for(uint32_t i = 450; i < 452; ++i){
if(registerRename.find((uint32_t) KnownRegisters::BSM_SCRATCH_START + i) == registerRename.end()){
std::stringstream s;
s << "api_MASK_BSM_INIT_OOR_" << std::dec << i;
registerRename[(uint32_t) KnownRegisters::BSM_SCRATCH_START + i] = s.str();
}
}
for (auto &r : registerRename) {
ctx.addRegister(r.first, r.second);
}
ctx.analyze();
uint32_t prevAddress = 0;