📄 system.c
字号:
/* *---------------------------------------------------------------------- * T-Kernel * * Copyright (C) 2004 by Ken Sakamura. All rights reserved. * T-Kernel is distributed under the T-License. *---------------------------------------------------------------------- * * Version: 1.01.00 * Released by T-Engine Forum(http://www.t-engine.org) at 2004/6/28. * *---------------------------------------------------------------------- *//* * system.c (T-Kernel/SM) * System Information Management Function * System Memory Management Function */#include "sysmgr.h"#include "syslog.h"#include <sys/imalloc.h>#include <sys/commarea.h>#include <sys/svc/ifsysmgr.h>#include <sys/sysinfo.h>#define SYSCONF ( SCInfo.sysconf )#define DEVCONF ( SCInfo.devconf )/* ------------------------------------------------------------------------ *//* * System information management function *//* * Search 'name' information * If it is not found, return NULL. */LOCAL UB* search_conf( UB *cp, UB *name ){ INT len = strlen(name); UB *p; while ( *cp != '\0' ) { if ( *cp == name[0] ) { for ( p = cp; *p > ' ' && *p != '#'; ++p ); if ( p - cp == len && memcmp(cp, name, len) == 0 ) { return cp; /* Found */ } } /* Next */ while ( *cp != '\0' && *cp++ != '\n' ); } return NULL;}/* * Skip to the next word * If it is the end, return NULL. */LOCAL UB* skip_next( UB *p ){ UB c; /* Skip reading current word */ while ( (c = *p) > ' ' && c != '#' ) ++p; /* Skip reading word separators */ while ( (c = *p) != '\0' ) { if ( c == '\n' || c == '#' ) break; if ( c > ' ' ) return p; p++; } return NULL;}/* * Get numeric value information */LOCAL INT getcfn( UB *conf, UB *name, INT *val, INT max ){ UB *p; INT v, n; p = search_conf(conf, name); if ( p == NULL ) return E_NOEXS; /* Not found */ n = 0; while ( (p = skip_next(p)) != NULL ) { v = strtol((char*)p, (char**)&p, 0); if ( max-- > 0 ) *val++ = v; n++; } return n;}/* * Get string information */LOCAL INT getcfs( UB *conf, UB *name, UB *bp, INT max ){ UB *p, *sp, c; p = search_conf(conf, name); if ( p == NULL ) return E_NOEXS; /* Not found */ sp = skip_next(p); if ( sp == NULL ) return 0; /* Date is not defined */ for ( p = sp; (c = *p) != '\0'; ++p ) { if ( c == '\n' || c == '#' ) break; if ( max-- > 0 ) *bp++ = c; } if ( max > 0 ) *bp = '\0'; return p - sp;}/* * Get system information (numeric values) * Call directly from T-Kernel/OS. * Do not call system call and extension SVC because * they are also called during starting system. */EXPORT INT _tk_get_cfn( UB *name, INT *val, INT max ){ INT n; n = getcfn(SYSCONF, name, val, max); if ( n < 0 ) { n = getcfn(DEVCONF, name, val, max); } if ( n < 0 ) goto err_ret; return n;err_ret: BMS_DEBUG_PRINT(("_tk_get_cfn err = %d\n", n)); return n;}/* * Get system information (numeric values) */LOCAL INT __tk_get_cfn( UB *name, INT *val, INT max ){ ER err; err = ChkSpaceBstrR(name, 0); if ( err < E_OK ) goto err_ret; err = ChkSpaceRW(val, sizeof(INT) * max); if ( err < E_OK ) goto err_ret; err = _tk_get_cfn(name, val, max); if ( err < E_OK ) goto err_ret; return err;err_ret: DEBUG_PRINT(("__tk_get_cfn err = %d\n", err)); return err;}/* * Get system information (strings) * Call directly from T-Kernel/OS. * Do not call system call and extension SVC because * they are also called during starting system. */EXPORT INT _tk_get_cfs( UB *name, UB *buf, INT max ){ INT n; n = getcfs(SYSCONF, name, buf, max); if ( n < 0 ) { n = getcfs(DEVCONF, name, buf, max); } if ( n < 0 ) goto err_ret; return n;err_ret: BMS_DEBUG_PRINT(("_tk_get_cfs err = %d\n", n)); return n;}/* * Get system information (strings) */LOCAL INT __tk_get_cfs( UB *name, UB *buf, INT max ){ ER err; err = ChkSpaceBstrR(name, 0); if ( err < E_OK ) goto err_ret; err = ChkSpaceRW(buf, max); if ( err < E_OK ) goto err_ret; err = _tk_get_cfs(name, buf, max); if ( err < E_OK ) goto err_ret; return err;err_ret: DEBUG_PRINT(("__tk_get_cfs err = %d\n", err)); return err;}/* ------------------------------------------------------------------------ *//* * System memory management function * * Only the extension SVC entry part is processed. Real memory * management function is in virtual storage system and real storage * system respectively. * In virtual storage system, execute by the upper memory management * function. * Real storage system has the memory management function in * T-Kernel/SM. */#define VALID_MEMATR (TA_RNG3 | TA_NORESIDENT | TA_NOCACHE)/* * Get system memory */LOCAL ER _tk_get_smb( VP *addr, INT nblk, UINT attr ){ ER err; if ( (attr & ~VALID_MEMATR) != 0 ) { err = E_PAR; goto err_ret; } err = ChkSpaceRW(addr, sizeof(VP)); if ( err < E_OK ) goto err_ret; *addr = GetSysMemBlk(nblk, attr); if ( *addr == NULL ) { err = E_NOMEM; goto err_ret; } return E_OK;err_ret: DEBUG_PRINT(("_tk_get_smb err = %d\n", err)); return err;}/* * Free system memory */LOCAL ER _tk_rel_smb( VP addr ){ ER err; err = RelSysMemBlk(addr); if ( err < E_OK ) goto err_ret; return E_OK;err_ret: DEBUG_PRINT(("_tk_rel_smb err = %d\n", err)); return err;}/* * Get system memory information */LOCAL ER _tk_ref_smb( T_RSMB *pk_rsmb ){ ER err; err = ChkSpaceRW(pk_rsmb, sizeof(T_RSMB)); if ( err < E_OK ) goto err_ret; err = RefSysMemInfo(pk_rsmb); if ( err < E_OK ) goto err_ret; return E_OK;err_ret: DEBUG_PRINT(("_tk_ref_smb err = %d\n", err)); return err;}/* ------------------------------------------------------------------------ *//* * Kernel shared data */LOCAL CommArea _CommArea; /* Kernel shared data area */IMPORT CommArea *__CommArea; /* libtk *//* * Get Kernel shared data */LOCAL ER __GetKernelCommonArea( CommArea **area ){ *area = &_CommArea; return E_OK;}/* * Kernel shared data initial setting */LOCAL void initKernelCommonArea( void ){ INT n, val; __CommArea = &_CommArea; n = _tk_get_cfn("TEV_FFLock", &val, 1); _CommArea.tev_fflock = ( n > 0 )? val: 0;}/* ------------------------------------------------------------------------ *//* * Extension SVC entry */LOCAL INT sysmgr_svcentry( VP pk_para, FN fncd ){ ER err; switch ( fncd ) { /* Ignore protection level */ case SYSTEM_TK_GET_CFN_FN: case SYSTEM_TK_GET_CFS_FN: case SYSTEM__SYSLOG_SEND_FN: break; default: /* Test call protection level */ err = ChkCallPLevel(); if ( err < E_OK ) goto err_ret; } switch ( fncd ) { case SYSTEM_TK_GET_CFN_FN: { SYSTEM_TK_GET_CFN_PARA *p = pk_para; return __tk_get_cfn(p->name, p->val, p->max); } case SYSTEM_TK_GET_CFS_FN: { SYSTEM_TK_GET_CFS_PARA *p = pk_para; return __tk_get_cfs(p->name, p->buf, p->max); } case SYSTEM_TK_GET_SMB_FN: { SYSTEM_TK_GET_SMB_PARA *p = pk_para; return _tk_get_smb(p->addr, p->nblk, p->attr); } case SYSTEM_TK_REL_SMB_FN: { SYSTEM_TK_REL_SMB_PARA *p = pk_para; return _tk_rel_smb(p->addr); } case SYSTEM_TK_REF_SMB_FN: { SYSTEM_TK_REF_SMB_PARA *p = pk_para; return _tk_ref_smb(p->pk_rsmb); } case SYSTEM__GETKERNELCOMMONAREA_FN: { SYSTEM__GETKERNELCOMMONAREA_PARA *p = pk_para; return __GetKernelCommonArea(p->area); } case SYSTEM__SYSLOG_SEND_FN: { SYSTEM__SYSLOG_SEND_PARA *p = pk_para; return __syslog_send(p->string, p->len); } } err = E_RSFN;err_ret: DEBUG_PRINT(("sysmgr_svcentry err = %d\n", err)); return err;}/* * Initialization of system management */EXPORT ER initialize_sysmgr( void ){ T_DSSY dssy; ER err; /* Kernel shared data area setting */ initKernelCommonArea(); /* syslog initialization sequence */ err = initialize_syslog(); if ( err < E_OK ) goto err_ret; /* subsystem registration */ dssy.ssyatr = TA_NULL; dssy.ssypri = SYSTEM_PRI; dssy.svchdr = (FP)&sysmgr_svcentry; dssy.breakfn = NULL; dssy.startupfn = NULL; dssy.cleanupfn = NULL; dssy.eventfn = NULL; dssy.resblksz = 0; err = tk_def_ssy(SYSTEM_SVC, &dssy); if ( err < E_OK ) goto err_ret; return E_OK;err_ret: DEBUG_PRINT(("initialize_sysmgr err = %d\n", err)); return err;}/* * Finalization sequence of system management */EXPORT ER finish_sysmgr( void ){ ER err, error = E_OK; /* Unregister subsystem */ err = tk_def_ssy(SYSTEM_SVC, NULL); if ( err < E_OK ) error = err; /* syslog finalization sequence */ err = finish_syslog(); if ( err < E_OK ) error = err;#ifdef DEBUG if ( error < E_OK ) DEBUG_PRINT(("finish_sysmgr err = %d\n", error));#endif return error;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -