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