Additional register and fuse validation (for AVR8 TDFs)

This commit is contained in:
Nav
2024-06-02 14:05:34 +01:00
parent 4944435ef6
commit dce803b2f3
3 changed files with 50 additions and 12 deletions

View File

@@ -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);
}
} }
} }
} }

View File

@@ -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)) {

View File

@@ -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));