/* * Copyright (c) 2016 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include /* TODO initialize with sentinel values */ const NANO_ESF _default_esf; /** * * @brief Nanokernel fatal error handler * * This routine is called when a fatal error condition is detected by either * hardware or software. * * The caller is expected to always provide a usable ESF. In the event that the * fatal error does not have a hardware generated ESF, the caller should either * create its own or call _Fault instead. * * @param reason the reason that the handler was called * @param pEsf pointer to the exception stack frame * * @return This function does not return. */ FUNC_NORETURN void _NanoFatalErrorHandler(unsigned int reason, const NANO_ESF *esf) { /* STUB TODO: dump out reason for the error and any interesting * info in esf */ _SysFatalErrorHandler(reason, esf); } FUNC_NORETURN void _Fault(void) { /* STUB TODO dump out reason for this exception */ _NanoFatalErrorHandler(_NANO_ERR_HW_EXCEPTION, &_default_esf); } /** * * @brief Fatal error handler * * This routine implements the corrective action to be taken when the system * detects a fatal error. * * This sample implementation attempts to abort the current thread and allow * the system to continue executing, which may permit the system to continue * functioning with degraded capabilities. * * System designers may wish to enhance or substitute this sample * implementation to take other actions, such as logging error (or debug) * information to a persistent repository and/or rebooting the system. * * @param reason the fatal error reason * @param pEsf the pointer to the exception stack frame * * @return This function does not return. */ FUNC_NORETURN void _SysFatalErrorHandler(unsigned int reason, const NANO_ESF *esf) { /* STUB TODO try to abort task/fibers like in the x86 implementation */ printk("Fatal error!\n"); while (1) { /* whee! */ } }