154568cb3Sopenharmony_ci/*
254568cb3Sopenharmony_ci * Copyright (c) 2009-2022 Huawei Technologies Co., Ltd. All rights reserved.
354568cb3Sopenharmony_ci *
454568cb3Sopenharmony_ci * UniProton is licensed under Mulan PSL v2.
554568cb3Sopenharmony_ci * You can use this software according to the terms and conditions of the Mulan PSL v2.
654568cb3Sopenharmony_ci * You may obtain a copy of Mulan PSL v2 at:
754568cb3Sopenharmony_ci *          http://license.coscl.org.cn/MulanPSL2
854568cb3Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
954568cb3Sopenharmony_ci * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
1054568cb3Sopenharmony_ci * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
1154568cb3Sopenharmony_ci * See the Mulan PSL v2 for more details.
1254568cb3Sopenharmony_ci * Create: 2009-12-22
1354568cb3Sopenharmony_ci * Description: CPU占用率模块的C文件
1454568cb3Sopenharmony_ci */
1554568cb3Sopenharmony_ci#include "prt_cpup_internal.h"
1654568cb3Sopenharmony_ci
1754568cb3Sopenharmony_ciOS_SEC_BSS struct TagOsCpupWarnInfo g_cpupWarnInfo;
1854568cb3Sopenharmony_ci
1954568cb3Sopenharmony_ci/*
2054568cb3Sopenharmony_ci * 描述:初始化CPUP告警模块
2154568cb3Sopenharmony_ci */
2254568cb3Sopenharmony_ciOS_SEC_L4_TEXT void OsCpupWarnInit(void)
2354568cb3Sopenharmony_ci{
2454568cb3Sopenharmony_ci    g_cpupWarnCheck = OsCpupWarn;
2554568cb3Sopenharmony_ci}
2654568cb3Sopenharmony_ci
2754568cb3Sopenharmony_ci/*
2854568cb3Sopenharmony_ci * 描述:CPUP告警,调用用户注册的钩子函数上报信息通知用户
2954568cb3Sopenharmony_ci */
3054568cb3Sopenharmony_ciOS_SEC_L2_TEXT void OsCpupWarn(void)
3154568cb3Sopenharmony_ci{
3254568cb3Sopenharmony_ci    struct CpupWarnInfo warnInfo;
3354568cb3Sopenharmony_ci    U32 cpup;
3454568cb3Sopenharmony_ci    static bool warn = FALSE;
3554568cb3Sopenharmony_ci
3654568cb3Sopenharmony_ci    cpup = OsCpupGet();
3754568cb3Sopenharmony_ci    if (cpup > g_cpupWarnInfo.warn) { /* 当超过阀值时,发出告警信息。 */
3854568cb3Sopenharmony_ci        /* 当超过阈值时,发出告警信息。 */
3954568cb3Sopenharmony_ci        if ((warn == FALSE) && (g_hookCb[OS_HOOK_CPUP_WARN].sigHook != NULL)) {
4054568cb3Sopenharmony_ci            warn = TRUE;
4154568cb3Sopenharmony_ci            warnInfo.type = CPUP_INFO_TYPE_OVERLOAD;
4254568cb3Sopenharmony_ci            OS_SHOOK_ACTIVATE_PARA1(OS_HOOK_CPUP_WARN, &warnInfo);
4354568cb3Sopenharmony_ci        }
4454568cb3Sopenharmony_ci    } else if (cpup < g_cpupWarnInfo.resume) {
4554568cb3Sopenharmony_ci        if (warn == TRUE) {
4654568cb3Sopenharmony_ci            warn = FALSE;
4754568cb3Sopenharmony_ci            if (g_hookCb[OS_HOOK_CPUP_WARN].sigHook != NULL) {
4854568cb3Sopenharmony_ci                warnInfo.type = CPUP_INFO_TYPE_RECONVERT;
4954568cb3Sopenharmony_ci                OS_SHOOK_ACTIVATE_PARA1(OS_HOOK_CPUP_WARN, &warnInfo);
5054568cb3Sopenharmony_ci            }
5154568cb3Sopenharmony_ci        }
5254568cb3Sopenharmony_ci    }
5354568cb3Sopenharmony_ci}
5454568cb3Sopenharmony_ci
5554568cb3Sopenharmony_ci/*
5654568cb3Sopenharmony_ci * 描述:告警门限和告警恢复门限的设置
5754568cb3Sopenharmony_ci */
5854568cb3Sopenharmony_ciOS_SEC_L4_TEXT U32 PRT_CpupSetWarnValue(U32 warn, U32 resume)
5954568cb3Sopenharmony_ci{
6054568cb3Sopenharmony_ci    uintptr_t intSave;
6154568cb3Sopenharmony_ci
6254568cb3Sopenharmony_ci    if (!OsCpupInitIsDone()) {
6354568cb3Sopenharmony_ci        return OS_ERRNO_CPUP_NOT_INITED;
6454568cb3Sopenharmony_ci    }
6554568cb3Sopenharmony_ci
6654568cb3Sopenharmony_ci    if ((UNI_FLAG & OS_FLG_BGD_ACTIVE) == 0) {
6754568cb3Sopenharmony_ci        return OS_ERRNO_CPUP_OS_NOT_STARTED;
6854568cb3Sopenharmony_ci    }
6954568cb3Sopenharmony_ci
7054568cb3Sopenharmony_ci    if (warn > CPUP_USE_RATE || warn == 0) {
7154568cb3Sopenharmony_ci        return OS_ERRNO_CPUP_INTERVAL_NOT_SUITED;
7254568cb3Sopenharmony_ci    }
7354568cb3Sopenharmony_ci
7454568cb3Sopenharmony_ci    if (resume >= warn) {
7554568cb3Sopenharmony_ci        return OS_ERRNO_CPUP_RESUME_NOT_SUITED;
7654568cb3Sopenharmony_ci    }
7754568cb3Sopenharmony_ci
7854568cb3Sopenharmony_ci    intSave = OsIntLock();
7954568cb3Sopenharmony_ci
8054568cb3Sopenharmony_ci    g_cpupWarnInfo.warn = warn;
8154568cb3Sopenharmony_ci    g_cpupWarnInfo.resume = resume;
8254568cb3Sopenharmony_ci
8354568cb3Sopenharmony_ci    OsIntRestore(intSave);
8454568cb3Sopenharmony_ci
8554568cb3Sopenharmony_ci    return OS_OK;
8654568cb3Sopenharmony_ci}
8754568cb3Sopenharmony_ci
8854568cb3Sopenharmony_ci/*
8954568cb3Sopenharmony_ci * 描述:查询告警阈值和告警恢复阈值
9054568cb3Sopenharmony_ci */
9154568cb3Sopenharmony_ciOS_SEC_L4_TEXT U32 PRT_CpupGetWarnValue(U32 *warn, U32 *resume)
9254568cb3Sopenharmony_ci{
9354568cb3Sopenharmony_ci    uintptr_t intSave;
9454568cb3Sopenharmony_ci
9554568cb3Sopenharmony_ci    if (!OsCpupInitIsDone()) {
9654568cb3Sopenharmony_ci        return OS_ERRNO_CPUP_NOT_INITED;
9754568cb3Sopenharmony_ci    }
9854568cb3Sopenharmony_ci
9954568cb3Sopenharmony_ci    if ((UNI_FLAG & OS_FLG_BGD_ACTIVE) == 0) {
10054568cb3Sopenharmony_ci        return OS_ERRNO_CPUP_OS_NOT_STARTED;
10154568cb3Sopenharmony_ci    }
10254568cb3Sopenharmony_ci
10354568cb3Sopenharmony_ci    if (warn == NULL || resume == NULL) {
10454568cb3Sopenharmony_ci        return OS_ERRNO_CPUP_PTR_NULL;
10554568cb3Sopenharmony_ci    }
10654568cb3Sopenharmony_ci
10754568cb3Sopenharmony_ci    intSave = OsIntLock();
10854568cb3Sopenharmony_ci
10954568cb3Sopenharmony_ci    *warn = g_cpupWarnInfo.warn;
11054568cb3Sopenharmony_ci    *resume = g_cpupWarnInfo.resume;
11154568cb3Sopenharmony_ci
11254568cb3Sopenharmony_ci    OsIntRestore(intSave);
11354568cb3Sopenharmony_ci
11454568cb3Sopenharmony_ci    return OS_OK;
11554568cb3Sopenharmony_ci}
11654568cb3Sopenharmony_ci
11754568cb3Sopenharmony_ci/*
11854568cb3Sopenharmony_ci * 描述:注册CPUP告警钩子函数
11954568cb3Sopenharmony_ci */
12054568cb3Sopenharmony_ciOS_SEC_L4_TEXT U32 PRT_CpupRegWarnHook(CpupHookFunc hook)
12154568cb3Sopenharmony_ci{
12254568cb3Sopenharmony_ci    return OsShookReg(OS_HOOK_CPUP_WARN, (OsVoidFunc)hook);
12354568cb3Sopenharmony_ci}
12454568cb3Sopenharmony_ci
12554568cb3Sopenharmony_ciOS_SEC_L4_TEXT U32 OsCpupWarnReg(struct CpupModInfo *modInfo)
12654568cb3Sopenharmony_ci{
12754568cb3Sopenharmony_ci    if (modInfo->warn == 0 || modInfo->warn > CPUP_USE_RATE) {
12854568cb3Sopenharmony_ci        return OS_ERRNO_CPUP_INTERVAL_NOT_SUITED;
12954568cb3Sopenharmony_ci    }
13054568cb3Sopenharmony_ci
13154568cb3Sopenharmony_ci    if (modInfo->resume >= modInfo->warn) {
13254568cb3Sopenharmony_ci        return OS_ERRNO_CPUP_RESUME_VALUE_ERROR;
13354568cb3Sopenharmony_ci    }
13454568cb3Sopenharmony_ci
13554568cb3Sopenharmony_ci    g_cpupWarnInfo.warn = modInfo->warn;
13654568cb3Sopenharmony_ci    g_cpupWarnInfo.resume = modInfo->resume;
13754568cb3Sopenharmony_ci
13854568cb3Sopenharmony_ci    return OS_OK;
13954568cb3Sopenharmony_ci}
140