Block memory writes to read-only selected program memory segments
This commit is contained in:
@@ -33,6 +33,17 @@ namespace Targets::RiscV::Wch
|
|||||||
"Selected program memory segment: \"" + this->selectedProgramSegmentDescriptor.name + "\" (\""
|
"Selected program memory segment: \"" + this->selectedProgramSegmentDescriptor.name + "\" (\""
|
||||||
+ this->selectedProgramSegmentDescriptor.key + "\")"
|
+ this->selectedProgramSegmentDescriptor.key + "\")"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (
|
||||||
|
this->selectedProgramSegmentDescriptor == this->bootProgramSegmentDescriptor
|
||||||
|
&& !this->selectedProgramSegmentDescriptor.programmingModeAccess.writeable
|
||||||
|
) {
|
||||||
|
Logger::warning(
|
||||||
|
"A read-only boot segment has been selected as the program memory segment - all programming sessions"
|
||||||
|
" will fail. This WCH target does not support storing custom bootloaders in this boot segment."
|
||||||
|
);
|
||||||
|
// TODO: Add link to further documentation here
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WchRiscV::activate() {
|
void WchRiscV::activate() {
|
||||||
@@ -131,6 +142,16 @@ namespace Targets::RiscV::Wch
|
|||||||
breakpoint.type == TargetProgramBreakpoint::Type::SOFTWARE
|
breakpoint.type == TargetProgramBreakpoint::Type::SOFTWARE
|
||||||
&& breakpoint.memorySegmentDescriptor == this->mappedSegmentDescriptor
|
&& breakpoint.memorySegmentDescriptor == this->mappedSegmentDescriptor
|
||||||
) {
|
) {
|
||||||
|
if (
|
||||||
|
!this->selectedProgramSegmentDescriptor.debugModeAccess.writeable
|
||||||
|
&& (!this->programmingMode || !this->selectedProgramSegmentDescriptor.programmingModeAccess.writeable)
|
||||||
|
) {
|
||||||
|
throw Exceptions::Exception{
|
||||||
|
"The selected program memory segment (\"" + this->selectedProgramSegmentDescriptor.key
|
||||||
|
+ "\") is not writable - cannot insert software breakpoint"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
this->riscVDebugInterface->setProgramBreakpoint(TargetProgramBreakpoint{
|
this->riscVDebugInterface->setProgramBreakpoint(TargetProgramBreakpoint{
|
||||||
.addressSpaceDescriptor = this->sysAddressSpaceDescriptor,
|
.addressSpaceDescriptor = this->sysAddressSpaceDescriptor,
|
||||||
.memorySegmentDescriptor = this->selectedProgramSegmentDescriptor,
|
.memorySegmentDescriptor = this->selectedProgramSegmentDescriptor,
|
||||||
@@ -150,6 +171,16 @@ namespace Targets::RiscV::Wch
|
|||||||
breakpoint.type == TargetProgramBreakpoint::Type::SOFTWARE
|
breakpoint.type == TargetProgramBreakpoint::Type::SOFTWARE
|
||||||
&& breakpoint.memorySegmentDescriptor == this->mappedSegmentDescriptor
|
&& breakpoint.memorySegmentDescriptor == this->mappedSegmentDescriptor
|
||||||
) {
|
) {
|
||||||
|
if (
|
||||||
|
!this->selectedProgramSegmentDescriptor.debugModeAccess.writeable
|
||||||
|
&& (!this->programmingMode || !this->selectedProgramSegmentDescriptor.programmingModeAccess.writeable)
|
||||||
|
) {
|
||||||
|
throw Exceptions::Exception{
|
||||||
|
"The selected program memory segment (\"" + this->selectedProgramSegmentDescriptor.key
|
||||||
|
+ "\") is not writable - cannot remove software breakpoint"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
this->riscVDebugInterface->removeProgramBreakpoint(TargetProgramBreakpoint{
|
this->riscVDebugInterface->removeProgramBreakpoint(TargetProgramBreakpoint{
|
||||||
.addressSpaceDescriptor = this->sysAddressSpaceDescriptor,
|
.addressSpaceDescriptor = this->sysAddressSpaceDescriptor,
|
||||||
.memorySegmentDescriptor = this->selectedProgramSegmentDescriptor,
|
.memorySegmentDescriptor = this->selectedProgramSegmentDescriptor,
|
||||||
@@ -221,6 +252,16 @@ namespace Targets::RiscV::Wch
|
|||||||
|
|
||||||
if (memorySegmentDescriptor == this->mappedSegmentDescriptor) {
|
if (memorySegmentDescriptor == this->mappedSegmentDescriptor) {
|
||||||
const auto& aliasedSegment = this->selectedProgramSegmentDescriptor;
|
const auto& aliasedSegment = this->selectedProgramSegmentDescriptor;
|
||||||
|
|
||||||
|
if (
|
||||||
|
!aliasedSegment.debugModeAccess.writeable
|
||||||
|
&& (!this->programmingMode || !aliasedSegment.programmingModeAccess.writeable)
|
||||||
|
) {
|
||||||
|
throw Exceptions::Exception{
|
||||||
|
"The selected program memory segment (\"" + aliasedSegment.key + "\") is not writable"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const auto transformedAddress = this->transformMappedAddress(startAddress, aliasedSegment);
|
const auto transformedAddress = this->transformMappedAddress(startAddress, aliasedSegment);
|
||||||
|
|
||||||
const auto addressRange = TargetMemoryAddressRange{
|
const auto addressRange = TargetMemoryAddressRange{
|
||||||
|
|||||||
Reference in New Issue
Block a user