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