Included CPU register offset in stack pointer and status register addresses

This commit is contained in:
Nav
2021-06-30 03:10:16 +01:00
parent 403f3ca408
commit e1962ba61a

View File

@@ -84,15 +84,30 @@ void Avr8::loadTargetParameters() {
this->targetParameters->bootSectionSize = firstBootSectionMemorySegment->size; this->targetParameters->bootSectionSize = firstBootSectionMemorySegment->size;
} }
std::uint32_t cpuRegistersOffset = 0;
if (peripheralModules.contains("cpu")) {
auto cpuPeripheralModule = peripheralModules.at("cpu");
if (cpuPeripheralModule.instancesMappedByName.contains("cpu")) {
auto cpuInstance = cpuPeripheralModule.instancesMappedByName.at("cpu");
if (cpuInstance.registerGroupsMappedByName.contains("cpu")) {
auto cpuRegisterGroup = cpuInstance.registerGroupsMappedByName.at("cpu");
cpuRegistersOffset = cpuRegisterGroup.offset.value_or(0);
}
}
}
auto statusRegister = this->targetDescriptionFile->getStatusRegister(); auto statusRegister = this->targetDescriptionFile->getStatusRegister();
if (statusRegister.has_value()) { if (statusRegister.has_value()) {
this->targetParameters->statusRegisterStartAddress = statusRegister->offset; this->targetParameters->statusRegisterStartAddress = cpuRegistersOffset + statusRegister->offset;
this->targetParameters->statusRegisterSize = statusRegister->size; this->targetParameters->statusRegisterSize = statusRegister->size;
} }
auto stackPointerRegister = this->targetDescriptionFile->getStackPointerRegister(); auto stackPointerRegister = this->targetDescriptionFile->getStackPointerRegister();
if (stackPointerRegister.has_value()) { if (stackPointerRegister.has_value()) {
this->targetParameters->stackPointerRegisterStartAddress = stackPointerRegister->offset; this->targetParameters->stackPointerRegisterStartAddress = cpuRegistersOffset + stackPointerRegister->offset;
this->targetParameters->stackPointerRegisterSize = stackPointerRegister->size; this->targetParameters->stackPointerRegisterSize = stackPointerRegister->size;
} else { } else {
@@ -101,12 +116,14 @@ void Avr8::loadTargetParameters() {
auto stackPointerHighRegister = this->targetDescriptionFile->getStackPointerHighRegister(); auto stackPointerHighRegister = this->targetDescriptionFile->getStackPointerHighRegister();
if (stackPointerLowRegister.has_value()) { if (stackPointerLowRegister.has_value()) {
this->targetParameters->stackPointerRegisterStartAddress = stackPointerLowRegister->offset; this->targetParameters->stackPointerRegisterStartAddress = cpuRegistersOffset
+ stackPointerLowRegister->offset;
this->targetParameters->stackPointerRegisterSize = stackPointerLowRegister->size; this->targetParameters->stackPointerRegisterSize = stackPointerLowRegister->size;
} }
if (stackPointerHighRegister.has_value()) { if (stackPointerHighRegister.has_value()) {
this->targetParameters->stackPointerRegisterSize = (this->targetParameters->stackPointerRegisterSize.has_value()) ? this->targetParameters->stackPointerRegisterSize =
this->targetParameters->stackPointerRegisterSize.has_value() ?
this->targetParameters->stackPointerRegisterSize.value() + stackPointerHighRegister->size : this->targetParameters->stackPointerRegisterSize.value() + stackPointerHighRegister->size :
stackPointerHighRegister->size; stackPointerHighRegister->size;
} }