00001 /* 00002 * TOPPERS/ASP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Advanced Standard Profile Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00012 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00013 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00014 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00015 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00016 * スコード中に含まれていること. 00017 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00018 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00019 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00020 * の無保証規定を掲載すること. 00021 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00022 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00023 * と. 00024 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00025 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00026 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00027 * 報告すること. 00028 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00029 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00030 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00031 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00032 * 免責すること. 00033 * 00034 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00035 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00036 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00037 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00038 * の責任を負わない. 00039 * 00040 * @(#) $Id: syslog.c 713 2008-01-01 02:14:21Z hiro $ 00041 */ 00042 00043 /* 00044 * システムログ機能 00045 */ 00046 00047 #include <sil.h> 00048 #undef TOPPERS_OMIT_SYSLOG 00049 #include <t_syslog.h> 00050 #include <log_output.h> 00051 #include "target_syssvc.h" 00052 #include "syslog.h" 00053 00054 /* 00055 * トレースログマクロのデフォルト定義 00056 */ 00057 #ifndef LOG_SYSLOG_WRI_LOG_ENTER 00058 #define LOG_SYSLOG_WRI_LOG_ENTER(prio, p_syslog) 00059 #endif /* LOG_SYSLOG_WRI_LOG_ENTER */ 00060 00061 #ifndef LOG_SYSLOG_WRI_LOG_LEAVE 00062 #define LOG_SYSLOG_WRI_LOG_LEAVE(ercd) 00063 #endif /* LOG_SYSLOG_WRI_LOG_LEAVE */ 00064 00065 #ifndef LOG_SYSLOG_REA_LOG_ENTER 00066 #define LOG_SYSLOG_REA_LOG_ENTER(p_syslog) 00067 #endif /* LOG_SYSLOG_REA_LOG_ENTER */ 00068 00069 #ifndef LOG_SYSLOG_REA_LOG_LEAVE 00070 #define LOG_SYSLOG_REA_LOG_LEAVE(ercd, p_syslog) 00071 #endif /* LOG_SYSLOG_REA_LOG_LEAVE */ 00072 00073 #ifndef LOG_SYSLOG_MSK_LOG_ENTER 00074 #define LOG_SYSLOG_MSK_LOG_ENTER(logmask, lowmask) 00075 #endif /* LOG_SYSLOG_MSK_LOG_ENTER */ 00076 00077 #ifndef LOG_SYSLOG_MSK_LOG_LEAVE 00078 #define LOG_SYSLOG_MSK_LOG_LEAVE(ercd) 00079 #endif /* LOG_SYSLOG_MSK_LOG_LEAVE */ 00080 00081 #ifndef LOG_SYSLOG_REF_LOG_ENTER 00082 #define LOG_SYSLOG_REF_LOG_ENTER(pk_rlog) 00083 #endif /* LOG_SYSLOG_REF_LOG_ENTER */ 00084 00085 #ifndef LOG_SYSLOG_REF_LOG_LEAVE 00086 #define LOG_SYSLOG_REF_LOG_LEAVE(pk_rlog) 00087 #endif /* LOG_SYSLOG_REF_LOG_LEAVE */ 00088 00089 /* 00090 * 現在のシステム時刻 00091 * 00092 * ログ時刻を取り出すために,やむなく,カーネルの内部変数を参照してい 00093 * る. 00094 */ 00095 extern ulong_t _kernel_current_time; 00096 00097 /* 00098 * ログバッファとそれにアクセスするためのポインタ 00099 */ 00100 static SYSLOG syslog_buffer[TCNT_SYSLOG_BUFFER]; /* ログバッファ */ 00101 static uint_t syslog_count; /* ログバッファ中のログの数 */ 00102 static uint_t syslog_head; /* 先頭のログの格納位置 */ 00103 static uint_t syslog_tail; /* 次のログの格納位置 */ 00104 static uint_t syslog_lost; /* 失われたログの数 */ 00105 00106 /* 00107 * 出力すべきログ情報の重要度(ビットマップ) 00108 */ 00109 static uint_t syslog_logmask; /* ログバッファに記録すべき重要度 */ 00110 static uint_t syslog_lowmask; /* 低レベル出力すべき重要度 */ 00111 00112 /* 00113 * システムログ機能の初期化 00114 */ 00115 void 00116 syslog_initialize(intptr_t exinf) 00117 { 00118 syslog_count = 0U; 00119 syslog_head = syslog_tail = 0U; 00120 syslog_lost = 0U; 00121 00122 syslog_logmask = 0U; 00123 syslog_lowmask = LOG_UPTO(LOG_NOTICE); 00124 } 00125 00126 /* 00127 * ログ情報の出力 00128 * 00129 * CPUロック状態や実行コンテキストによらず動作できるように実装してある. 00130 */ 00131 ER 00132 syslog_wri_log(uint_t prio, SYSLOG *p_syslog) 00133 { 00134 SIL_PRE_LOC; 00135 00136 LOG_SYSLOG_WRI_LOG_ENTER(prio, p_syslog); 00137 SIL_LOC_INT(); 00138 00139 /* 00140 * ログ時刻の設定 00141 */ 00142 p_syslog->logtim = _kernel_current_time; 00143 00144 /* 00145 * ログバッファに記録 00146 */ 00147 if ((syslog_logmask & LOG_MASK(prio)) != 0U) { 00148 syslog_buffer[syslog_tail] = *p_syslog; 00149 syslog_tail++; 00150 if (syslog_tail >= TCNT_SYSLOG_BUFFER) { 00151 syslog_tail = 0U; 00152 } 00153 if (syslog_count < TCNT_SYSLOG_BUFFER) { 00154 syslog_count++; 00155 } 00156 else { 00157 syslog_head = syslog_tail; 00158 syslog_lost++; 00159 } 00160 } 00161 00162 /* 00163 * 低レベル出力 00164 */ 00165 if ((syslog_lowmask & LOG_MASK(prio)) != 0U) { 00166 syslog_print(p_syslog, target_fput_log); 00167 (*target_fput_log)('\n'); 00168 } 00169 00170 SIL_UNL_INT(); 00171 LOG_SYSLOG_WRI_LOG_LEAVE(E_OK); 00172 return(E_OK); 00173 } 00174 00175 /* 00176 * ログバッファからの読出し 00177 * 00178 * CPUロック状態や実行コンテキストによらず動作できるように実装してある. 00179 */ 00180 ER_UINT 00181 syslog_rea_log(SYSLOG *p_syslog) 00182 { 00183 ER_UINT ercd; 00184 SIL_PRE_LOC; 00185 00186 LOG_SYSLOG_REA_LOG_ENTER(p_syslog); 00187 SIL_LOC_INT(); 00188 00189 /* 00190 * ログバッファからの取出し 00191 */ 00192 if (syslog_count > 0U) { 00193 *p_syslog = syslog_buffer[syslog_head]; 00194 syslog_count--; 00195 syslog_head++; 00196 if (syslog_head >= TCNT_SYSLOG_BUFFER) { 00197 syslog_head = 0U; 00198 } 00199 ercd = (ER_UINT) syslog_lost; 00200 syslog_lost = 0U; 00201 } 00202 else { 00203 ercd = E_OBJ; 00204 } 00205 00206 SIL_UNL_INT(); 00207 LOG_SYSLOG_REA_LOG_LEAVE(ercd, p_syslog); 00208 return(ercd); 00209 } 00210 00211 /* 00212 * 出力すべきログ情報の重要度の設定 00213 */ 00214 ER 00215 syslog_msk_log(uint_t logmask, uint_t lowmask) 00216 { 00217 LOG_SYSLOG_MSK_LOG_ENTER(logmask, lowmask); 00218 syslog_logmask = logmask; 00219 syslog_lowmask = lowmask; 00220 LOG_SYSLOG_MSK_LOG_LEAVE(E_OK); 00221 return(E_OK); 00222 } 00223 00224 /* 00225 * ログバッファの状態参照 00226 */ 00227 ER_UINT 00228 syslog_ref_log(T_SYSLOG_RLOG *pk_rlog) 00229 { 00230 SIL_PRE_LOC; 00231 00232 LOG_SYSLOG_REF_LOG_ENTER(pk_rlog); 00233 SIL_LOC_INT(); 00234 00235 pk_rlog->count = syslog_count; 00236 pk_rlog->lost = syslog_lost; 00237 pk_rlog->logmask = syslog_logmask; 00238 pk_rlog->lowmask = syslog_lowmask; 00239 00240 SIL_UNL_INT(); 00241 LOG_SYSLOG_REF_LOG_LEAVE(pk_rlog); 00242 return(E_OK); 00243 }
Copyright © 2008 by Kijineko Inc.