Additional register and fuse validation (for AVR8 TDFs)
This commit is contained in:
@@ -483,19 +483,24 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile
|
|||||||
return $output;
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getFuseTargetPeripheral(): ?TargetPeripheral
|
||||||
|
{
|
||||||
|
return $this->getTargetPeripheral('fuse');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFuseTargetRegisterGroup(): ?TargetRegisterGroup
|
||||||
|
{
|
||||||
|
return $this->getFuseTargetPeripheral()?->getRegisterGroup("fuse");
|
||||||
|
}
|
||||||
|
|
||||||
public function getFuseBitsDescriptor(string $fuseBitFieldKey): ?FuseBitsDescriptor
|
public function getFuseBitsDescriptor(string $fuseBitFieldKey): ?FuseBitsDescriptor
|
||||||
{
|
{
|
||||||
$peripheral = $this->getTargetPeripheral('fuse') ?? $this->getTargetPeripheral('nvm');
|
$fuseRegisterGroup = $this->getFuseTargetRegisterGroup();
|
||||||
if ($peripheral instanceof TargetPeripheral) {
|
if ($fuseRegisterGroup instanceof TargetRegisterGroup) {
|
||||||
$fuseRegisterGroup = $peripheral->getRegisterGroup('fuse')
|
foreach ($fuseRegisterGroup->registers as $fuseRegister) {
|
||||||
?? $peripheral->getRegisterGroup('nvm_fuses');
|
foreach ($fuseRegister->bitFields as $bitField) {
|
||||||
|
if ($bitField->key === $fuseBitFieldKey) {
|
||||||
if ($fuseRegisterGroup instanceof TargetRegisterGroup) {
|
return new FuseBitsDescriptor($fuseRegister->name);
|
||||||
foreach ($fuseRegisterGroup->registers as $fuseRegister) {
|
|
||||||
foreach ($fuseRegister->bitFields as $bitField) {
|
|
||||||
if ($bitField->key === $fuseBitFieldKey) {
|
|
||||||
return new FuseBitsDescriptor($fuseRegister->name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,6 +93,13 @@ class ValidationService extends \Targets\TargetDescriptionFiles\Services\Validat
|
|||||||
$failures[] = 'Missing stack pointer register(s) in CPU peripheral';
|
$failures[] = 'Missing stack pointer register(s) in CPU peripheral';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SPL and SPH registers should 1 byte in size
|
||||||
|
foreach ($spRegisters as $register) {
|
||||||
|
if (($register->key === 'spl' || $register->key === 'sph') && $register->size !== 1) {
|
||||||
|
$failures[] = 'Invalid SP register (' . $register->key . ') size - should be 1 byte';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GDB allows for a maximum SP size of 2 bytes. We enforce this here.
|
* GDB allows for a maximum SP size of 2 bytes. We enforce this here.
|
||||||
*
|
*
|
||||||
@@ -104,8 +111,29 @@ class ValidationService extends \Targets\TargetDescriptionFiles\Services\Validat
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The target's status register must reside in the CPU peripheral
|
// The target's status register must reside in the CPU peripheral
|
||||||
if ($tdf->getTargetRegister("cpu", "cpu", "sreg") === null) {
|
if (($sreg = $tdf->getTargetRegister("cpu", "cpu", "sreg")) === null) {
|
||||||
$failures[] = 'Missing status (SREG) register in CPU peripheral';
|
$failures[] = 'Missing status (SREG) register in CPU peripheral';
|
||||||
|
|
||||||
|
} elseif ($sreg->size !== 1) {
|
||||||
|
// The SREG should always be 1 byte in size
|
||||||
|
$failures[] = 'Unexpected SREG register size - expected 1 byte, actual size: ' . $sreg->size . ' bytes';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($tdf->getFuseTargetPeripheral() === null) {
|
||||||
|
$failures[] = 'Missing fuse peripheral';
|
||||||
|
}
|
||||||
|
|
||||||
|
$fuseRegisterGroup = $tdf->getFuseTargetRegisterGroup();
|
||||||
|
if ($fuseRegisterGroup instanceof TargetRegisterGroup) {
|
||||||
|
// All fuse registers should be 1 byte in size
|
||||||
|
foreach ($tdf->getFuseTargetRegisterGroup()->registers as $fuseRegister) {
|
||||||
|
if ($fuseRegister->size != 1) {
|
||||||
|
$failures[] = 'Fuse register ("' . $fuseRegister->key . '") is not 1 byte in size.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$failures[] = 'Missing fuse register group (in fuse peripheral)';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_array(AvrPhysicalInterface::DEBUG_WIRE, $debugPhysicalInterfaces)) {
|
if (in_array(AvrPhysicalInterface::DEBUG_WIRE, $debugPhysicalInterfaces)) {
|
||||||
|
|||||||
@@ -606,6 +606,11 @@ class ValidationService
|
|||||||
$failures[] = 'Invalid size (' . $register->size . ')';
|
$failures[] = 'Invalid size (' . $register->size . ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($register->size > 8) {
|
||||||
|
// We only support a maximum of 64-bit width for registers, for now
|
||||||
|
$failures[] = 'Width exceeds 64-bit';
|
||||||
|
}
|
||||||
|
|
||||||
$processedBitFieldKeys = [];
|
$processedBitFieldKeys = [];
|
||||||
foreach ($register->bitFields as $bitField) {
|
foreach ($register->bitFields as $bitField) {
|
||||||
$failures = array_merge($failures, $this->validateBitField($bitField));
|
$failures = array_merge($failures, $this->validateBitField($bitField));
|
||||||
|
|||||||
Reference in New Issue
Block a user