blob: 5390f5be06c3c4c3ef2b8c0d0cc739a9a6a738ea [file] [log] [blame]
// Copyright 2021 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 <stdio.h>
#include <ktl/utility.h>
#include <phys/exception.h>
#include <phys/main.h>
PhysHandledException gPhysHandledException;
// This is called from the vector code in exception.S for all exceptions.
extern "C" uint64_t PhysException(uint64_t vector, const char* vector_name,
PhysExceptionState& state) {
// Check for an installed handler, and always reset to no handler.
PhysHandledException handled = ktl::exchange(gPhysHandledException, {});
// If the handler was expecting this PC to get an exception, it takes over.
if (handled.pc != 0 && state.pc() == handled.pc) {
return handled.handler(vector, vector_name, state);
}
// Otherwise complain verbosely and reboot.
PreparePanic();
PrintPhysException(vector, vector_name, state);
ArchPanicReset();
}