Additional register and fuse validation (for AVR8 TDFs)
This commit is contained in:
@@ -483,19 +483,24 @@ class Avr8TargetDescriptionFile extends TargetDescriptionFile
|
||||
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
|
||||
{
|
||||
$peripheral = $this->getTargetPeripheral('fuse') ?? $this->getTargetPeripheral('nvm');
|
||||
if ($peripheral instanceof TargetPeripheral) {
|
||||
$fuseRegisterGroup = $peripheral->getRegisterGroup('fuse')
|
||||
?? $peripheral->getRegisterGroup('nvm_fuses');
|
||||
|
||||
if ($fuseRegisterGroup instanceof TargetRegisterGroup) {
|
||||
foreach ($fuseRegisterGroup->registers as $fuseRegister) {
|
||||
foreach ($fuseRegister->bitFields as $bitField) {
|
||||
if ($bitField->key === $fuseBitFieldKey) {
|
||||
return new FuseBitsDescriptor($fuseRegister->name);
|
||||
}
|
||||
$fuseRegisterGroup = $this->getFuseTargetRegisterGroup();
|
||||
if ($fuseRegisterGroup instanceof TargetRegisterGroup) {
|
||||
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';
|
||||
}
|
||||
|
||||
// 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.
|
||||
*
|
||||
@@ -104,8 +111,29 @@ class ValidationService extends \Targets\TargetDescriptionFiles\Services\Validat
|
||||
}
|
||||
|
||||
// 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';
|
||||
|
||||
} 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)) {
|
||||
|
||||
@@ -606,6 +606,11 @@ class ValidationService
|
||||
$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 = [];
|
||||
foreach ($register->bitFields as $bitField) {
|
||||
$failures = array_merge($failures, $this->validateBitField($bitField));
|
||||
|
||||
Reference in New Issue
Block a user