10d163575Sopenharmony_ci/*
20d163575Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
30d163575Sopenharmony_ci * Copyright (c) 2020-2021 Huawei Device Co., Ltd. All rights reserved.
40d163575Sopenharmony_ci *
50d163575Sopenharmony_ci * Redistribution and use in source and binary forms, with or without modification,
60d163575Sopenharmony_ci * are permitted provided that the following conditions are met:
70d163575Sopenharmony_ci *
80d163575Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright notice, this list of
90d163575Sopenharmony_ci *    conditions and the following disclaimer.
100d163575Sopenharmony_ci *
110d163575Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright notice, this list
120d163575Sopenharmony_ci *    of conditions and the following disclaimer in the documentation and/or other materials
130d163575Sopenharmony_ci *    provided with the distribution.
140d163575Sopenharmony_ci *
150d163575Sopenharmony_ci * 3. Neither the name of the copyright holder nor the names of its contributors may be used
160d163575Sopenharmony_ci *    to endorse or promote products derived from this software without specific prior written
170d163575Sopenharmony_ci *    permission.
180d163575Sopenharmony_ci *
190d163575Sopenharmony_ci * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
200d163575Sopenharmony_ci * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
210d163575Sopenharmony_ci * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
220d163575Sopenharmony_ci * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
230d163575Sopenharmony_ci * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
240d163575Sopenharmony_ci * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
250d163575Sopenharmony_ci * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
260d163575Sopenharmony_ci * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
270d163575Sopenharmony_ci * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
280d163575Sopenharmony_ci * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
290d163575Sopenharmony_ci * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
300d163575Sopenharmony_ci */
310d163575Sopenharmony_ci
320d163575Sopenharmony_ci/*
330d163575Sopenharmony_ci   +-------------------------------------------------------+
340d163575Sopenharmony_ci   | Info |          log_space                             |
350d163575Sopenharmony_ci   +-------------------------------------------------------+
360d163575Sopenharmony_ci   |
370d163575Sopenharmony_ci   |__buffer_space
380d163575Sopenharmony_ci
390d163575Sopenharmony_ciCase A:
400d163575Sopenharmony_ci   +-------------------------------------------------------+
410d163575Sopenharmony_ci   |           |#############################|             |
420d163575Sopenharmony_ci   +-------------------------------------------------------+
430d163575Sopenharmony_ci               |                             |
440d163575Sopenharmony_ci              Head                           Tail
450d163575Sopenharmony_ciCase B:
460d163575Sopenharmony_ci   +-------------------------------------------------------+
470d163575Sopenharmony_ci   |##########|                                    |#######|
480d163575Sopenharmony_ci   +-------------------------------------------------------+
490d163575Sopenharmony_ci              |                                    |
500d163575Sopenharmony_ci              Tail                                 Head
510d163575Sopenharmony_ci*/
520d163575Sopenharmony_ci
530d163575Sopenharmony_ci#ifdef LOSCFG_SHELL_DMESG
540d163575Sopenharmony_ci#include "dmesg_pri.h"
550d163575Sopenharmony_ci#include "show.h"
560d163575Sopenharmony_ci#include "shcmd.h"
570d163575Sopenharmony_ci#include "securec.h"
580d163575Sopenharmony_ci#include "stdlib.h"
590d163575Sopenharmony_ci#include "unistd.h"
600d163575Sopenharmony_ci#include "los_init.h"
610d163575Sopenharmony_ci#include "los_task.h"
620d163575Sopenharmony_ci
630d163575Sopenharmony_ci
640d163575Sopenharmony_ci#define BUF_MAX_INDEX (g_logBufSize - 1)
650d163575Sopenharmony_ci
660d163575Sopenharmony_ciLITE_OS_SEC_BSS STATIC SPIN_LOCK_INIT(g_dmesgSpin);
670d163575Sopenharmony_ci
680d163575Sopenharmony_ciSTATIC DmesgInfo *g_dmesgInfo = NULL;
690d163575Sopenharmony_ciSTATIC UINT32 g_logBufSize = 0;
700d163575Sopenharmony_ciSTATIC VOID *g_mallocAddr = NULL;
710d163575Sopenharmony_ciSTATIC UINT32 g_dmesgLogLevel = 3;
720d163575Sopenharmony_ciSTATIC UINT32 g_consoleLock = 0;
730d163575Sopenharmony_ciSTATIC UINT32 g_uartLock = 0;
740d163575Sopenharmony_ciSTATIC const CHAR *g_levelString[] = {
750d163575Sopenharmony_ci    "EMG",
760d163575Sopenharmony_ci    "COMMON",
770d163575Sopenharmony_ci    "ERR",
780d163575Sopenharmony_ci    "WARN",
790d163575Sopenharmony_ci    "INFO",
800d163575Sopenharmony_ci    "DEBUG"
810d163575Sopenharmony_ci};
820d163575Sopenharmony_ci
830d163575Sopenharmony_ciSTATIC VOID OsLockConsole(VOID)
840d163575Sopenharmony_ci{
850d163575Sopenharmony_ci    g_consoleLock = 1;
860d163575Sopenharmony_ci}
870d163575Sopenharmony_ci
880d163575Sopenharmony_ciSTATIC VOID OsUnlockConsole(VOID)
890d163575Sopenharmony_ci{
900d163575Sopenharmony_ci    g_consoleLock = 0;
910d163575Sopenharmony_ci}
920d163575Sopenharmony_ci
930d163575Sopenharmony_ciSTATIC VOID OsLockUart(VOID)
940d163575Sopenharmony_ci{
950d163575Sopenharmony_ci    g_uartLock = 1;
960d163575Sopenharmony_ci}
970d163575Sopenharmony_ci
980d163575Sopenharmony_ciSTATIC VOID OsUnlockUart(VOID)
990d163575Sopenharmony_ci{
1000d163575Sopenharmony_ci    g_uartLock = 0;
1010d163575Sopenharmony_ci}
1020d163575Sopenharmony_ci
1030d163575Sopenharmony_ciSTATIC UINT32 OsCheckError(VOID)
1040d163575Sopenharmony_ci{
1050d163575Sopenharmony_ci    if (g_dmesgInfo == NULL) {
1060d163575Sopenharmony_ci        return LOS_NOK;
1070d163575Sopenharmony_ci    }
1080d163575Sopenharmony_ci
1090d163575Sopenharmony_ci    if (g_dmesgInfo->logSize > g_logBufSize) {
1100d163575Sopenharmony_ci        return LOS_NOK;
1110d163575Sopenharmony_ci    }
1120d163575Sopenharmony_ci
1130d163575Sopenharmony_ci    if (((g_dmesgInfo->logSize == g_logBufSize) || (g_dmesgInfo->logSize == 0)) &&
1140d163575Sopenharmony_ci        (g_dmesgInfo->logTail != g_dmesgInfo->logHead)) {
1150d163575Sopenharmony_ci        return LOS_NOK;
1160d163575Sopenharmony_ci    }
1170d163575Sopenharmony_ci
1180d163575Sopenharmony_ci    return LOS_OK;
1190d163575Sopenharmony_ci}
1200d163575Sopenharmony_ci
1210d163575Sopenharmony_ciSTATIC INT32 OsDmesgRead(CHAR *buf, UINT32 len)
1220d163575Sopenharmony_ci{
1230d163575Sopenharmony_ci    UINT32 readLen;
1240d163575Sopenharmony_ci    UINT32 logSize = g_dmesgInfo->logSize;
1250d163575Sopenharmony_ci    UINT32 head = g_dmesgInfo->logHead;
1260d163575Sopenharmony_ci    UINT32 tail = g_dmesgInfo->logTail;
1270d163575Sopenharmony_ci    CHAR *logBuf = g_dmesgInfo->logBuf;
1280d163575Sopenharmony_ci    errno_t ret;
1290d163575Sopenharmony_ci
1300d163575Sopenharmony_ci    if (OsCheckError()) {
1310d163575Sopenharmony_ci        return -1;
1320d163575Sopenharmony_ci    }
1330d163575Sopenharmony_ci    if (logSize == 0) {
1340d163575Sopenharmony_ci        return 0;
1350d163575Sopenharmony_ci    }
1360d163575Sopenharmony_ci
1370d163575Sopenharmony_ci    readLen = len < logSize ? len : logSize;
1380d163575Sopenharmony_ci
1390d163575Sopenharmony_ci    if (head < tail) { /* Case A */
1400d163575Sopenharmony_ci        ret = memcpy_s(buf, len, logBuf + head, readLen);
1410d163575Sopenharmony_ci        if (ret != EOK) {
1420d163575Sopenharmony_ci            return -1;
1430d163575Sopenharmony_ci        }
1440d163575Sopenharmony_ci        g_dmesgInfo->logHead += readLen;
1450d163575Sopenharmony_ci        g_dmesgInfo->logSize -= readLen;
1460d163575Sopenharmony_ci    } else { /* Case B */
1470d163575Sopenharmony_ci        if (readLen <= (g_logBufSize - head)) {
1480d163575Sopenharmony_ci            ret = memcpy_s(buf, len, logBuf + head, readLen);
1490d163575Sopenharmony_ci            if (ret != EOK) {
1500d163575Sopenharmony_ci                return -1;
1510d163575Sopenharmony_ci            }
1520d163575Sopenharmony_ci            g_dmesgInfo->logHead += readLen;
1530d163575Sopenharmony_ci            g_dmesgInfo->logSize -= readLen;
1540d163575Sopenharmony_ci        } else {
1550d163575Sopenharmony_ci            ret = memcpy_s(buf, len, logBuf + head, g_logBufSize - head);
1560d163575Sopenharmony_ci            if (ret != EOK) {
1570d163575Sopenharmony_ci                return -1;
1580d163575Sopenharmony_ci            }
1590d163575Sopenharmony_ci
1600d163575Sopenharmony_ci            ret = memcpy_s(buf + g_logBufSize - head, len - (g_logBufSize - head),
1610d163575Sopenharmony_ci                           logBuf, readLen - (g_logBufSize - head));
1620d163575Sopenharmony_ci            if (ret != EOK) {
1630d163575Sopenharmony_ci                return -1;
1640d163575Sopenharmony_ci            }
1650d163575Sopenharmony_ci            g_dmesgInfo->logHead = readLen - (g_logBufSize - head);
1660d163575Sopenharmony_ci            g_dmesgInfo->logSize -= readLen;
1670d163575Sopenharmony_ci        }
1680d163575Sopenharmony_ci    }
1690d163575Sopenharmony_ci    return (INT32)readLen;
1700d163575Sopenharmony_ci}
1710d163575Sopenharmony_ci
1720d163575Sopenharmony_ciSTATIC INT32 OsCopyToNew(const VOID *addr, UINT32 size)
1730d163575Sopenharmony_ci{
1740d163575Sopenharmony_ci    UINT32 copyStart = 0;
1750d163575Sopenharmony_ci    UINT32 copyLen;
1760d163575Sopenharmony_ci    CHAR *temp = NULL;
1770d163575Sopenharmony_ci    CHAR *newBuf = (CHAR *)addr + sizeof(DmesgInfo);
1780d163575Sopenharmony_ci    UINT32 bufSize = size - sizeof(DmesgInfo);
1790d163575Sopenharmony_ci    INT32 ret;
1800d163575Sopenharmony_ci    UINT32 intSave;
1810d163575Sopenharmony_ci
1820d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
1830d163575Sopenharmony_ci    if (g_dmesgInfo->logSize == 0) {
1840d163575Sopenharmony_ci        LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
1850d163575Sopenharmony_ci        return 0;
1860d163575Sopenharmony_ci    }
1870d163575Sopenharmony_ci
1880d163575Sopenharmony_ci    temp = (CHAR *)malloc(g_dmesgInfo->logSize);
1890d163575Sopenharmony_ci    if (temp == NULL) {
1900d163575Sopenharmony_ci        LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
1910d163575Sopenharmony_ci        return -1;
1920d163575Sopenharmony_ci    }
1930d163575Sopenharmony_ci
1940d163575Sopenharmony_ci    (VOID)memset_s(temp, g_dmesgInfo->logSize, 0, g_dmesgInfo->logSize);
1950d163575Sopenharmony_ci    copyLen = ((bufSize < g_dmesgInfo->logSize) ? bufSize : g_dmesgInfo->logSize);
1960d163575Sopenharmony_ci    if (bufSize < g_dmesgInfo->logSize) {
1970d163575Sopenharmony_ci        copyStart = g_dmesgInfo->logSize - bufSize;
1980d163575Sopenharmony_ci    }
1990d163575Sopenharmony_ci
2000d163575Sopenharmony_ci    ret = OsDmesgRead(temp, g_dmesgInfo->logSize);
2010d163575Sopenharmony_ci    if (ret <= 0) {
2020d163575Sopenharmony_ci        goto FREE_OUT;
2030d163575Sopenharmony_ci    }
2040d163575Sopenharmony_ci
2050d163575Sopenharmony_ci    /* if new buf size smaller than logSize */
2060d163575Sopenharmony_ci    ret = memcpy_s(newBuf, bufSize, temp + copyStart, copyLen);
2070d163575Sopenharmony_ci    if (ret != EOK) {
2080d163575Sopenharmony_ci        goto FREE_OUT;
2090d163575Sopenharmony_ci    }
2100d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
2110d163575Sopenharmony_ci    free(temp);
2120d163575Sopenharmony_ci
2130d163575Sopenharmony_ci    return (INT32)copyLen;
2140d163575Sopenharmony_ci
2150d163575Sopenharmony_ciFREE_OUT:
2160d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
2170d163575Sopenharmony_ci    PRINT_ERR("%s,%d failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
2180d163575Sopenharmony_ci    free(temp);
2190d163575Sopenharmony_ci    return -1;
2200d163575Sopenharmony_ci}
2210d163575Sopenharmony_ci
2220d163575Sopenharmony_ciSTATIC UINT32 OsDmesgResetMem(const VOID *addr, UINT32 size)
2230d163575Sopenharmony_ci{
2240d163575Sopenharmony_ci    VOID *temp = NULL;
2250d163575Sopenharmony_ci    INT32 copyLen;
2260d163575Sopenharmony_ci    UINT32 intSave;
2270d163575Sopenharmony_ci
2280d163575Sopenharmony_ci    if (size <= sizeof(DmesgInfo)) {
2290d163575Sopenharmony_ci        return LOS_NOK;
2300d163575Sopenharmony_ci    }
2310d163575Sopenharmony_ci
2320d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
2330d163575Sopenharmony_ci    temp = g_dmesgInfo;
2340d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
2350d163575Sopenharmony_ci    copyLen = OsCopyToNew(addr, size);
2360d163575Sopenharmony_ci    if (copyLen < 0) {
2370d163575Sopenharmony_ci        return LOS_NOK;
2380d163575Sopenharmony_ci    }
2390d163575Sopenharmony_ci
2400d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
2410d163575Sopenharmony_ci    g_logBufSize = size - sizeof(DmesgInfo);
2420d163575Sopenharmony_ci    g_dmesgInfo = (DmesgInfo *)addr;
2430d163575Sopenharmony_ci    g_dmesgInfo->logBuf = (CHAR *)addr + sizeof(DmesgInfo);
2440d163575Sopenharmony_ci    g_dmesgInfo->logSize = copyLen;
2450d163575Sopenharmony_ci    g_dmesgInfo->logTail = ((copyLen == g_logBufSize) ? 0 : copyLen);
2460d163575Sopenharmony_ci    g_dmesgInfo->logHead = 0;
2470d163575Sopenharmony_ci
2480d163575Sopenharmony_ci    /* if old mem came from malloc */
2490d163575Sopenharmony_ci    if (temp == g_mallocAddr) {
2500d163575Sopenharmony_ci        goto FREE_OUT;
2510d163575Sopenharmony_ci    }
2520d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
2530d163575Sopenharmony_ci
2540d163575Sopenharmony_ci    return LOS_OK;
2550d163575Sopenharmony_ci
2560d163575Sopenharmony_ciFREE_OUT:
2570d163575Sopenharmony_ci    g_mallocAddr = NULL;
2580d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
2590d163575Sopenharmony_ci    free(temp);
2600d163575Sopenharmony_ci    return LOS_OK;
2610d163575Sopenharmony_ci}
2620d163575Sopenharmony_ci
2630d163575Sopenharmony_ciSTATIC UINT32 OsDmesgChangeSize(UINT32 size)
2640d163575Sopenharmony_ci{
2650d163575Sopenharmony_ci    VOID *temp = NULL;
2660d163575Sopenharmony_ci    INT32 copyLen;
2670d163575Sopenharmony_ci    CHAR *newString = NULL;
2680d163575Sopenharmony_ci    UINT32 intSave;
2690d163575Sopenharmony_ci
2700d163575Sopenharmony_ci    if (size == 0) {
2710d163575Sopenharmony_ci        return LOS_NOK;
2720d163575Sopenharmony_ci    }
2730d163575Sopenharmony_ci
2740d163575Sopenharmony_ci    newString = (CHAR *)malloc(size + sizeof(DmesgInfo));
2750d163575Sopenharmony_ci    if (newString == NULL) {
2760d163575Sopenharmony_ci        return LOS_NOK;
2770d163575Sopenharmony_ci    }
2780d163575Sopenharmony_ci
2790d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
2800d163575Sopenharmony_ci    temp = g_dmesgInfo;
2810d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
2820d163575Sopenharmony_ci
2830d163575Sopenharmony_ci    copyLen = OsCopyToNew(newString, size + sizeof(DmesgInfo));
2840d163575Sopenharmony_ci    if (copyLen < 0) {
2850d163575Sopenharmony_ci        goto ERR_OUT;
2860d163575Sopenharmony_ci    }
2870d163575Sopenharmony_ci
2880d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
2890d163575Sopenharmony_ci    g_logBufSize = size;
2900d163575Sopenharmony_ci    g_dmesgInfo = (DmesgInfo *)newString;
2910d163575Sopenharmony_ci    g_dmesgInfo->logBuf = (CHAR *)newString + sizeof(DmesgInfo);
2920d163575Sopenharmony_ci    g_dmesgInfo->logSize = copyLen;
2930d163575Sopenharmony_ci    g_dmesgInfo->logTail = ((copyLen == g_logBufSize) ? 0 : copyLen);
2940d163575Sopenharmony_ci    g_dmesgInfo->logHead = 0;
2950d163575Sopenharmony_ci
2960d163575Sopenharmony_ci    if (temp == g_mallocAddr) {
2970d163575Sopenharmony_ci        goto FREE_OUT;
2980d163575Sopenharmony_ci    }
2990d163575Sopenharmony_ci    g_mallocAddr = newString;
3000d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
3010d163575Sopenharmony_ci
3020d163575Sopenharmony_ci    return LOS_OK;
3030d163575Sopenharmony_ci
3040d163575Sopenharmony_ciERR_OUT:
3050d163575Sopenharmony_ci    free(newString);
3060d163575Sopenharmony_ci    return LOS_NOK;
3070d163575Sopenharmony_ciFREE_OUT:
3080d163575Sopenharmony_ci    g_mallocAddr = newString;
3090d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
3100d163575Sopenharmony_ci    free(temp);
3110d163575Sopenharmony_ci    return LOS_OK;
3120d163575Sopenharmony_ci}
3130d163575Sopenharmony_ci
3140d163575Sopenharmony_ciUINT32 OsCheckConsoleLock(VOID)
3150d163575Sopenharmony_ci{
3160d163575Sopenharmony_ci    return g_consoleLock;
3170d163575Sopenharmony_ci}
3180d163575Sopenharmony_ci
3190d163575Sopenharmony_ciUINT32 OsCheckUartLock(VOID)
3200d163575Sopenharmony_ci{
3210d163575Sopenharmony_ci    return g_uartLock;
3220d163575Sopenharmony_ci}
3230d163575Sopenharmony_ci
3240d163575Sopenharmony_ciUINT32 OsDmesgInit(VOID)
3250d163575Sopenharmony_ci{
3260d163575Sopenharmony_ci    CHAR* buffer = NULL;
3270d163575Sopenharmony_ci
3280d163575Sopenharmony_ci    buffer = (CHAR *)malloc(KERNEL_LOG_BUF_SIZE + sizeof(DmesgInfo));
3290d163575Sopenharmony_ci    if (buffer == NULL) {
3300d163575Sopenharmony_ci        return LOS_NOK;
3310d163575Sopenharmony_ci    }
3320d163575Sopenharmony_ci    g_mallocAddr = buffer;
3330d163575Sopenharmony_ci    g_dmesgInfo = (DmesgInfo *)buffer;
3340d163575Sopenharmony_ci    g_dmesgInfo->logHead = 0;
3350d163575Sopenharmony_ci    g_dmesgInfo->logTail = 0;
3360d163575Sopenharmony_ci    g_dmesgInfo->logSize = 0;
3370d163575Sopenharmony_ci    g_dmesgInfo->logBuf = buffer + sizeof(DmesgInfo);
3380d163575Sopenharmony_ci    g_logBufSize = KERNEL_LOG_BUF_SIZE;
3390d163575Sopenharmony_ci
3400d163575Sopenharmony_ci    return LOS_OK;
3410d163575Sopenharmony_ci}
3420d163575Sopenharmony_ci
3430d163575Sopenharmony_ciSTATIC CHAR OsLogRecordChar(CHAR c)
3440d163575Sopenharmony_ci{
3450d163575Sopenharmony_ci    *(g_dmesgInfo->logBuf + g_dmesgInfo->logTail++) = c;
3460d163575Sopenharmony_ci
3470d163575Sopenharmony_ci    if (g_dmesgInfo->logTail > BUF_MAX_INDEX) {
3480d163575Sopenharmony_ci        g_dmesgInfo->logTail = 0;
3490d163575Sopenharmony_ci    }
3500d163575Sopenharmony_ci
3510d163575Sopenharmony_ci    if (g_dmesgInfo->logSize < g_logBufSize) {
3520d163575Sopenharmony_ci        (g_dmesgInfo->logSize)++;
3530d163575Sopenharmony_ci    } else {
3540d163575Sopenharmony_ci        g_dmesgInfo->logHead = g_dmesgInfo->logTail;
3550d163575Sopenharmony_ci    }
3560d163575Sopenharmony_ci    return c;
3570d163575Sopenharmony_ci}
3580d163575Sopenharmony_ci
3590d163575Sopenharmony_ciUINT32 OsLogRecordStr(const CHAR *str, UINT32 len)
3600d163575Sopenharmony_ci{
3610d163575Sopenharmony_ci    UINT32 i = 0;
3620d163575Sopenharmony_ci    UINTPTR intSave;
3630d163575Sopenharmony_ci
3640d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
3650d163575Sopenharmony_ci    while (len--) {
3660d163575Sopenharmony_ci        (VOID)OsLogRecordChar(str[i]);
3670d163575Sopenharmony_ci        i++;
3680d163575Sopenharmony_ci    }
3690d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
3700d163575Sopenharmony_ci    return i;
3710d163575Sopenharmony_ci}
3720d163575Sopenharmony_ci
3730d163575Sopenharmony_ciSTATIC VOID OsBufFullWrite(const CHAR *dst, UINT32 logLen)
3740d163575Sopenharmony_ci{
3750d163575Sopenharmony_ci    UINT32 bufSize = g_logBufSize;
3760d163575Sopenharmony_ci    UINT32 tail = g_dmesgInfo->logTail;
3770d163575Sopenharmony_ci    CHAR *buf = g_dmesgInfo->logBuf;
3780d163575Sopenharmony_ci    errno_t ret;
3790d163575Sopenharmony_ci
3800d163575Sopenharmony_ci    if (!logLen || (dst == NULL)) {
3810d163575Sopenharmony_ci        return;
3820d163575Sopenharmony_ci    }
3830d163575Sopenharmony_ci    if (logLen > bufSize) { /* full re-write */
3840d163575Sopenharmony_ci        ret = memcpy_s(buf + tail, bufSize - tail, dst, bufSize - tail);
3850d163575Sopenharmony_ci        if (ret != EOK) {
3860d163575Sopenharmony_ci            PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
3870d163575Sopenharmony_ci            return;
3880d163575Sopenharmony_ci        }
3890d163575Sopenharmony_ci        ret = memcpy_s(buf, bufSize, dst + bufSize - tail, tail);
3900d163575Sopenharmony_ci        if (ret != EOK) {
3910d163575Sopenharmony_ci            PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
3920d163575Sopenharmony_ci            return;
3930d163575Sopenharmony_ci        }
3940d163575Sopenharmony_ci
3950d163575Sopenharmony_ci        OsBufFullWrite(dst + bufSize, logLen - bufSize);
3960d163575Sopenharmony_ci    } else {
3970d163575Sopenharmony_ci        if (logLen > (bufSize - tail)) { /* need cycle back to start */
3980d163575Sopenharmony_ci            ret = memcpy_s(buf + tail, bufSize - tail, dst, bufSize - tail);
3990d163575Sopenharmony_ci            if (ret != EOK) {
4000d163575Sopenharmony_ci                PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
4010d163575Sopenharmony_ci                return;
4020d163575Sopenharmony_ci            }
4030d163575Sopenharmony_ci            ret = memcpy_s(buf, bufSize, dst + bufSize - tail, logLen - (bufSize - tail));
4040d163575Sopenharmony_ci            if (ret != EOK) {
4050d163575Sopenharmony_ci                PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
4060d163575Sopenharmony_ci                return;
4070d163575Sopenharmony_ci            }
4080d163575Sopenharmony_ci
4090d163575Sopenharmony_ci            g_dmesgInfo->logTail = logLen - (bufSize - tail);
4100d163575Sopenharmony_ci            g_dmesgInfo->logHead = g_dmesgInfo->logTail;
4110d163575Sopenharmony_ci        } else { /* no need cycle back to start */
4120d163575Sopenharmony_ci            ret = memcpy_s(buf + tail, bufSize - tail, dst, logLen);
4130d163575Sopenharmony_ci            if (ret != EOK) {
4140d163575Sopenharmony_ci                PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
4150d163575Sopenharmony_ci                return;
4160d163575Sopenharmony_ci            }
4170d163575Sopenharmony_ci            g_dmesgInfo->logTail += logLen;
4180d163575Sopenharmony_ci            if (g_dmesgInfo->logTail > BUF_MAX_INDEX) {
4190d163575Sopenharmony_ci                g_dmesgInfo->logTail = 0;
4200d163575Sopenharmony_ci            }
4210d163575Sopenharmony_ci            g_dmesgInfo->logHead = g_dmesgInfo->logTail;
4220d163575Sopenharmony_ci        }
4230d163575Sopenharmony_ci    }
4240d163575Sopenharmony_ci}
4250d163575Sopenharmony_ci
4260d163575Sopenharmony_ciSTATIC VOID OsWriteTailToHead(const CHAR *dst, UINT32 logLen)
4270d163575Sopenharmony_ci{
4280d163575Sopenharmony_ci    UINT32 writeLen;
4290d163575Sopenharmony_ci    UINT32 bufSize = g_logBufSize;
4300d163575Sopenharmony_ci    UINT32 logSize = g_dmesgInfo->logSize;
4310d163575Sopenharmony_ci    UINT32 tail = g_dmesgInfo->logTail;
4320d163575Sopenharmony_ci    CHAR *buf = g_dmesgInfo->logBuf;
4330d163575Sopenharmony_ci    errno_t ret;
4340d163575Sopenharmony_ci
4350d163575Sopenharmony_ci    if ((!logLen) || (dst == NULL)) {
4360d163575Sopenharmony_ci        return;
4370d163575Sopenharmony_ci    }
4380d163575Sopenharmony_ci    if (logLen > (bufSize - logSize)) { /* space-need > space-remain */
4390d163575Sopenharmony_ci        writeLen = bufSize - logSize;
4400d163575Sopenharmony_ci        ret = memcpy_s(buf + tail, bufSize - tail, dst, writeLen);
4410d163575Sopenharmony_ci        if (ret != EOK) {
4420d163575Sopenharmony_ci            PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
4430d163575Sopenharmony_ci            return;
4440d163575Sopenharmony_ci        }
4450d163575Sopenharmony_ci
4460d163575Sopenharmony_ci        g_dmesgInfo->logTail = g_dmesgInfo->logHead;
4470d163575Sopenharmony_ci        g_dmesgInfo->logSize = g_logBufSize;
4480d163575Sopenharmony_ci        OsBufFullWrite(dst + writeLen, logLen - writeLen);
4490d163575Sopenharmony_ci    } else {
4500d163575Sopenharmony_ci        ret = memcpy_s(buf + tail, bufSize - tail, dst, logLen);
4510d163575Sopenharmony_ci        if (ret != EOK) {
4520d163575Sopenharmony_ci            PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
4530d163575Sopenharmony_ci            return;
4540d163575Sopenharmony_ci        }
4550d163575Sopenharmony_ci
4560d163575Sopenharmony_ci        g_dmesgInfo->logTail += logLen;
4570d163575Sopenharmony_ci        g_dmesgInfo->logSize += logLen;
4580d163575Sopenharmony_ci    }
4590d163575Sopenharmony_ci}
4600d163575Sopenharmony_ci
4610d163575Sopenharmony_ciSTATIC VOID OsWriteTailToEnd(const CHAR *dst, UINT32 logLen)
4620d163575Sopenharmony_ci{
4630d163575Sopenharmony_ci    UINT32 writeLen;
4640d163575Sopenharmony_ci    UINT32 bufSize = g_logBufSize;
4650d163575Sopenharmony_ci    UINT32 tail = g_dmesgInfo->logTail;
4660d163575Sopenharmony_ci    CHAR *buf = g_dmesgInfo->logBuf;
4670d163575Sopenharmony_ci    errno_t ret;
4680d163575Sopenharmony_ci
4690d163575Sopenharmony_ci    if ((!logLen) || (dst == NULL)) {
4700d163575Sopenharmony_ci        return;
4710d163575Sopenharmony_ci    }
4720d163575Sopenharmony_ci    if (logLen >= (bufSize - tail)) { /* need cycle to start ,then became B */
4730d163575Sopenharmony_ci        writeLen = bufSize - tail;
4740d163575Sopenharmony_ci        ret = memcpy_s(buf + tail, writeLen, dst, writeLen);
4750d163575Sopenharmony_ci        if (ret != EOK) {
4760d163575Sopenharmony_ci            PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
4770d163575Sopenharmony_ci            return;
4780d163575Sopenharmony_ci        }
4790d163575Sopenharmony_ci
4800d163575Sopenharmony_ci        g_dmesgInfo->logSize += writeLen;
4810d163575Sopenharmony_ci        g_dmesgInfo->logTail = 0;
4820d163575Sopenharmony_ci        if (g_dmesgInfo->logSize == g_logBufSize) { /* Tail = Head is 0 */
4830d163575Sopenharmony_ci            OsBufFullWrite(dst + writeLen, logLen - writeLen);
4840d163575Sopenharmony_ci        } else {
4850d163575Sopenharmony_ci            OsWriteTailToHead(dst + writeLen, logLen - writeLen);
4860d163575Sopenharmony_ci        }
4870d163575Sopenharmony_ci    } else { /* just do serial copy */
4880d163575Sopenharmony_ci        ret = memcpy_s(buf + tail, bufSize - tail, dst, logLen);
4890d163575Sopenharmony_ci        if (ret != EOK) {
4900d163575Sopenharmony_ci            PRINT_ERR("%s,%d memcpy_s failed, err:%d!\n", __FUNCTION__, __LINE__, ret);
4910d163575Sopenharmony_ci            return;
4920d163575Sopenharmony_ci        }
4930d163575Sopenharmony_ci
4940d163575Sopenharmony_ci        g_dmesgInfo->logTail += logLen;
4950d163575Sopenharmony_ci        g_dmesgInfo->logSize += logLen;
4960d163575Sopenharmony_ci    }
4970d163575Sopenharmony_ci}
4980d163575Sopenharmony_ci
4990d163575Sopenharmony_ciINT32 OsLogMemcpyRecord(const CHAR *buf, UINT32 logLen)
5000d163575Sopenharmony_ci{
5010d163575Sopenharmony_ci    UINT32 intSave;
5020d163575Sopenharmony_ci
5030d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
5040d163575Sopenharmony_ci    if (OsCheckError()) {
5050d163575Sopenharmony_ci        LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
5060d163575Sopenharmony_ci        return -1;
5070d163575Sopenharmony_ci    }
5080d163575Sopenharmony_ci    if (g_dmesgInfo->logSize < g_logBufSize) {
5090d163575Sopenharmony_ci        if (g_dmesgInfo->logHead <= g_dmesgInfo->logTail) {
5100d163575Sopenharmony_ci            OsWriteTailToEnd(buf, logLen);
5110d163575Sopenharmony_ci        } else {
5120d163575Sopenharmony_ci            OsWriteTailToHead(buf, logLen);
5130d163575Sopenharmony_ci        }
5140d163575Sopenharmony_ci    } else {
5150d163575Sopenharmony_ci        OsBufFullWrite(buf, logLen);
5160d163575Sopenharmony_ci    }
5170d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
5180d163575Sopenharmony_ci
5190d163575Sopenharmony_ci    return LOS_OK;
5200d163575Sopenharmony_ci}
5210d163575Sopenharmony_ci
5220d163575Sopenharmony_ciVOID OsLogShow(VOID)
5230d163575Sopenharmony_ci{
5240d163575Sopenharmony_ci    UINT32 intSave;
5250d163575Sopenharmony_ci    UINT32 index;
5260d163575Sopenharmony_ci    UINT32 i = 0;
5270d163575Sopenharmony_ci    CHAR *p = NULL;
5280d163575Sopenharmony_ci
5290d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
5300d163575Sopenharmony_ci    index = g_dmesgInfo->logHead;
5310d163575Sopenharmony_ci
5320d163575Sopenharmony_ci    p = (CHAR *)malloc(g_dmesgInfo->logSize + 1);
5330d163575Sopenharmony_ci    if (p == NULL) {
5340d163575Sopenharmony_ci        LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
5350d163575Sopenharmony_ci        return;
5360d163575Sopenharmony_ci    }
5370d163575Sopenharmony_ci    (VOID)memset_s(p, g_dmesgInfo->logSize + 1, 0, g_dmesgInfo->logSize + 1);
5380d163575Sopenharmony_ci
5390d163575Sopenharmony_ci    while (i < g_dmesgInfo->logSize) {
5400d163575Sopenharmony_ci        *(p + i) = *(g_dmesgInfo->logBuf + index++);
5410d163575Sopenharmony_ci        if (index > BUF_MAX_INDEX) {
5420d163575Sopenharmony_ci            index = 0;
5430d163575Sopenharmony_ci        }
5440d163575Sopenharmony_ci        i++;
5450d163575Sopenharmony_ci        if (index == g_dmesgInfo->logTail) {
5460d163575Sopenharmony_ci            break;
5470d163575Sopenharmony_ci        }
5480d163575Sopenharmony_ci    }
5490d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
5500d163575Sopenharmony_ci    UartPuts(p, i, UART_WITH_LOCK);
5510d163575Sopenharmony_ci    free(p);
5520d163575Sopenharmony_ci}
5530d163575Sopenharmony_ci
5540d163575Sopenharmony_ciSTATIC INT32 OsDmesgLvSet(const CHAR *level)
5550d163575Sopenharmony_ci{
5560d163575Sopenharmony_ci    UINT32 levelNum, ret;
5570d163575Sopenharmony_ci    CHAR *p = NULL;
5580d163575Sopenharmony_ci
5590d163575Sopenharmony_ci    levelNum = strtoul(level, &p, 0);
5600d163575Sopenharmony_ci    if (*p != 0) {
5610d163575Sopenharmony_ci        PRINTK("dmesg: invalid option or parameter.\n");
5620d163575Sopenharmony_ci        return -1;
5630d163575Sopenharmony_ci    }
5640d163575Sopenharmony_ci
5650d163575Sopenharmony_ci    ret = LOS_DmesgLvSet(levelNum);
5660d163575Sopenharmony_ci    if (ret == LOS_OK) {
5670d163575Sopenharmony_ci        PRINTK("Set current dmesg log level %s\n", g_levelString[g_dmesgLogLevel]);
5680d163575Sopenharmony_ci        return LOS_OK;
5690d163575Sopenharmony_ci    } else {
5700d163575Sopenharmony_ci        PRINTK("current dmesg log level %s\n", g_levelString[g_dmesgLogLevel]);
5710d163575Sopenharmony_ci        PRINTK("dmesg -l [num] can access as 0:EMG 1:COMMON 2:ERROR 3:WARN 4:INFO 5:DEBUG\n");
5720d163575Sopenharmony_ci        return -1;
5730d163575Sopenharmony_ci    }
5740d163575Sopenharmony_ci}
5750d163575Sopenharmony_ci
5760d163575Sopenharmony_ciSTATIC INT32 OsDmesgMemSizeSet(const CHAR *size)
5770d163575Sopenharmony_ci{
5780d163575Sopenharmony_ci    UINT32 sizeVal;
5790d163575Sopenharmony_ci    CHAR *p = NULL;
5800d163575Sopenharmony_ci
5810d163575Sopenharmony_ci    sizeVal = strtoul(size, &p, 0);
5820d163575Sopenharmony_ci    if (sizeVal > MAX_KERNEL_LOG_BUF_SIZE) {
5830d163575Sopenharmony_ci        goto ERR_OUT;
5840d163575Sopenharmony_ci    }
5850d163575Sopenharmony_ci
5860d163575Sopenharmony_ci    if (!(LOS_DmesgMemSet(NULL, sizeVal))) {
5870d163575Sopenharmony_ci        PRINTK("Set dmesg buf size %u success\n", sizeVal);
5880d163575Sopenharmony_ci        return LOS_OK;
5890d163575Sopenharmony_ci    } else {
5900d163575Sopenharmony_ci        goto ERR_OUT;
5910d163575Sopenharmony_ci    }
5920d163575Sopenharmony_ci
5930d163575Sopenharmony_ciERR_OUT:
5940d163575Sopenharmony_ci    PRINTK("Set dmesg buf size %u fail\n", sizeVal);
5950d163575Sopenharmony_ci    return LOS_NOK;
5960d163575Sopenharmony_ci}
5970d163575Sopenharmony_ciUINT32 OsDmesgLvGet(VOID)
5980d163575Sopenharmony_ci{
5990d163575Sopenharmony_ci    return g_dmesgLogLevel;
6000d163575Sopenharmony_ci}
6010d163575Sopenharmony_ci
6020d163575Sopenharmony_ciUINT32 LOS_DmesgLvSet(UINT32 level)
6030d163575Sopenharmony_ci{
6040d163575Sopenharmony_ci    if (level > 5) { /* 5: count of level */
6050d163575Sopenharmony_ci        return LOS_NOK;
6060d163575Sopenharmony_ci    }
6070d163575Sopenharmony_ci
6080d163575Sopenharmony_ci    g_dmesgLogLevel = level;
6090d163575Sopenharmony_ci    return LOS_OK;
6100d163575Sopenharmony_ci}
6110d163575Sopenharmony_ci
6120d163575Sopenharmony_ciVOID LOS_DmesgClear(VOID)
6130d163575Sopenharmony_ci{
6140d163575Sopenharmony_ci    UINT32 intSave;
6150d163575Sopenharmony_ci
6160d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
6170d163575Sopenharmony_ci    (VOID)memset_s(g_dmesgInfo->logBuf, g_logBufSize, 0, g_logBufSize);
6180d163575Sopenharmony_ci    g_dmesgInfo->logHead = 0;
6190d163575Sopenharmony_ci    g_dmesgInfo->logTail = 0;
6200d163575Sopenharmony_ci    g_dmesgInfo->logSize = 0;
6210d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
6220d163575Sopenharmony_ci}
6230d163575Sopenharmony_ci
6240d163575Sopenharmony_ciUINT32 LOS_DmesgMemSet(const VOID *addr, UINT32 size)
6250d163575Sopenharmony_ci{
6260d163575Sopenharmony_ci    UINT32 ret = 0;
6270d163575Sopenharmony_ci
6280d163575Sopenharmony_ci    if (addr == NULL) {
6290d163575Sopenharmony_ci        ret = OsDmesgChangeSize(size);
6300d163575Sopenharmony_ci    } else {
6310d163575Sopenharmony_ci        ret = OsDmesgResetMem(addr, size);
6320d163575Sopenharmony_ci    }
6330d163575Sopenharmony_ci    return ret;
6340d163575Sopenharmony_ci}
6350d163575Sopenharmony_ci
6360d163575Sopenharmony_ciINT32 LOS_DmesgRead(CHAR *buf, UINT32 len)
6370d163575Sopenharmony_ci{
6380d163575Sopenharmony_ci    INT32 ret;
6390d163575Sopenharmony_ci    UINT32 intSave;
6400d163575Sopenharmony_ci
6410d163575Sopenharmony_ci    if (buf == NULL) {
6420d163575Sopenharmony_ci        return -1;
6430d163575Sopenharmony_ci    }
6440d163575Sopenharmony_ci    if (len == 0) {
6450d163575Sopenharmony_ci        return 0;
6460d163575Sopenharmony_ci    }
6470d163575Sopenharmony_ci
6480d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
6490d163575Sopenharmony_ci    ret = OsDmesgRead(buf, len);
6500d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
6510d163575Sopenharmony_ci    return ret;
6520d163575Sopenharmony_ci}
6530d163575Sopenharmony_ci
6540d163575Sopenharmony_ciINT32 OsDmesgWrite2File(const CHAR *fullpath, const CHAR *buf, UINT32 logSize)
6550d163575Sopenharmony_ci{
6560d163575Sopenharmony_ci    INT32 ret;
6570d163575Sopenharmony_ci
6580d163575Sopenharmony_ci    INT32 fd = open(fullpath, O_CREAT | O_RDWR | O_APPEND, 0644); /* 0644:file right */
6590d163575Sopenharmony_ci    if (fd < 0) {
6600d163575Sopenharmony_ci        return -1;
6610d163575Sopenharmony_ci    }
6620d163575Sopenharmony_ci    ret = write(fd, buf, logSize);
6630d163575Sopenharmony_ci    (VOID)close(fd);
6640d163575Sopenharmony_ci    return ret;
6650d163575Sopenharmony_ci}
6660d163575Sopenharmony_ci
6670d163575Sopenharmony_ci#ifdef LOSCFG_FS_VFS
6680d163575Sopenharmony_ciINT32 LOS_DmesgToFile(const CHAR *filename)
6690d163575Sopenharmony_ci{
6700d163575Sopenharmony_ci    CHAR *fullpath = NULL;
6710d163575Sopenharmony_ci    CHAR *buf = NULL;
6720d163575Sopenharmony_ci    INT32 ret;
6730d163575Sopenharmony_ci    CHAR *shellWorkingDirectory = OsShellGetWorkingDirectory();
6740d163575Sopenharmony_ci    UINT32 logSize, bufSize, head, tail, intSave;
6750d163575Sopenharmony_ci    CHAR *logBuf = NULL;
6760d163575Sopenharmony_ci
6770d163575Sopenharmony_ci    LOS_SpinLockSave(&g_dmesgSpin, &intSave);
6780d163575Sopenharmony_ci    if (OsCheckError()) {
6790d163575Sopenharmony_ci        LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
6800d163575Sopenharmony_ci        return -1;
6810d163575Sopenharmony_ci    }
6820d163575Sopenharmony_ci    logSize = g_dmesgInfo->logSize;
6830d163575Sopenharmony_ci    bufSize = g_logBufSize;
6840d163575Sopenharmony_ci    head = g_dmesgInfo->logHead;
6850d163575Sopenharmony_ci    tail = g_dmesgInfo->logTail;
6860d163575Sopenharmony_ci    logBuf = g_dmesgInfo->logBuf;
6870d163575Sopenharmony_ci    LOS_SpinUnlockRestore(&g_dmesgSpin, intSave);
6880d163575Sopenharmony_ci
6890d163575Sopenharmony_ci    ret = vfs_normalize_path(shellWorkingDirectory, filename, &fullpath);
6900d163575Sopenharmony_ci    if (ret != 0) {
6910d163575Sopenharmony_ci        return -1;
6920d163575Sopenharmony_ci    }
6930d163575Sopenharmony_ci
6940d163575Sopenharmony_ci    buf = (CHAR *)malloc(logSize);
6950d163575Sopenharmony_ci    if (buf == NULL) {
6960d163575Sopenharmony_ci        goto ERR_OUT2;
6970d163575Sopenharmony_ci    }
6980d163575Sopenharmony_ci
6990d163575Sopenharmony_ci    if (head < tail) {
7000d163575Sopenharmony_ci        ret = memcpy_s(buf, logSize, logBuf + head, logSize);
7010d163575Sopenharmony_ci        if (ret != EOK) {
7020d163575Sopenharmony_ci            goto ERR_OUT3;
7030d163575Sopenharmony_ci        }
7040d163575Sopenharmony_ci    } else {
7050d163575Sopenharmony_ci        ret = memcpy_s(buf, logSize, logBuf + head, bufSize - head);
7060d163575Sopenharmony_ci        if (ret != EOK) {
7070d163575Sopenharmony_ci            goto ERR_OUT3;
7080d163575Sopenharmony_ci        }
7090d163575Sopenharmony_ci        ret = memcpy_s(buf + bufSize - head, logSize - (bufSize - head), logBuf, tail);
7100d163575Sopenharmony_ci        if (ret != EOK) {
7110d163575Sopenharmony_ci            goto ERR_OUT3;
7120d163575Sopenharmony_ci        }
7130d163575Sopenharmony_ci    }
7140d163575Sopenharmony_ci
7150d163575Sopenharmony_ci    ret = OsDmesgWrite2File(fullpath, buf, logSize);
7160d163575Sopenharmony_ciERR_OUT3:
7170d163575Sopenharmony_ci    free(buf);
7180d163575Sopenharmony_ciERR_OUT2:
7190d163575Sopenharmony_ci    free(fullpath);
7200d163575Sopenharmony_ci    return ret;
7210d163575Sopenharmony_ci}
7220d163575Sopenharmony_ci#else
7230d163575Sopenharmony_ciINT32 LOS_DmesgToFile(CHAR *filename)
7240d163575Sopenharmony_ci{
7250d163575Sopenharmony_ci    (VOID)filename;
7260d163575Sopenharmony_ci    PRINTK("File operation need VFS\n");
7270d163575Sopenharmony_ci    return -1;
7280d163575Sopenharmony_ci}
7290d163575Sopenharmony_ci#endif
7300d163575Sopenharmony_ci
7310d163575Sopenharmony_ci
7320d163575Sopenharmony_ciINT32 OsShellCmdDmesg(INT32 argc, const CHAR **argv)
7330d163575Sopenharmony_ci{
7340d163575Sopenharmony_ci    if (argc == 1) {
7350d163575Sopenharmony_ci        PRINTK("\n");
7360d163575Sopenharmony_ci        OsLogShow();
7370d163575Sopenharmony_ci        return LOS_OK;
7380d163575Sopenharmony_ci    } else if (argc == 2) { /* 2: count of parameters */
7390d163575Sopenharmony_ci        if (argv == NULL) {
7400d163575Sopenharmony_ci            goto ERR_OUT;
7410d163575Sopenharmony_ci        }
7420d163575Sopenharmony_ci
7430d163575Sopenharmony_ci        if (!strcmp(argv[1], "-c")) {
7440d163575Sopenharmony_ci            PRINTK("\n");
7450d163575Sopenharmony_ci            OsLogShow();
7460d163575Sopenharmony_ci            LOS_DmesgClear();
7470d163575Sopenharmony_ci            return LOS_OK;
7480d163575Sopenharmony_ci        } else if (!strcmp(argv[1], "-C")) {
7490d163575Sopenharmony_ci            LOS_DmesgClear();
7500d163575Sopenharmony_ci            return LOS_OK;
7510d163575Sopenharmony_ci        } else if (!strcmp(argv[1], "-D")) {
7520d163575Sopenharmony_ci            OsLockConsole();
7530d163575Sopenharmony_ci            return LOS_OK;
7540d163575Sopenharmony_ci        } else if (!strcmp(argv[1], "-E")) {
7550d163575Sopenharmony_ci            OsUnlockConsole();
7560d163575Sopenharmony_ci            return LOS_OK;
7570d163575Sopenharmony_ci        } else if (!strcmp(argv[1], "-L")) {
7580d163575Sopenharmony_ci            OsLockUart();
7590d163575Sopenharmony_ci            return LOS_OK;
7600d163575Sopenharmony_ci        } else if (!strcmp(argv[1], "-U")) {
7610d163575Sopenharmony_ci            OsUnlockUart();
7620d163575Sopenharmony_ci            return LOS_OK;
7630d163575Sopenharmony_ci        }
7640d163575Sopenharmony_ci    } else if (argc == 3) { /* 3: count of parameters */
7650d163575Sopenharmony_ci        if (argv == NULL) {
7660d163575Sopenharmony_ci            goto ERR_OUT;
7670d163575Sopenharmony_ci        }
7680d163575Sopenharmony_ci
7690d163575Sopenharmony_ci        if (!strcmp(argv[1], ">")) {
7700d163575Sopenharmony_ci            if (LOS_DmesgToFile((CHAR *)argv[2]) < 0) { /* 2:index of parameters */
7710d163575Sopenharmony_ci                PRINTK("Dmesg write log to %s fail \n", argv[2]); /* 2:index of parameters */
7720d163575Sopenharmony_ci                return -1;
7730d163575Sopenharmony_ci            } else {
7740d163575Sopenharmony_ci                PRINTK("Dmesg write log to %s success \n", argv[2]); /* 2:index of parameters */
7750d163575Sopenharmony_ci                return LOS_OK;
7760d163575Sopenharmony_ci            }
7770d163575Sopenharmony_ci        } else if (!strcmp(argv[1], "-l")) {
7780d163575Sopenharmony_ci            return OsDmesgLvSet(argv[2]); /* 2:index of parameters */
7790d163575Sopenharmony_ci        } else if (!strcmp(argv[1], "-s")) {
7800d163575Sopenharmony_ci            return OsDmesgMemSizeSet(argv[2]); /* 2:index of parameters */
7810d163575Sopenharmony_ci        }
7820d163575Sopenharmony_ci    }
7830d163575Sopenharmony_ci
7840d163575Sopenharmony_ciERR_OUT:
7850d163575Sopenharmony_ci    PRINTK("dmesg: invalid option or parameter.\n");
7860d163575Sopenharmony_ci    return -1;
7870d163575Sopenharmony_ci}
7880d163575Sopenharmony_ci
7890d163575Sopenharmony_ciSHELLCMD_ENTRY(dmesg_shellcmd, CMD_TYPE_STD, "dmesg", XARGS, (CmdCallBackFunc)OsShellCmdDmesg);
7900d163575Sopenharmony_ciLOS_MODULE_INIT(OsDmesgInit, LOS_INIT_LEVEL_EARLIEST);
7910d163575Sopenharmony_ci
7920d163575Sopenharmony_ci#endif
793