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