blob: 0a7d5f7113a991c4df680e5143e5196628e87117 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/debug/zxdb/console/format_exception.h"
#include <gtest/gtest.h>
namespace zxdb {
using debug_ipc::Arch;
using debug_ipc::ExceptionRecord;
TEST(FormatException, X64ExceptionToString) {
// No exception.
ExceptionRecord record;
EXPECT_EQ("No exception information", ExceptionRecordToString(Arch::kX64, record));
// Divide by 0.
record.valid = true;
record.arch.x64.vector = 0;
EXPECT_EQ("Divide-by-zero exception", ExceptionRecordToString(Arch::kX64, record));
// Page fault (read).
record.arch.x64.vector = 14;
record.arch.x64.err_code = 0;
record.arch.x64.cr2 = 0x1234;
EXPECT_EQ("Page fault reading address 0x1234", ExceptionRecordToString(Arch::kX64, record));
// Page fault (write).
record.arch.x64.err_code = 2;
record.arch.x64.cr2 = 0x5678;
EXPECT_EQ("Page fault writing address 0x5678", ExceptionRecordToString(Arch::kX64, record));
// Random invalid exception.
record.arch.x64.vector = 999;
EXPECT_EQ("Unknown exception (999)", ExceptionRecordToString(Arch::kX64, record));
}
TEST(FormatException, Arm64ExceptionToString) {
// No exception.
ExceptionRecord record;
EXPECT_EQ("No exception information", ExceptionRecordToString(Arch::kX64, record));
// SP alignment fault
record.valid = true;
record.arch.arm64.esr = 0b10011000000000000000000000000000;
EXPECT_EQ("SP alignment fault exception", ExceptionRecordToString(Arch::kArm64, record));
// Data read fault.
record.arch.arm64.esr = 0b10010100000000000000000000111110;
record.arch.arm64.far = 0x1234;
EXPECT_EQ("Data fault reading address 0x1234 (page domain fault)",
ExceptionRecordToString(Arch::kArm64, record));
// Data write fault.
record.arch.arm64.esr = 0b10010100000000000000000001100001;
record.arch.arm64.far = 0x1234;
EXPECT_EQ("Data fault writing address 0x1234 (alignment fault)",
ExceptionRecordToString(Arch::kArm64, record));
}
} // namespace zxdb