10d163575Sopenharmony_ci/*
20d163575Sopenharmony_ci * Copyright (c) 2013-2019 Huawei Technologies Co., Ltd. All rights reserved.
30d163575Sopenharmony_ci * Copyright (c) 2020-2023 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#include <sys/statfs.h>
330d163575Sopenharmony_ci#include <sys/mount.h>
340d163575Sopenharmony_ci#include "proc_fs.h"
350d163575Sopenharmony_ci#include "internal.h"
360d163575Sopenharmony_ci#include "los_process_pri.h"
370d163575Sopenharmony_ci#include "user_copy.h"
380d163575Sopenharmony_ci#include "los_memory.h"
390d163575Sopenharmony_ci
400d163575Sopenharmony_ci#ifdef LOSCFG_PROC_PROCESS_DIR
410d163575Sopenharmony_ci#include "los_vm_dump.h"
420d163575Sopenharmony_ci
430d163575Sopenharmony_citypedef enum {
440d163575Sopenharmony_ci    PROC_PID,
450d163575Sopenharmony_ci    PROC_PID_MEM,
460d163575Sopenharmony_ci#ifdef LOSCFG_KERNEL_CPUP
470d163575Sopenharmony_ci    PROC_PID_CPUP,
480d163575Sopenharmony_ci#endif
490d163575Sopenharmony_ci#ifdef LOSCFG_USER_CONTAINER
500d163575Sopenharmony_ci    PROC_UID_MAP,
510d163575Sopenharmony_ci    PROC_GID_MAP,
520d163575Sopenharmony_ci#endif
530d163575Sopenharmony_ci    PROC_P_TYPE_MAX,
540d163575Sopenharmony_ci} ProcessDataType;
550d163575Sopenharmony_ci
560d163575Sopenharmony_cistruct ProcProcess {
570d163575Sopenharmony_ci    char         *name;
580d163575Sopenharmony_ci    mode_t       mode;
590d163575Sopenharmony_ci    int          type;
600d163575Sopenharmony_ci    const struct ProcFileOperations *fileOps;
610d163575Sopenharmony_ci};
620d163575Sopenharmony_ci
630d163575Sopenharmony_cistruct ProcessData {
640d163575Sopenharmony_ci    uintptr_t process;
650d163575Sopenharmony_ci    unsigned int type;
660d163575Sopenharmony_ci};
670d163575Sopenharmony_ci
680d163575Sopenharmony_cistatic LosProcessCB *ProcGetProcessCB(struct ProcessData *data)
690d163575Sopenharmony_ci{
700d163575Sopenharmony_ci    if (data->process != 0) {
710d163575Sopenharmony_ci        return (LosProcessCB *)data->process;
720d163575Sopenharmony_ci    }
730d163575Sopenharmony_ci    return OsCurrProcessGet();
740d163575Sopenharmony_ci}
750d163575Sopenharmony_ci
760d163575Sopenharmony_ci#define PROC_PID_PRIVILEGE 7
770d163575Sopenharmony_ci#define PROC_PID_DIR_LEN 100
780d163575Sopenharmony_ci#ifdef LOSCFG_KERNEL_CONTAINER
790d163575Sopenharmony_cistatic ssize_t ProcessContainerLink(unsigned int containerID, ContainerType type, char *buffer, size_t bufLen)
800d163575Sopenharmony_ci{
810d163575Sopenharmony_ci    ssize_t count = -1;
820d163575Sopenharmony_ci    if ((type == PID_CONTAINER) || (type == PID_CHILD_CONTAINER)) {
830d163575Sopenharmony_ci        count = snprintf_s(buffer, bufLen, bufLen - 1, "'pid:[%u]'", containerID);
840d163575Sopenharmony_ci    } else if (type == UTS_CONTAINER) {
850d163575Sopenharmony_ci        count = snprintf_s(buffer, bufLen, bufLen - 1, "'uts:[%u]'", containerID);
860d163575Sopenharmony_ci    } else if (type == MNT_CONTAINER) {
870d163575Sopenharmony_ci        count = snprintf_s(buffer, bufLen, bufLen - 1, "'mnt:[%u]'", containerID);
880d163575Sopenharmony_ci    } else if (type == IPC_CONTAINER) {
890d163575Sopenharmony_ci        count = snprintf_s(buffer, bufLen, bufLen - 1, "'ipc:[%u]'", containerID);
900d163575Sopenharmony_ci    } else if ((type == TIME_CONTAINER) || (type == TIME_CHILD_CONTAINER)) {
910d163575Sopenharmony_ci        count = snprintf_s(buffer, bufLen, bufLen - 1, "'time:[%u]'", containerID);
920d163575Sopenharmony_ci    } else if (type == USER_CONTAINER) {
930d163575Sopenharmony_ci        count = snprintf_s(buffer, bufLen, bufLen - 1, "'user:[%u]'", containerID);
940d163575Sopenharmony_ci    }  else if (type == NET_CONTAINER) {
950d163575Sopenharmony_ci        count = snprintf_s(buffer, bufLen, bufLen - 1, "'net:[%u]'", containerID);
960d163575Sopenharmony_ci    }
970d163575Sopenharmony_ci
980d163575Sopenharmony_ci    if (count < 0) {
990d163575Sopenharmony_ci        return -EBADF;
1000d163575Sopenharmony_ci    }
1010d163575Sopenharmony_ci    return count;
1020d163575Sopenharmony_ci}
1030d163575Sopenharmony_ci
1040d163575Sopenharmony_cistatic ssize_t ProcessContainerReadLink(struct ProcDirEntry *entry, char *buffer, size_t bufLen)
1050d163575Sopenharmony_ci{
1060d163575Sopenharmony_ci    char *freeBuf = NULL;
1070d163575Sopenharmony_ci    char *buf = buffer;
1080d163575Sopenharmony_ci    ssize_t count;
1090d163575Sopenharmony_ci    unsigned int intSave;
1100d163575Sopenharmony_ci    if (entry == NULL) {
1110d163575Sopenharmony_ci        return -EINVAL;
1120d163575Sopenharmony_ci    }
1130d163575Sopenharmony_ci    struct ProcessData *data = (struct ProcessData *)entry->data;
1140d163575Sopenharmony_ci    if (data == NULL) {
1150d163575Sopenharmony_ci        return -EINVAL;
1160d163575Sopenharmony_ci    }
1170d163575Sopenharmony_ci
1180d163575Sopenharmony_ci    if (LOS_IsUserAddressRange((VADDR_T)(UINTPTR)buffer, bufLen)) {
1190d163575Sopenharmony_ci        buf = LOS_MemAlloc(m_aucSysMem1, bufLen);
1200d163575Sopenharmony_ci        if (buf == NULL) {
1210d163575Sopenharmony_ci            return -ENOMEM;
1220d163575Sopenharmony_ci        }
1230d163575Sopenharmony_ci        (void)memset_s(buf, bufLen, 0, bufLen);
1240d163575Sopenharmony_ci        freeBuf = buf;
1250d163575Sopenharmony_ci    }
1260d163575Sopenharmony_ci
1270d163575Sopenharmony_ci    LosProcessCB *processCB = ProcGetProcessCB(data);
1280d163575Sopenharmony_ci    SCHEDULER_LOCK(intSave);
1290d163575Sopenharmony_ci    UINT32 containerID = OsGetContainerID(processCB, (ContainerType)data->type);
1300d163575Sopenharmony_ci    SCHEDULER_UNLOCK(intSave);
1310d163575Sopenharmony_ci    if (containerID != OS_INVALID_VALUE) {
1320d163575Sopenharmony_ci        count = ProcessContainerLink(containerID, (ContainerType)data->type, buf, bufLen);
1330d163575Sopenharmony_ci    } else {
1340d163575Sopenharmony_ci        count = strlen("(unknown)");
1350d163575Sopenharmony_ci        if (memcpy_s(buf, bufLen, "(unknown)", count + 1) != EOK) {
1360d163575Sopenharmony_ci            (void)LOS_MemFree(m_aucSysMem1, freeBuf);
1370d163575Sopenharmony_ci            return -EBADF;
1380d163575Sopenharmony_ci        }
1390d163575Sopenharmony_ci    }
1400d163575Sopenharmony_ci    if (count < 0) {
1410d163575Sopenharmony_ci        (void)LOS_MemFree(m_aucSysMem1, freeBuf);
1420d163575Sopenharmony_ci        return count;
1430d163575Sopenharmony_ci    }
1440d163575Sopenharmony_ci
1450d163575Sopenharmony_ci    if (LOS_IsUserAddressRange((VADDR_T)(UINTPTR)buffer, bufLen)) {
1460d163575Sopenharmony_ci        if (LOS_ArchCopyToUser(buffer, buf, bufLen) != 0) {
1470d163575Sopenharmony_ci            (void)LOS_MemFree(m_aucSysMem1, freeBuf);
1480d163575Sopenharmony_ci            return -EFAULT;
1490d163575Sopenharmony_ci        }
1500d163575Sopenharmony_ci    }
1510d163575Sopenharmony_ci    (void)LOS_MemFree(m_aucSysMem1, freeBuf);
1520d163575Sopenharmony_ci    return count;
1530d163575Sopenharmony_ci}
1540d163575Sopenharmony_ci
1550d163575Sopenharmony_cistatic const struct ProcFileOperations PID_CONTAINER_FOPS = {
1560d163575Sopenharmony_ci    .readLink = ProcessContainerReadLink,
1570d163575Sopenharmony_ci};
1580d163575Sopenharmony_ci
1590d163575Sopenharmony_civoid *ProcfsContainerGet(int fd, unsigned int *containerType)
1600d163575Sopenharmony_ci{
1610d163575Sopenharmony_ci    if ((fd <= 0) || (containerType == NULL)) {
1620d163575Sopenharmony_ci        return NULL;
1630d163575Sopenharmony_ci    }
1640d163575Sopenharmony_ci
1650d163575Sopenharmony_ci    VnodeHold();
1660d163575Sopenharmony_ci    struct Vnode *vnode = VnodeFind(fd);
1670d163575Sopenharmony_ci    if (vnode == NULL) {
1680d163575Sopenharmony_ci        VnodeDrop();
1690d163575Sopenharmony_ci        return NULL;
1700d163575Sopenharmony_ci    }
1710d163575Sopenharmony_ci
1720d163575Sopenharmony_ci    struct ProcDirEntry *entry = VnodeToEntry(vnode);
1730d163575Sopenharmony_ci    if (entry == NULL) {
1740d163575Sopenharmony_ci        VnodeDrop();
1750d163575Sopenharmony_ci        return NULL;
1760d163575Sopenharmony_ci    }
1770d163575Sopenharmony_ci
1780d163575Sopenharmony_ci    struct ProcessData *data = (struct ProcessData *)entry->data;
1790d163575Sopenharmony_ci    if (data == NULL) {
1800d163575Sopenharmony_ci        VnodeDrop();
1810d163575Sopenharmony_ci        return NULL;
1820d163575Sopenharmony_ci    }
1830d163575Sopenharmony_ci
1840d163575Sopenharmony_ci    void *processCB = (void *)ProcGetProcessCB(data);
1850d163575Sopenharmony_ci    *containerType = data->type;
1860d163575Sopenharmony_ci    VnodeDrop();
1870d163575Sopenharmony_ci    return processCB;
1880d163575Sopenharmony_ci}
1890d163575Sopenharmony_ci
1900d163575Sopenharmony_ci#endif /* LOSCFG_KERNEL_CONTAINER */
1910d163575Sopenharmony_ci
1920d163575Sopenharmony_cistatic int ProcessMemInfoRead(struct SeqBuf *seqBuf, LosProcessCB *pcb)
1930d163575Sopenharmony_ci{
1940d163575Sopenharmony_ci    unsigned int intSave;
1950d163575Sopenharmony_ci    unsigned int size = sizeof(LosVmSpace) + sizeof(LosVmMapRegion);
1960d163575Sopenharmony_ci    LosVmSpace *vmSpace = (LosVmSpace *)LOS_MemAlloc(m_aucSysMem1, size);
1970d163575Sopenharmony_ci    if (vmSpace == NULL) {
1980d163575Sopenharmony_ci        return -ENOMEM;
1990d163575Sopenharmony_ci    }
2000d163575Sopenharmony_ci    (void)memset_s(vmSpace, size, 0, size);
2010d163575Sopenharmony_ci    LosVmMapRegion *heap = (LosVmMapRegion *)((char *)vmSpace + sizeof(LosVmSpace));
2020d163575Sopenharmony_ci
2030d163575Sopenharmony_ci    SCHEDULER_LOCK(intSave);
2040d163575Sopenharmony_ci    if (OsProcessIsInactive(pcb)) {
2050d163575Sopenharmony_ci        SCHEDULER_UNLOCK(intSave);
2060d163575Sopenharmony_ci        (void)LOS_MemFree(m_aucSysMem1, vmSpace);
2070d163575Sopenharmony_ci        return -EINVAL;
2080d163575Sopenharmony_ci    }
2090d163575Sopenharmony_ci    (void)memcpy_s(vmSpace, sizeof(LosVmSpace), pcb->vmSpace, sizeof(LosVmSpace));
2100d163575Sopenharmony_ci    (void)memcpy_s(heap, sizeof(LosVmMapRegion), pcb->vmSpace->heap, sizeof(LosVmMapRegion));
2110d163575Sopenharmony_ci    SCHEDULER_UNLOCK(intSave);
2120d163575Sopenharmony_ci
2130d163575Sopenharmony_ci    (void)LosBufPrintf(seqBuf, "\nVMSpaceSize:      %u byte\n", vmSpace->size);
2140d163575Sopenharmony_ci    (void)LosBufPrintf(seqBuf, "VMSpaceMapSize:   %u byte\n", vmSpace->mapSize);
2150d163575Sopenharmony_ci    (void)LosBufPrintf(seqBuf, "VM TLB Asid:      %u\n", vmSpace->archMmu.asid);
2160d163575Sopenharmony_ci    (void)LosBufPrintf(seqBuf, "VMHeapSize:       %u byte\n", heap->range.size);
2170d163575Sopenharmony_ci    (void)LosBufPrintf(seqBuf, "VMHeapRegionName: %s\n", OsGetRegionNameOrFilePath(heap));
2180d163575Sopenharmony_ci    (void)LosBufPrintf(seqBuf, "VMHeapRegionType: 0x%x\n", heap->regionType);
2190d163575Sopenharmony_ci    (void)LOS_MemFree(m_aucSysMem1, vmSpace);
2200d163575Sopenharmony_ci    return 0;
2210d163575Sopenharmony_ci}
2220d163575Sopenharmony_ci
2230d163575Sopenharmony_ci#ifdef LOSCFG_KERNEL_CPUP
2240d163575Sopenharmony_ci#define TIME_CYCLE_TO_US(time) ((((UINT64)time) * OS_NS_PER_CYCLE) / OS_SYS_NS_PER_US)
2250d163575Sopenharmony_cistatic int ProcessCpupRead(struct SeqBuf *seqBuf, LosProcessCB *pcb)
2260d163575Sopenharmony_ci{
2270d163575Sopenharmony_ci    unsigned int intSave;
2280d163575Sopenharmony_ci    OsCpupBase *processCpup = (OsCpupBase *)LOS_MemAlloc(m_aucSysMem1, sizeof(OsCpupBase));
2290d163575Sopenharmony_ci    if (processCpup == NULL) {
2300d163575Sopenharmony_ci        return -ENOMEM;
2310d163575Sopenharmony_ci    }
2320d163575Sopenharmony_ci    (void)memset_s(processCpup, sizeof(OsCpupBase), 0, sizeof(OsCpupBase));
2330d163575Sopenharmony_ci
2340d163575Sopenharmony_ci    SCHEDULER_LOCK(intSave);
2350d163575Sopenharmony_ci    if (OsProcessIsInactive(pcb)) {
2360d163575Sopenharmony_ci        SCHEDULER_UNLOCK(intSave);
2370d163575Sopenharmony_ci        (VOID)LOS_MemFree(m_aucSysMem1, processCpup);
2380d163575Sopenharmony_ci        return -EINVAL;
2390d163575Sopenharmony_ci    }
2400d163575Sopenharmony_ci    (void)memcpy_s(processCpup, sizeof(OsCpupBase), pcb->processCpup, sizeof(OsCpupBase));
2410d163575Sopenharmony_ci    SCHEDULER_UNLOCK(intSave);
2420d163575Sopenharmony_ci
2430d163575Sopenharmony_ci    (void)LosBufPrintf(seqBuf, "\nTotalRunningTime: %lu us\n", TIME_CYCLE_TO_US(processCpup->allTime));
2440d163575Sopenharmony_ci    (void)LosBufPrintf(seqBuf, "HistoricalRunningTime:(us) ");
2450d163575Sopenharmony_ci    for (UINT32 i = 0; i < OS_CPUP_HISTORY_RECORD_NUM + 1; i++) {
2460d163575Sopenharmony_ci        (void)LosBufPrintf(seqBuf, "%lu  ", TIME_CYCLE_TO_US(processCpup->historyTime[i]));
2470d163575Sopenharmony_ci    }
2480d163575Sopenharmony_ci    (void)LosBufPrintf(seqBuf, "\n");
2490d163575Sopenharmony_ci    (void)LOS_MemFree(m_aucSysMem1, processCpup);
2500d163575Sopenharmony_ci    return 0;
2510d163575Sopenharmony_ci}
2520d163575Sopenharmony_ci#endif
2530d163575Sopenharmony_ci
2540d163575Sopenharmony_ci#ifdef LOSCFG_TIME_CONTAINER
2550d163575Sopenharmony_cistatic const CHAR *g_monotonic = "monotonic";
2560d163575Sopenharmony_ci#define DECIMAL_BASE 10
2570d163575Sopenharmony_ci
2580d163575Sopenharmony_cistatic int ProcTimeContainerRead(struct SeqBuf *m, void *v)
2590d163575Sopenharmony_ci{
2600d163575Sopenharmony_ci    int ret;
2610d163575Sopenharmony_ci    unsigned int intSave;
2620d163575Sopenharmony_ci    struct timespec64 offsets = {0};
2630d163575Sopenharmony_ci
2640d163575Sopenharmony_ci    if ((m == NULL) || (v == NULL)) {
2650d163575Sopenharmony_ci        return -EINVAL;
2660d163575Sopenharmony_ci    }
2670d163575Sopenharmony_ci
2680d163575Sopenharmony_ci    struct ProcessData *data = (struct ProcessData *)v;
2690d163575Sopenharmony_ci    SCHEDULER_LOCK(intSave);
2700d163575Sopenharmony_ci    LosProcessCB *processCB = ProcGetProcessCB(data);
2710d163575Sopenharmony_ci    ret = OsGetTimeContainerMonotonic(processCB, &offsets);
2720d163575Sopenharmony_ci    SCHEDULER_UNLOCK(intSave);
2730d163575Sopenharmony_ci    if (ret != LOS_OK) {
2740d163575Sopenharmony_ci        return -ret;
2750d163575Sopenharmony_ci    }
2760d163575Sopenharmony_ci
2770d163575Sopenharmony_ci    LosBufPrintf(m, "monotonic %lld %ld\n", offsets.tv_sec, offsets.tv_nsec);
2780d163575Sopenharmony_ci    return 0;
2790d163575Sopenharmony_ci}
2800d163575Sopenharmony_ci
2810d163575Sopenharmony_cistatic int ProcSetTimensOffset(const char *buf, LosProcessCB *processCB)
2820d163575Sopenharmony_ci{
2830d163575Sopenharmony_ci    unsigned int intSave;
2840d163575Sopenharmony_ci    struct timespec64 offsets;
2850d163575Sopenharmony_ci    char *endptr = NULL;
2860d163575Sopenharmony_ci
2870d163575Sopenharmony_ci    offsets.tv_sec = strtoll(buf, &endptr, DECIMAL_BASE);
2880d163575Sopenharmony_ci    offsets.tv_nsec = strtoll(endptr, NULL, DECIMAL_BASE);
2890d163575Sopenharmony_ci    if (offsets.tv_nsec >= OS_SYS_NS_PER_SECOND) {
2900d163575Sopenharmony_ci        return -EACCES;
2910d163575Sopenharmony_ci    }
2920d163575Sopenharmony_ci
2930d163575Sopenharmony_ci    SCHEDULER_LOCK(intSave);
2940d163575Sopenharmony_ci    unsigned int ret = OsSetTimeContainerMonotonic(processCB, &offsets);
2950d163575Sopenharmony_ci    SCHEDULER_UNLOCK(intSave);
2960d163575Sopenharmony_ci    if (ret != LOS_OK) {
2970d163575Sopenharmony_ci        return -ret;
2980d163575Sopenharmony_ci    }
2990d163575Sopenharmony_ci    return 0;
3000d163575Sopenharmony_ci}
3010d163575Sopenharmony_ci
3020d163575Sopenharmony_cistatic int ProcTimeContainerWrite(struct ProcFile *pf, const char *buf, size_t count, loff_t *ppos)
3030d163575Sopenharmony_ci{
3040d163575Sopenharmony_ci    (void)ppos;
3050d163575Sopenharmony_ci    char *kbuf = NULL;
3060d163575Sopenharmony_ci    int ret;
3070d163575Sopenharmony_ci
3080d163575Sopenharmony_ci    if ((pf == NULL) || (count <= 0)) {
3090d163575Sopenharmony_ci        return -EINVAL;
3100d163575Sopenharmony_ci    }
3110d163575Sopenharmony_ci
3120d163575Sopenharmony_ci    struct ProcDirEntry *entry = pf->pPDE;
3130d163575Sopenharmony_ci    if (entry == NULL) {
3140d163575Sopenharmony_ci        return -EINVAL;
3150d163575Sopenharmony_ci    }
3160d163575Sopenharmony_ci
3170d163575Sopenharmony_ci    struct ProcessData *data = (struct ProcessData *)entry->data;
3180d163575Sopenharmony_ci    if (data == NULL) {
3190d163575Sopenharmony_ci        return -EINVAL;
3200d163575Sopenharmony_ci    }
3210d163575Sopenharmony_ci
3220d163575Sopenharmony_ci    if (LOS_IsUserAddressRange((VADDR_T)(UINTPTR)buf, count)) {
3230d163575Sopenharmony_ci        kbuf = LOS_MemAlloc(m_aucSysMem1, count + 1);
3240d163575Sopenharmony_ci        if (kbuf == NULL) {
3250d163575Sopenharmony_ci            return -ENOMEM;
3260d163575Sopenharmony_ci        }
3270d163575Sopenharmony_ci
3280d163575Sopenharmony_ci        if (LOS_ArchCopyFromUser(kbuf, buf, count) != 0) {
3290d163575Sopenharmony_ci            (VOID)LOS_MemFree(m_aucSysMem1, kbuf);
3300d163575Sopenharmony_ci            return -EFAULT;
3310d163575Sopenharmony_ci        }
3320d163575Sopenharmony_ci        kbuf[count] = '\0';
3330d163575Sopenharmony_ci        buf = kbuf;
3340d163575Sopenharmony_ci    }
3350d163575Sopenharmony_ci
3360d163575Sopenharmony_ci    ret = strncmp(buf, g_monotonic, strlen(g_monotonic));
3370d163575Sopenharmony_ci    if (ret != 0) {
3380d163575Sopenharmony_ci        (VOID)LOS_MemFree(m_aucSysMem1, kbuf);
3390d163575Sopenharmony_ci        return -EINVAL;
3400d163575Sopenharmony_ci    }
3410d163575Sopenharmony_ci
3420d163575Sopenharmony_ci    buf += strlen(g_monotonic);
3430d163575Sopenharmony_ci    ret = ProcSetTimensOffset(buf, ProcGetProcessCB(data));
3440d163575Sopenharmony_ci    if (ret < 0) {
3450d163575Sopenharmony_ci        (VOID)LOS_MemFree(m_aucSysMem1, kbuf);
3460d163575Sopenharmony_ci        return ret;
3470d163575Sopenharmony_ci    }
3480d163575Sopenharmony_ci    (VOID)LOS_MemFree(m_aucSysMem1, kbuf);
3490d163575Sopenharmony_ci    return count;
3500d163575Sopenharmony_ci}
3510d163575Sopenharmony_ci
3520d163575Sopenharmony_cistatic const struct ProcFileOperations TIME_CONTAINER_FOPS = {
3530d163575Sopenharmony_ci    .read = ProcTimeContainerRead,
3540d163575Sopenharmony_ci    .write = ProcTimeContainerWrite,
3550d163575Sopenharmony_ci};
3560d163575Sopenharmony_ci#endif
3570d163575Sopenharmony_ci
3580d163575Sopenharmony_ci#ifdef LOSCFG_USER_CONTAINER
3590d163575Sopenharmony_ci
3600d163575Sopenharmony_cistatic void *MemdupUserNul(const void *src, size_t len)
3610d163575Sopenharmony_ci{
3620d163575Sopenharmony_ci    char *des = NULL;
3630d163575Sopenharmony_ci    if (len <= 0) {
3640d163575Sopenharmony_ci        return NULL;
3650d163575Sopenharmony_ci    }
3660d163575Sopenharmony_ci    des = LOS_MemAlloc(OS_SYS_MEM_ADDR, len + 1);
3670d163575Sopenharmony_ci    if (des == NULL) {
3680d163575Sopenharmony_ci        return NULL;
3690d163575Sopenharmony_ci    }
3700d163575Sopenharmony_ci
3710d163575Sopenharmony_ci    if (LOS_ArchCopyFromUser(des, src, len) != 0) {
3720d163575Sopenharmony_ci        (VOID)LOS_MemFree(OS_SYS_MEM_ADDR, des);
3730d163575Sopenharmony_ci        return NULL;
3740d163575Sopenharmony_ci    }
3750d163575Sopenharmony_ci
3760d163575Sopenharmony_ci    des[len] = '\0';
3770d163575Sopenharmony_ci    return des;
3780d163575Sopenharmony_ci}
3790d163575Sopenharmony_ci
3800d163575Sopenharmony_cistatic LosProcessCB *ProcUidGidMapWriteCheck(struct ProcFile *pf, const char *buf, size_t size,
3810d163575Sopenharmony_ci                                             char **kbuf, ProcessDataType *type)
3820d163575Sopenharmony_ci{
3830d163575Sopenharmony_ci    if ((pf == NULL) || (size <= 0) || (size >= PAGE_SIZE)) {
3840d163575Sopenharmony_ci        return NULL;
3850d163575Sopenharmony_ci    }
3860d163575Sopenharmony_ci
3870d163575Sopenharmony_ci    struct ProcDirEntry *entry = pf->pPDE;
3880d163575Sopenharmony_ci    if (entry == NULL) {
3890d163575Sopenharmony_ci        return NULL;
3900d163575Sopenharmony_ci    }
3910d163575Sopenharmony_ci
3920d163575Sopenharmony_ci    struct ProcessData *data = (struct ProcessData *)entry->data;
3930d163575Sopenharmony_ci    if (data == NULL) {
3940d163575Sopenharmony_ci        return NULL;
3950d163575Sopenharmony_ci    }
3960d163575Sopenharmony_ci
3970d163575Sopenharmony_ci    *kbuf = MemdupUserNul(buf, size);
3980d163575Sopenharmony_ci    if (*kbuf == NULL) {
3990d163575Sopenharmony_ci        return NULL;
4000d163575Sopenharmony_ci    }
4010d163575Sopenharmony_ci    *type = (ProcessDataType)data->type;
4020d163575Sopenharmony_ci    return ProcGetProcessCB(data);
4030d163575Sopenharmony_ci}
4040d163575Sopenharmony_ci
4050d163575Sopenharmony_cistatic ssize_t ProcIDMapWrite(struct ProcFile *file, const char *buf, size_t size, loff_t *ppos)
4060d163575Sopenharmony_ci{
4070d163575Sopenharmony_ci    (void)ppos;
4080d163575Sopenharmony_ci    char *kbuf = NULL;
4090d163575Sopenharmony_ci    int ret;
4100d163575Sopenharmony_ci    unsigned int intSave;
4110d163575Sopenharmony_ci    ProcessDataType type = PROC_P_TYPE_MAX;
4120d163575Sopenharmony_ci    LosProcessCB *processCB = ProcUidGidMapWriteCheck(file, buf, size, &kbuf, &type);
4130d163575Sopenharmony_ci    if (processCB == NULL) {
4140d163575Sopenharmony_ci        return -EINVAL;
4150d163575Sopenharmony_ci    }
4160d163575Sopenharmony_ci
4170d163575Sopenharmony_ci    SCHEDULER_LOCK(intSave);
4180d163575Sopenharmony_ci    if ((processCB->credentials == NULL) || (processCB->credentials->userContainer == NULL)) {
4190d163575Sopenharmony_ci        SCHEDULER_UNLOCK(intSave);
4200d163575Sopenharmony_ci        (void)LOS_MemFree(m_aucSysMem1, kbuf);
4210d163575Sopenharmony_ci        return -EINVAL;
4220d163575Sopenharmony_ci    }
4230d163575Sopenharmony_ci    UserContainer *userContainer = processCB->credentials->userContainer;
4240d163575Sopenharmony_ci    if (userContainer->parent == NULL) {
4250d163575Sopenharmony_ci        SCHEDULER_UNLOCK(intSave);
4260d163575Sopenharmony_ci        (void)LOS_MemFree(m_aucSysMem1, kbuf);
4270d163575Sopenharmony_ci        return -EPERM;
4280d163575Sopenharmony_ci    }
4290d163575Sopenharmony_ci    if (type == PROC_UID_MAP) {
4300d163575Sopenharmony_ci        ret = OsUserContainerMapWrite(file, kbuf, size, CAP_SETUID,
4310d163575Sopenharmony_ci                                      &userContainer->uidMap, &userContainer->parent->uidMap);
4320d163575Sopenharmony_ci    } else {
4330d163575Sopenharmony_ci        ret = OsUserContainerMapWrite(file, kbuf, size, CAP_SETGID,
4340d163575Sopenharmony_ci                                      &userContainer->gidMap, &userContainer->parent->gidMap);
4350d163575Sopenharmony_ci    }
4360d163575Sopenharmony_ci    SCHEDULER_UNLOCK(intSave);
4370d163575Sopenharmony_ci    (void)LOS_MemFree(m_aucSysMem1, kbuf);
4380d163575Sopenharmony_ci    return ret;
4390d163575Sopenharmony_ci}
4400d163575Sopenharmony_ci
4410d163575Sopenharmony_cistatic int ProcIDMapRead(struct SeqBuf *seqBuf, void *v)
4420d163575Sopenharmony_ci{
4430d163575Sopenharmony_ci    unsigned int intSave;
4440d163575Sopenharmony_ci    if ((seqBuf == NULL) || (v == NULL)) {
4450d163575Sopenharmony_ci        return -EINVAL;
4460d163575Sopenharmony_ci    }
4470d163575Sopenharmony_ci    struct ProcessData *data = (struct ProcessData *)v;
4480d163575Sopenharmony_ci    LosProcessCB *processCB = ProcGetProcessCB(data);
4490d163575Sopenharmony_ci
4500d163575Sopenharmony_ci    SCHEDULER_LOCK(intSave);
4510d163575Sopenharmony_ci    if ((processCB->credentials == NULL) || (processCB->credentials->userContainer == NULL)) {
4520d163575Sopenharmony_ci        SCHEDULER_UNLOCK(intSave);
4530d163575Sopenharmony_ci        return -EINVAL;
4540d163575Sopenharmony_ci    }
4550d163575Sopenharmony_ci    UserContainer *userContainer = processCB->credentials->userContainer;
4560d163575Sopenharmony_ci    if ((userContainer != NULL) && (userContainer->parent == NULL)) {
4570d163575Sopenharmony_ci        UidGidExtent uidGidExtent = userContainer->uidMap.extent[0];
4580d163575Sopenharmony_ci        SCHEDULER_UNLOCK(intSave);
4590d163575Sopenharmony_ci        (void)LosBufPrintf(seqBuf, "%d %d %u\n", uidGidExtent.first, uidGidExtent.lowerFirst,
4600d163575Sopenharmony_ci                           uidGidExtent.count);
4610d163575Sopenharmony_ci        return 0;
4620d163575Sopenharmony_ci    }
4630d163575Sopenharmony_ci    SCHEDULER_LOCK(intSave);
4640d163575Sopenharmony_ci    return 0;
4650d163575Sopenharmony_ci}
4660d163575Sopenharmony_ci
4670d163575Sopenharmony_cistatic const struct ProcFileOperations UID_GID_MAP_FOPS = {
4680d163575Sopenharmony_ci    .read = ProcIDMapRead,
4690d163575Sopenharmony_ci    .write = ProcIDMapWrite,
4700d163575Sopenharmony_ci};
4710d163575Sopenharmony_ci#endif
4720d163575Sopenharmony_ci
4730d163575Sopenharmony_cistatic int ProcProcessRead(struct SeqBuf *m, void *v)
4740d163575Sopenharmony_ci{
4750d163575Sopenharmony_ci    if ((m == NULL) || (v == NULL)) {
4760d163575Sopenharmony_ci        return -EINVAL;
4770d163575Sopenharmony_ci    }
4780d163575Sopenharmony_ci    struct ProcessData *data = (struct ProcessData *)v;
4790d163575Sopenharmony_ci    switch (data->type) {
4800d163575Sopenharmony_ci        case PROC_PID_MEM:
4810d163575Sopenharmony_ci            return ProcessMemInfoRead(m, ProcGetProcessCB(data));
4820d163575Sopenharmony_ci#ifdef LOSCFG_KERNEL_CPUP
4830d163575Sopenharmony_ci        case PROC_PID_CPUP:
4840d163575Sopenharmony_ci            return ProcessCpupRead(m, ProcGetProcessCB(data));
4850d163575Sopenharmony_ci#endif
4860d163575Sopenharmony_ci        default:
4870d163575Sopenharmony_ci            break;
4880d163575Sopenharmony_ci    }
4890d163575Sopenharmony_ci    return -EINVAL;
4900d163575Sopenharmony_ci}
4910d163575Sopenharmony_ci
4920d163575Sopenharmony_cistatic const struct ProcFileOperations PID_FOPS = {
4930d163575Sopenharmony_ci    .read = ProcProcessRead,
4940d163575Sopenharmony_ci};
4950d163575Sopenharmony_ci
4960d163575Sopenharmony_cistatic struct ProcProcess g_procProcess[] = {
4970d163575Sopenharmony_ci    {
4980d163575Sopenharmony_ci        .name = NULL,
4990d163575Sopenharmony_ci        .mode = S_IFDIR | S_IRWXU | S_IRWXG | S_IROTH,
5000d163575Sopenharmony_ci        .type = PROC_PID,
5010d163575Sopenharmony_ci        .fileOps = &PID_FOPS
5020d163575Sopenharmony_ci
5030d163575Sopenharmony_ci    },
5040d163575Sopenharmony_ci    {
5050d163575Sopenharmony_ci        .name = "meminfo",
5060d163575Sopenharmony_ci        .mode = 0,
5070d163575Sopenharmony_ci        .type = PROC_PID_MEM,
5080d163575Sopenharmony_ci        .fileOps = &PID_FOPS
5090d163575Sopenharmony_ci    },
5100d163575Sopenharmony_ci#ifdef LOSCFG_KERNEL_CPUP
5110d163575Sopenharmony_ci    {
5120d163575Sopenharmony_ci        .name = "cpup",
5130d163575Sopenharmony_ci        .mode = 0,
5140d163575Sopenharmony_ci        .type = PROC_PID_CPUP,
5150d163575Sopenharmony_ci        .fileOps = &PID_FOPS
5160d163575Sopenharmony_ci
5170d163575Sopenharmony_ci    },
5180d163575Sopenharmony_ci#endif
5190d163575Sopenharmony_ci#ifdef LOSCFG_KERNEL_CONTAINER
5200d163575Sopenharmony_ci    {
5210d163575Sopenharmony_ci        .name = "container",
5220d163575Sopenharmony_ci        .mode = S_IFDIR | S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH,
5230d163575Sopenharmony_ci        .type = CONTAINER,
5240d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
5250d163575Sopenharmony_ci
5260d163575Sopenharmony_ci    },
5270d163575Sopenharmony_ci#ifdef LOSCFG_PID_CONTAINER
5280d163575Sopenharmony_ci    {
5290d163575Sopenharmony_ci        .name = "container/pid",
5300d163575Sopenharmony_ci        .mode = S_IFLNK,
5310d163575Sopenharmony_ci        .type = PID_CONTAINER,
5320d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
5330d163575Sopenharmony_ci    },
5340d163575Sopenharmony_ci    {
5350d163575Sopenharmony_ci        .name = "container/pid_for_children",
5360d163575Sopenharmony_ci        .mode = S_IFLNK,
5370d163575Sopenharmony_ci        .type = PID_CHILD_CONTAINER,
5380d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
5390d163575Sopenharmony_ci    },
5400d163575Sopenharmony_ci#endif
5410d163575Sopenharmony_ci#ifdef LOSCFG_UTS_CONTAINER
5420d163575Sopenharmony_ci    {
5430d163575Sopenharmony_ci        .name = "container/uts",
5440d163575Sopenharmony_ci        .mode = S_IFLNK,
5450d163575Sopenharmony_ci        .type = UTS_CONTAINER,
5460d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
5470d163575Sopenharmony_ci    },
5480d163575Sopenharmony_ci#endif
5490d163575Sopenharmony_ci#ifdef LOSCFG_MNT_CONTAINER
5500d163575Sopenharmony_ci    {
5510d163575Sopenharmony_ci        .name = "container/mnt",
5520d163575Sopenharmony_ci        .mode = S_IFLNK,
5530d163575Sopenharmony_ci        .type = MNT_CONTAINER,
5540d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
5550d163575Sopenharmony_ci    },
5560d163575Sopenharmony_ci#endif
5570d163575Sopenharmony_ci#ifdef LOSCFG_IPC_CONTAINER
5580d163575Sopenharmony_ci    {
5590d163575Sopenharmony_ci        .name = "container/ipc",
5600d163575Sopenharmony_ci        .mode = S_IFLNK,
5610d163575Sopenharmony_ci        .type = IPC_CONTAINER,
5620d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
5630d163575Sopenharmony_ci    },
5640d163575Sopenharmony_ci#endif
5650d163575Sopenharmony_ci#ifdef LOSCFG_TIME_CONTAINER
5660d163575Sopenharmony_ci    {
5670d163575Sopenharmony_ci        .name = "container/time",
5680d163575Sopenharmony_ci        .mode = S_IFLNK,
5690d163575Sopenharmony_ci        .type = TIME_CONTAINER,
5700d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
5710d163575Sopenharmony_ci    },
5720d163575Sopenharmony_ci    {
5730d163575Sopenharmony_ci        .name = "container/time_for_children",
5740d163575Sopenharmony_ci        .mode = S_IFLNK,
5750d163575Sopenharmony_ci        .type = TIME_CHILD_CONTAINER,
5760d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
5770d163575Sopenharmony_ci    },
5780d163575Sopenharmony_ci    {
5790d163575Sopenharmony_ci        .name = "time_offsets",
5800d163575Sopenharmony_ci        .mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH,
5810d163575Sopenharmony_ci        .type = TIME_CONTAINER,
5820d163575Sopenharmony_ci        .fileOps = &TIME_CONTAINER_FOPS
5830d163575Sopenharmony_ci    },
5840d163575Sopenharmony_ci#endif
5850d163575Sopenharmony_ci#ifdef LOSCFG_IPC_CONTAINER
5860d163575Sopenharmony_ci    {
5870d163575Sopenharmony_ci        .name = "container/user",
5880d163575Sopenharmony_ci        .mode = S_IFLNK,
5890d163575Sopenharmony_ci        .type = USER_CONTAINER,
5900d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
5910d163575Sopenharmony_ci    },
5920d163575Sopenharmony_ci    {
5930d163575Sopenharmony_ci        .name = "uid_map",
5940d163575Sopenharmony_ci        .mode = 0,
5950d163575Sopenharmony_ci        .type = PROC_UID_MAP,
5960d163575Sopenharmony_ci        .fileOps = &UID_GID_MAP_FOPS
5970d163575Sopenharmony_ci    },
5980d163575Sopenharmony_ci    {
5990d163575Sopenharmony_ci        .name = "gid_map",
6000d163575Sopenharmony_ci        .mode = 0,
6010d163575Sopenharmony_ci        .type = PROC_GID_MAP,
6020d163575Sopenharmony_ci        .fileOps = &UID_GID_MAP_FOPS
6030d163575Sopenharmony_ci    },
6040d163575Sopenharmony_ci#endif
6050d163575Sopenharmony_ci#ifdef LOSCFG_IPC_CONTAINER
6060d163575Sopenharmony_ci    {
6070d163575Sopenharmony_ci        .name = "container/net",
6080d163575Sopenharmony_ci        .mode = S_IFLNK,
6090d163575Sopenharmony_ci        .type = NET_CONTAINER,
6100d163575Sopenharmony_ci        .fileOps = &PID_CONTAINER_FOPS
6110d163575Sopenharmony_ci    },
6120d163575Sopenharmony_ci#endif
6130d163575Sopenharmony_ci#endif
6140d163575Sopenharmony_ci};
6150d163575Sopenharmony_ci
6160d163575Sopenharmony_civoid ProcFreeProcessDir(struct ProcDirEntry *processDir)
6170d163575Sopenharmony_ci{
6180d163575Sopenharmony_ci    if (processDir == NULL) {
6190d163575Sopenharmony_ci        return;
6200d163575Sopenharmony_ci    }
6210d163575Sopenharmony_ci    RemoveProcEntry(processDir->name, NULL);
6220d163575Sopenharmony_ci}
6230d163575Sopenharmony_ci
6240d163575Sopenharmony_cistatic struct ProcDirEntry *ProcCreatePorcess(UINT32 pid, struct ProcProcess *porcess, uintptr_t processCB)
6250d163575Sopenharmony_ci{
6260d163575Sopenharmony_ci    int ret;
6270d163575Sopenharmony_ci    struct ProcDataParm dataParm;
6280d163575Sopenharmony_ci    char pidName[PROC_PID_DIR_LEN] = {0};
6290d163575Sopenharmony_ci    struct ProcessData *data = (struct ProcessData *)malloc(sizeof(struct ProcessData));
6300d163575Sopenharmony_ci    if (data == NULL) {
6310d163575Sopenharmony_ci        return NULL;
6320d163575Sopenharmony_ci    }
6330d163575Sopenharmony_ci    if (pid != OS_INVALID_VALUE) {
6340d163575Sopenharmony_ci        if (porcess->name != NULL) {
6350d163575Sopenharmony_ci            ret = snprintf_s(pidName, PROC_PID_DIR_LEN, PROC_PID_DIR_LEN - 1, "%u/%s", pid, porcess->name);
6360d163575Sopenharmony_ci        } else {
6370d163575Sopenharmony_ci            ret = snprintf_s(pidName, PROC_PID_DIR_LEN, PROC_PID_DIR_LEN - 1, "%u", pid);
6380d163575Sopenharmony_ci        }
6390d163575Sopenharmony_ci    } else {
6400d163575Sopenharmony_ci        if (porcess->name != NULL) {
6410d163575Sopenharmony_ci            ret = snprintf_s(pidName, PROC_PID_DIR_LEN, PROC_PID_DIR_LEN - 1, "%s/%s", "self", porcess->name);
6420d163575Sopenharmony_ci        } else {
6430d163575Sopenharmony_ci            ret = snprintf_s(pidName, PROC_PID_DIR_LEN, PROC_PID_DIR_LEN - 1, "%s", "self");
6440d163575Sopenharmony_ci        }
6450d163575Sopenharmony_ci    }
6460d163575Sopenharmony_ci    if (ret < 0) {
6470d163575Sopenharmony_ci        free(data);
6480d163575Sopenharmony_ci        return NULL;
6490d163575Sopenharmony_ci    }
6500d163575Sopenharmony_ci
6510d163575Sopenharmony_ci    data->process = processCB;
6520d163575Sopenharmony_ci    data->type = porcess->type;
6530d163575Sopenharmony_ci    dataParm.data = data;
6540d163575Sopenharmony_ci    dataParm.dataType = PROC_DATA_FREE;
6550d163575Sopenharmony_ci    struct ProcDirEntry *container = ProcCreateData(pidName, porcess->mode, NULL, porcess->fileOps, &dataParm);
6560d163575Sopenharmony_ci    if (container == NULL) {
6570d163575Sopenharmony_ci        free(data);
6580d163575Sopenharmony_ci        PRINT_ERR("create /proc/%s error!\n", pidName);
6590d163575Sopenharmony_ci        return NULL;
6600d163575Sopenharmony_ci    }
6610d163575Sopenharmony_ci    return container;
6620d163575Sopenharmony_ci}
6630d163575Sopenharmony_ci
6640d163575Sopenharmony_ciint ProcCreateProcessDir(UINT32 pid, uintptr_t process)
6650d163575Sopenharmony_ci{
6660d163575Sopenharmony_ci    unsigned int intSave;
6670d163575Sopenharmony_ci    struct ProcDirEntry *pidDir = NULL;
6680d163575Sopenharmony_ci    for (int index = 0; index < (sizeof(g_procProcess) / sizeof(struct ProcProcess)); index++) {
6690d163575Sopenharmony_ci        struct ProcProcess *procProcess = &g_procProcess[index];
6700d163575Sopenharmony_ci        struct ProcDirEntry *dir = ProcCreatePorcess(pid, procProcess, process);
6710d163575Sopenharmony_ci        if (dir == NULL) {
6720d163575Sopenharmony_ci            PRINT_ERR("create /proc/%s error!\n", procProcess->name);
6730d163575Sopenharmony_ci            goto CREATE_ERROR;
6740d163575Sopenharmony_ci        }
6750d163575Sopenharmony_ci        if (index == 0) {
6760d163575Sopenharmony_ci            pidDir = dir;
6770d163575Sopenharmony_ci        }
6780d163575Sopenharmony_ci    }
6790d163575Sopenharmony_ci
6800d163575Sopenharmony_ci    if (process != 0) {
6810d163575Sopenharmony_ci        SCHEDULER_LOCK(intSave);
6820d163575Sopenharmony_ci        ((LosProcessCB *)process)->procDir = pidDir;
6830d163575Sopenharmony_ci        SCHEDULER_UNLOCK(intSave);
6840d163575Sopenharmony_ci    }
6850d163575Sopenharmony_ci
6860d163575Sopenharmony_ci    return 0;
6870d163575Sopenharmony_ci
6880d163575Sopenharmony_ciCREATE_ERROR:
6890d163575Sopenharmony_ci    if (pidDir != NULL) {
6900d163575Sopenharmony_ci        RemoveProcEntry(pidDir->name, NULL);
6910d163575Sopenharmony_ci    }
6920d163575Sopenharmony_ci    return -1;
6930d163575Sopenharmony_ci}
6940d163575Sopenharmony_ci#endif /* LOSCFG_PROC_PROCESS_DIR */
6950d163575Sopenharmony_ci
6960d163575Sopenharmony_cistatic int ProcessProcFill(struct SeqBuf *m, void *v)
6970d163575Sopenharmony_ci{
6980d163575Sopenharmony_ci    (void)v;
6990d163575Sopenharmony_ci    (void)OsShellCmdTskInfoGet(OS_ALL_TASK_MASK, m, OS_PROCESS_INFO_ALL);
7000d163575Sopenharmony_ci    return 0;
7010d163575Sopenharmony_ci}
7020d163575Sopenharmony_ci
7030d163575Sopenharmony_cistatic const struct ProcFileOperations PROCESS_PROC_FOPS = {
7040d163575Sopenharmony_ci    .read       = ProcessProcFill,
7050d163575Sopenharmony_ci};
7060d163575Sopenharmony_ci
7070d163575Sopenharmony_civoid ProcProcessInit(void)
7080d163575Sopenharmony_ci{
7090d163575Sopenharmony_ci    struct ProcDirEntry *pde = CreateProcEntry("process", 0, NULL);
7100d163575Sopenharmony_ci    if (pde == NULL) {
7110d163575Sopenharmony_ci        PRINT_ERR("create /proc/process error!\n");
7120d163575Sopenharmony_ci        return;
7130d163575Sopenharmony_ci    }
7140d163575Sopenharmony_ci    pde->procFileOps = &PROCESS_PROC_FOPS;
7150d163575Sopenharmony_ci
7160d163575Sopenharmony_ci#ifdef LOSCFG_PROC_PROCESS_DIR
7170d163575Sopenharmony_ci    int ret = ProcCreateProcessDir(OS_INVALID_VALUE, 0);
7180d163575Sopenharmony_ci    if (ret < 0) {
7190d163575Sopenharmony_ci        PRINT_ERR("Create proc process self dir failed!\n");
7200d163575Sopenharmony_ci    }
7210d163575Sopenharmony_ci
7220d163575Sopenharmony_ci    ret = ProcCreateProcessDir(OS_USER_ROOT_PROCESS_ID, (uintptr_t)OsGetUserInitProcess());
7230d163575Sopenharmony_ci    if (ret < 0) {
7240d163575Sopenharmony_ci        PRINT_ERR("Create proc process %d dir failed!\n", OS_USER_ROOT_PROCESS_ID);
7250d163575Sopenharmony_ci    }
7260d163575Sopenharmony_ci#endif
7270d163575Sopenharmony_ci    return;
7280d163575Sopenharmony_ci}
729