blob: 90d8f45588e51914480bd06d1a83a101d24837dd [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT
#include "arm_gicv2.h"
#include <lib/unittest/unittest.h>
namespace {
bool test_gic_translator_translate() {
BEGIN_TEST;
arm_gicv2::CpuMaskTranslator translator;
translator.SetGicIdForLogicalId(0, 7);
ASSERT_EQ(0b10000000u, translator.GetGicMask(0));
translator.SetGicIdForLogicalId(1, 2);
ASSERT_EQ(0b00000100u, translator.GetGicMask(1));
translator.SetGicIdForLogicalId(2, 0);
ASSERT_EQ(0b00000001u, translator.GetGicMask(2));
END_TEST;
}
bool test_gic_translator_translate_mask() {
BEGIN_TEST;
arm_gicv2::CpuMaskTranslator translator;
translator.SetGicIdForLogicalId(0, 7);
translator.SetGicIdForLogicalId(1, 2);
translator.SetGicIdForLogicalId(2, 0);
ASSERT_EQ(0b10000101u, translator.LogicalMaskToGic(0b00000111));
ASSERT_EQ(0b10000000u, translator.LogicalMaskToGic(0b00000001));
END_TEST;
}
bool test_determine_local_mask() {
BEGIN_TEST;
{ // From second reg in first target.
uint32_t targets[8]{
0x00800000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
ASSERT_EQ(0b10000000u, gic_determine_local_mask([&](int target) {
DEBUG_ASSERT(target < 8);
return targets[target];
}),
"");
}
{ // From last reg in last target.
uint32_t targets[8]{
0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000080,
};
ASSERT_EQ(0b10000000u, gic_determine_local_mask([&](int target) {
DEBUG_ASSERT(target < 8);
return targets[target];
}),
"");
}
END_TEST;
}
} // namespace
UNITTEST_START_TESTCASE(gicv2_tests)
UNITTEST("Set and lookup translations.", test_gic_translator_translate)
UNITTEST("Translate full cpu masks.", test_gic_translator_translate_mask)
UNITTEST("Determine local mask from target registers.", test_determine_local_mask)
UNITTEST_END_TESTCASE(gicv2_tests, "gicv2", "Tests relating to ARM GICv2 handling.")