1d6aed566Sopenharmony_ci/* 2d6aed566Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. 3d6aed566Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4d6aed566Sopenharmony_ci * you may not use this file except in compliance with the License. 5d6aed566Sopenharmony_ci * You may obtain a copy of the License at 6d6aed566Sopenharmony_ci * 7d6aed566Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8d6aed566Sopenharmony_ci * 9d6aed566Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10d6aed566Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11d6aed566Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12d6aed566Sopenharmony_ci * See the License for the specific language governing permissions and 13d6aed566Sopenharmony_ci * limitations under the License. 14d6aed566Sopenharmony_ci */ 15d6aed566Sopenharmony_ci 16d6aed566Sopenharmony_ci#include "los_config.h" 17d6aed566Sopenharmony_ci#ifdef LOSCFG_SHELL 18d6aed566Sopenharmony_ci#include "reset_shell.h" 19d6aed566Sopenharmony_ci#include "signal.h" 20d6aed566Sopenharmony_ci#include "asm/io.h" 21d6aed566Sopenharmony_ci#include "stdlib.h" 22d6aed566Sopenharmony_ci#include "soc/sys_ctrl.h" 23d6aed566Sopenharmony_ci#include "unistd.h" 24d6aed566Sopenharmony_ci#include "shcmd.h" 25d6aed566Sopenharmony_ci 26d6aed566Sopenharmony_ci#ifdef __cplusplus 27d6aed566Sopenharmony_ci#if __cplusplus 28d6aed566Sopenharmony_ciextern "C" { 29d6aed566Sopenharmony_ci#endif /* __cplusplus */ 30d6aed566Sopenharmony_ci#endif /* __cplusplus */ 31d6aed566Sopenharmony_ci 32d6aed566Sopenharmony_ciHook_Func_Node *g_hook_func_node = (Hook_Func_Node*)NULL; 33d6aed566Sopenharmony_ci 34d6aed566Sopenharmony_ciextern void OsReboot(void); 35d6aed566Sopenharmony_civoid cmd_reset(void) 36d6aed566Sopenharmony_ci{ 37d6aed566Sopenharmony_ci osReHookFuncHandle(); 38d6aed566Sopenharmony_ci sleep(1);/*lint !e534*/ 39d6aed566Sopenharmony_ci /* Any value to this reg will reset the cpu */ 40d6aed566Sopenharmony_ci OsReboot(); 41d6aed566Sopenharmony_ci} 42d6aed566Sopenharmony_ci 43d6aed566Sopenharmony_ciUINT32 osReHookFuncAdd(STORAGE_HOOK_FUNC handler, VOID *param) 44d6aed566Sopenharmony_ci{ 45d6aed566Sopenharmony_ci Hook_Func_Node *pstFuncNode; 46d6aed566Sopenharmony_ci 47d6aed566Sopenharmony_ci pstFuncNode = (Hook_Func_Node*)malloc(sizeof(Hook_Func_Node)); 48d6aed566Sopenharmony_ci if (pstFuncNode == NULL) { 49d6aed566Sopenharmony_ci return OS_ERROR; 50d6aed566Sopenharmony_ci } 51d6aed566Sopenharmony_ci 52d6aed566Sopenharmony_ci pstFuncNode->pHandler = handler; 53d6aed566Sopenharmony_ci pstFuncNode->pParam = param; 54d6aed566Sopenharmony_ci 55d6aed566Sopenharmony_ci pstFuncNode->pNext = g_hook_func_node; 56d6aed566Sopenharmony_ci g_hook_func_node = pstFuncNode; 57d6aed566Sopenharmony_ci 58d6aed566Sopenharmony_ci return LOS_OK; 59d6aed566Sopenharmony_ci} 60d6aed566Sopenharmony_ci 61d6aed566Sopenharmony_ciUINT32 osReHookFuncDel(STORAGE_HOOK_FUNC handler) 62d6aed566Sopenharmony_ci{ 63d6aed566Sopenharmony_ci Hook_Func_Node *pstFuncNode = NULL; 64d6aed566Sopenharmony_ci Hook_Func_Node *pstCurFuncNode = NULL; 65d6aed566Sopenharmony_ci while (g_hook_func_node) { 66d6aed566Sopenharmony_ci pstCurFuncNode = g_hook_func_node; 67d6aed566Sopenharmony_ci if (g_hook_func_node->pHandler == handler) { 68d6aed566Sopenharmony_ci g_hook_func_node = g_hook_func_node->pNext; 69d6aed566Sopenharmony_ci free(pstCurFuncNode); 70d6aed566Sopenharmony_ci continue; 71d6aed566Sopenharmony_ci } 72d6aed566Sopenharmony_ci break; 73d6aed566Sopenharmony_ci } 74d6aed566Sopenharmony_ci 75d6aed566Sopenharmony_ci if (g_hook_func_node) { 76d6aed566Sopenharmony_ci pstCurFuncNode = g_hook_func_node; 77d6aed566Sopenharmony_ci while (pstCurFuncNode->pNext) { 78d6aed566Sopenharmony_ci pstFuncNode = pstCurFuncNode->pNext; 79d6aed566Sopenharmony_ci if (pstFuncNode->pHandler == handler) { 80d6aed566Sopenharmony_ci pstCurFuncNode->pNext = pstFuncNode->pNext; 81d6aed566Sopenharmony_ci free(pstFuncNode); 82d6aed566Sopenharmony_ci continue; 83d6aed566Sopenharmony_ci } 84d6aed566Sopenharmony_ci pstCurFuncNode = pstCurFuncNode->pNext; 85d6aed566Sopenharmony_ci } 86d6aed566Sopenharmony_ci } 87d6aed566Sopenharmony_ci return LOS_OK; 88d6aed566Sopenharmony_ci} 89d6aed566Sopenharmony_ci 90d6aed566Sopenharmony_ciVOID osReHookFuncHandle(VOID) 91d6aed566Sopenharmony_ci{ 92d6aed566Sopenharmony_ci Hook_Func_Node *pstFuncNode; 93d6aed566Sopenharmony_ci 94d6aed566Sopenharmony_ci pstFuncNode = g_hook_func_node; 95d6aed566Sopenharmony_ci while (pstFuncNode) { 96d6aed566Sopenharmony_ci (void)pstFuncNode->pHandler(pstFuncNode->pParam); 97d6aed566Sopenharmony_ci pstFuncNode = pstFuncNode->pNext; 98d6aed566Sopenharmony_ci } 99d6aed566Sopenharmony_ci} 100d6aed566Sopenharmony_ci 101d6aed566Sopenharmony_ciSHELLCMD_ENTRY(reset_shellcmd, CMD_TYPE_EX, "reset", 0, (CmdCallBackFunc)cmd_reset); /*lint !e19*/ 102d6aed566Sopenharmony_ci 103d6aed566Sopenharmony_ci#ifdef __cplusplus 104d6aed566Sopenharmony_ci#if __cplusplus 105d6aed566Sopenharmony_ci} 106d6aed566Sopenharmony_ci#endif 107d6aed566Sopenharmony_ci#endif 108d6aed566Sopenharmony_ci#endif /* LOSCFG_SHELL */ 109