mirror of
https://github.com/rvtr/TwlIPL.git
synced 2025-10-31 06:01:12 -04:00
初版:エラーログ出力ライブラリ
git-svn-id: file:///Users/lillianskinner/Downloads/platinum/twl/TwlIPL/trunk@1787 b08762b0-b915-fc4b-9d8c-17b2551a87ff
This commit is contained in:
parent
0bd887d3c1
commit
0154104dd8
54
build/libraries_sysmenu/errorLog/ARM9/Makefile
Normal file
54
build/libraries_sysmenu/errorLog/ARM9/Makefile
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlIPL - NAMUT
|
||||||
|
# File: Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2008 Nintendo. All rights reserved.
|
||||||
|
#
|
||||||
|
# These coded instructions, statements, and computer programs contain
|
||||||
|
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
# Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
# not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
# in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
#
|
||||||
|
# $Date:: $
|
||||||
|
# $Rev$
|
||||||
|
# $Author$
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SUBDIRS =
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
TARGET_FIRM = SYSTEMMENU
|
||||||
|
TARGET_PLATFORM = TWL
|
||||||
|
TWL_ARCHGEN = LIMITED
|
||||||
|
TWL_PROC = ARM9
|
||||||
|
|
||||||
|
INCDIR = include
|
||||||
|
|
||||||
|
SRCS = errorLog.c
|
||||||
|
|
||||||
|
TARGET_LIB = liberrorlog$(TWL_LIBSUFFIX).a
|
||||||
|
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
INSTALL_TARGETS = $(TARGETS)
|
||||||
|
INSTALL_DIR = $(SYSMENU_INSTALL_LIBDIR)
|
||||||
|
|
||||||
|
CCFLAGS += -DSMALL_CODE_SIZE \
|
||||||
|
-DSTANDALONE \
|
||||||
|
-DOPT_32_BIT \
|
||||||
|
-DNO_SPLIT \
|
||||||
|
-DNO_FP_API \
|
||||||
|
-DNO_R_DIAG \
|
||||||
|
-DNO_STDIO_H \
|
||||||
|
-DNO_STDLIB_H
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
461
build/libraries_sysmenu/errorLog/ARM9/src/errorLog.c
Normal file
461
build/libraries_sysmenu/errorLog/ARM9/src/errorLog.c
Normal file
@ -0,0 +1,461 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlIPL - ErrorLog
|
||||||
|
File: errorLog.c
|
||||||
|
|
||||||
|
Copyright **** Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// Fatal error発生時に"nand:/sys/log/sysmenu.log"にログを吐くためのライブラリ
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
#include <twl.h>
|
||||||
|
#include <nitro/fs.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sysmenu.h>
|
||||||
|
#include <sysmenu/errorLog.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define ERRORLOG_DIRECTORYPATH "nand:/sys/log"
|
||||||
|
#define ERRORLOG_FILEPATH "nand:/sys/log/sysmenu.log"
|
||||||
|
#define ERRORLOG_BAR "======================"
|
||||||
|
#define ERRORLOG_WRITE_FORMAT "#%02lu-%02lu-%02lu[%3s] %02lu:%02lu:%02lu ErrorCode: %llu\n%s \n"ERRORLOG_BAR"\n\0"
|
||||||
|
#define ERRORLOG_READ_FORMAT "#%2lu-%2lu-%2lu[%3s] %2lu:%2lu:%2lu ErrorCode: %llu\n%*s \n"ERRORLOG_BAR"\n\0"
|
||||||
|
|
||||||
|
#define ERRORLOG_SIZE ( 16 * 1024 ) // ファイルは16KBサイズ固定
|
||||||
|
#define ERRORLOG_BUFSIZE 128 // 一番長い名前のエラーでも128字以内に収まる
|
||||||
|
#define ERRORLOG_NUM_ENTRY ( ERRORLOG_SIZE / ERRORLOG_BUFSIZE ) // ログに書き込まれるエントリの最大数
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// 内部関数SYSMi_CheckAndCreateDirectoryのエラーチェッカ
|
||||||
|
typedef enum CheckStatus {
|
||||||
|
CHECK_EXIST = 0,
|
||||||
|
CHECK_CREATE = 1,
|
||||||
|
CHECK_FAILED = 2
|
||||||
|
} CheckStatus;
|
||||||
|
|
||||||
|
// 既に書き込まれたエラーログを表現するためのエントリ
|
||||||
|
typedef struct ErrorLogEntry{
|
||||||
|
// エラーのタイムスタンプ
|
||||||
|
u32 year;
|
||||||
|
u32 month;
|
||||||
|
u32 day;
|
||||||
|
char week[4]; // 曜日の3文字表現
|
||||||
|
u32 hour;
|
||||||
|
u32 minute;
|
||||||
|
u32 second;
|
||||||
|
// エラーコード
|
||||||
|
u64 errorCode;
|
||||||
|
} ErrorLogEntry;
|
||||||
|
|
||||||
|
// ログエラーのエントリを持つ
|
||||||
|
|
||||||
|
/*-- function prototype ----------------------*/
|
||||||
|
CheckStatus ELi_CheckAndCreateDirectory( const char *path );
|
||||||
|
CheckStatus ELi_CheckAndCreateFile( FSFile *file, const char *path );
|
||||||
|
int ELi_ReadEntry( FSFile *file, ErrorLogEntry *entry );
|
||||||
|
BOOL ELi_SetString( char *buf, ErrorLogEntry *entry );
|
||||||
|
BOOL ELi_WriteLog( FSFile *file ,ErrorLogEntry *entry, int num, u64 err );
|
||||||
|
void ELi_fillSpace( char *buf, int bufsize );
|
||||||
|
|
||||||
|
static char *s_strWeek[7];
|
||||||
|
static char *s_strError[FATAL_ERROR_MAX];
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: EL_WriteErrorLog
|
||||||
|
|
||||||
|
Description: nand:/sys/log/sysmenu.logにエラーログを出力します。
|
||||||
|
|
||||||
|
|
||||||
|
Arguments: errorCode: 発生したエラーのエラーコード
|
||||||
|
|
||||||
|
Returns: 書き込みに成功したときはTRUEを、失敗したときはFALSEを返します。
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
BOOL EL_WriteErrorLog( u64 errorCode )
|
||||||
|
{
|
||||||
|
FSFile file;
|
||||||
|
ErrorLogEntry entry[ERRORLOG_NUM_ENTRY];
|
||||||
|
int numEntry = 0;
|
||||||
|
|
||||||
|
FS_InitFile( &file );
|
||||||
|
|
||||||
|
if( errorCode >= FATAL_ERROR_MAX )
|
||||||
|
{
|
||||||
|
// イリーガルなエラーコード
|
||||||
|
OS_TPrintf("EL Error: Illigal error code (%d)\n", errorCode);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !FS_IsAvailable() )
|
||||||
|
{
|
||||||
|
// FSがInitされてなかったらInitする
|
||||||
|
FS_Init( FS_DMA_NOT_USE );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ELi_CheckAndCreateDirectory( ERRORLOG_DIRECTORYPATH ) == CHECK_FAILED )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch ( ELi_CheckAndCreateFile( &file, ERRORLOG_FILEPATH ) )
|
||||||
|
{
|
||||||
|
case CHECK_FAILED:
|
||||||
|
return FALSE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CHECK_EXIST:
|
||||||
|
// 既にログファイルが存在していたら、そこからログを読み出す
|
||||||
|
numEntry = ELi_ReadEntry( &file, entry );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CHECK_CREATE:
|
||||||
|
// 新規にファイルが作られたなら何もしなくていい
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if( !ELi_WriteLog( &file, entry, numEntry+1 , errorCode ) )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ELi_CheckAndCreateDirectory
|
||||||
|
|
||||||
|
Description: この関数は該当ディレクトリが存在していれば何もしません。
|
||||||
|
該当ディレクトリが存在していなかった場合は
|
||||||
|
ディレクトリを作成します。
|
||||||
|
|
||||||
|
Arguments: path: チェックを行うディレクトリのパス
|
||||||
|
|
||||||
|
Returns: ディレクトリが存在した場合はCHECK_EXISTを、
|
||||||
|
存在しておらず作成した場合はCHECK_CREATEを、
|
||||||
|
ディレクトリ作成に失敗した場合はCHECK_FAILEDを返します。
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
CheckStatus ELi_CheckAndCreateDirectory( const char *path )
|
||||||
|
{
|
||||||
|
FSFile dir;
|
||||||
|
|
||||||
|
FS_InitFile( &dir );
|
||||||
|
|
||||||
|
if( FS_OpenDirectory( &dir, path, FS_FILEMODE_RW ) )
|
||||||
|
{
|
||||||
|
// ディレクトリが存在していたらそのままCloseして戻る
|
||||||
|
FS_CloseDirectory( &dir );
|
||||||
|
return CHECK_EXIST;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ディレクトリが存在しないのでディレクトリを作成
|
||||||
|
if( ! FS_CreateDirectory( path, FS_PERMIT_R | FS_PERMIT_W ) )
|
||||||
|
{
|
||||||
|
OS_TPrintf("EL Error: FS_CreateDirectory() failed. FSResult: %d\n", FS_GetArchiveResultCode(path) );
|
||||||
|
// ディレクトリ作成に失敗
|
||||||
|
return CHECK_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ディレクトリ作成に成功
|
||||||
|
return CHECK_CREATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ELi_CheckAndCreateFile
|
||||||
|
|
||||||
|
Description: この関数は該当ファイルが存在していれば何もしません。
|
||||||
|
該当ファイルが存在していなかった場合はファイルを作成します。
|
||||||
|
|
||||||
|
Arguments: file: FSFile構造体へのポインタ
|
||||||
|
path: チェックを行うファイルのパス
|
||||||
|
|
||||||
|
Returns: ファイルが存在した場合はCHECK_EXISTを、
|
||||||
|
存在しておらず作成した場合はCHECK_CREATEを、
|
||||||
|
ファイル作成に失敗した場合はCHECK_FAILEDを返します。
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
CheckStatus ELi_CheckAndCreateFile( FSFile *file, const char *path )
|
||||||
|
{
|
||||||
|
|
||||||
|
if( FS_OpenFileEx( file, path, FS_FILEMODE_RWL ) )
|
||||||
|
{
|
||||||
|
return CHECK_EXIST;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ファイルが存在しないので作成する
|
||||||
|
if( !FS_CreateFile( path, FS_PERMIT_R | FS_PERMIT_W ) )
|
||||||
|
{
|
||||||
|
OS_TPrintf("EL Error: FS_CreateFile() failed. FSResult: %d\n", FS_GetArchiveResultCode(path) );
|
||||||
|
// ファイル作成に失敗
|
||||||
|
return CHECK_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ファイル作成に成功
|
||||||
|
if( !FS_OpenFileEx( file, path, FS_FILEMODE_RW ) )
|
||||||
|
{
|
||||||
|
// 作成したファイルをopenできなかった場合
|
||||||
|
OS_TPrintf("EL Error: FS_OpenFileEx() failed. FSResult: %d\n", FS_GetArchiveResultCode(path) );
|
||||||
|
return CHECK_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( FS_SetFileLength( file, ERRORLOG_SIZE ) != FS_RESULT_SUCCESS )
|
||||||
|
{
|
||||||
|
// 作成したファイルのサイズを設定できなかった
|
||||||
|
OS_TPrintf("EL Error: FS_SetFileLength() failed. FSResult: %d\n", FS_GetArchiveResultCode(path) );
|
||||||
|
FS_CloseFile( file );
|
||||||
|
return CHECK_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// サイズ変更が終わったら、念のためファイルサイズ変更不可なRWLモードで開きなおしておく
|
||||||
|
FS_CloseFile( file );
|
||||||
|
|
||||||
|
if( !FS_OpenFileEx( file, path, FS_FILEMODE_RWL ) )
|
||||||
|
{
|
||||||
|
OS_TPrintf("EL Error: FS_OpenFileEx() failed. FSResult: %d\n", FS_GetArchiveResultCode(path) );
|
||||||
|
return CHECK_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ファイルのゼロ埋めを行う
|
||||||
|
{
|
||||||
|
char nullbuf[1024];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
MI_CpuClear8( nullbuf, 1024);
|
||||||
|
|
||||||
|
for(i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
FS_WriteFile( file, nullbuf, 1024);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CHECK_CREATE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ELi_ReadEntry
|
||||||
|
|
||||||
|
Description: ログファイルに書き込まれた過去のエントリを読み出す
|
||||||
|
|
||||||
|
Arguments: file: ログファイルのFSFile構造体
|
||||||
|
entry: エントリを書き込むバッファへのポインタ
|
||||||
|
|
||||||
|
Returns: 読み出したエントリの数
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int ELi_ReadEntry( FSFile *file, ErrorLogEntry *entry )
|
||||||
|
{
|
||||||
|
char buf[ERRORLOG_BUFSIZE+1];
|
||||||
|
int numEntry = 0;
|
||||||
|
|
||||||
|
buf[ERRORLOG_BUFSIZE] = '\0';
|
||||||
|
|
||||||
|
FS_SeekFileToBegin( file );
|
||||||
|
FS_ReadFile( file, buf, ERRORLOG_BUFSIZE );
|
||||||
|
|
||||||
|
// エントリの頭には必ず'#'が書き込まれているのでそれで判定
|
||||||
|
while( buf[0] == '#' )
|
||||||
|
{
|
||||||
|
// 決められたファイルフォーマットからエントリに読み込む
|
||||||
|
STD_TSScanf( buf, ERRORLOG_READ_FORMAT,
|
||||||
|
&(entry[numEntry].year) ,
|
||||||
|
&(entry[numEntry].month) ,
|
||||||
|
&(entry[numEntry].day) ,
|
||||||
|
&(entry[numEntry].week) ,
|
||||||
|
&(entry[numEntry].hour) ,
|
||||||
|
&(entry[numEntry].minute) ,
|
||||||
|
&(entry[numEntry].second) ,
|
||||||
|
&(entry[numEntry].errorCode) );
|
||||||
|
|
||||||
|
numEntry++;
|
||||||
|
|
||||||
|
FS_ReadFile( file, buf, ERRORLOG_BUFSIZE );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return numEntry;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ELi_SetString
|
||||||
|
|
||||||
|
Description: バッファに書き込むべきログデータをセットします。
|
||||||
|
|
||||||
|
Arguments: buf: 文字列をセットするバッファへのポインタ
|
||||||
|
entry: エラー内容のエントリ
|
||||||
|
|
||||||
|
Returns: 成功した場合はTRUE、失敗した場合はFALSEが返ります。
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
BOOL ELi_SetString( char *buf, ErrorLogEntry *entry )
|
||||||
|
{
|
||||||
|
STD_TSNPrintf(buf, ERRORLOG_BUFSIZE, ERRORLOG_WRITE_FORMAT,
|
||||||
|
entry->year, entry->month, entry->day, entry->week,
|
||||||
|
entry->hour, entry->minute, entry->second,
|
||||||
|
entry->errorCode, s_strError[entry->errorCode] );
|
||||||
|
|
||||||
|
// 余りをスペースで埋めて、改行で終端する
|
||||||
|
ELi_fillSpace( buf, ERRORLOG_BUFSIZE );
|
||||||
|
buf[ ERRORLOG_BUFSIZE-1 ] = '\n';
|
||||||
|
|
||||||
|
//OS_TPrintf("set String...\n%s", buf );
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Name: ELi_WriteLog
|
||||||
|
|
||||||
|
Description: 受け取ったエントリの中身をログファイルに書き出します。
|
||||||
|
|
||||||
|
Arguments: file: ログファイルのFSFile構造体へのポインタ
|
||||||
|
entry: エラー内容のエントリの配列ポインタ
|
||||||
|
num: entryに含まれるエントリの数
|
||||||
|
err: 今回発生したエラーのエラーコード
|
||||||
|
|
||||||
|
Returns: 成功した場合はTRUE、失敗した場合はFALSEが返ります。
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
BOOL ELi_WriteLog( FSFile *file ,ErrorLogEntry *entry, int num, u64 err )
|
||||||
|
{
|
||||||
|
RTCDate date;
|
||||||
|
RTCTime time;
|
||||||
|
RTCResult rtcRes;
|
||||||
|
|
||||||
|
int entryIdx = 0;
|
||||||
|
char buf[ERRORLOG_BUFSIZE];
|
||||||
|
|
||||||
|
// ファイル数チェック
|
||||||
|
if( num >= ERRORLOG_NUM_ENTRY )
|
||||||
|
{
|
||||||
|
entryIdx++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ファイルの頭に戻って書き込みなおす
|
||||||
|
FS_SeekFileToBegin( file );
|
||||||
|
|
||||||
|
for( ; entryIdx < num - 1; entryIdx++ )
|
||||||
|
{
|
||||||
|
ELi_SetString( buf, &entry[entryIdx] );
|
||||||
|
|
||||||
|
if( FS_WriteFile( file, buf, (s32)ERRORLOG_BUFSIZE ) == -1 )
|
||||||
|
{
|
||||||
|
OS_TPrintf("EL Error: FS_WriteFile() failed. entry: %d\n", entryIdx );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 最後の一つは自前でRTCを取得して書き込む
|
||||||
|
if( ( rtcRes = RTC_GetDateTime( &date, &time )) != RTC_RESULT_SUCCESS)
|
||||||
|
{
|
||||||
|
OS_TPrintf("EL Error: RTC getDateTime() Failed! Status:%d\n", rtcRes);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
snprintf( buf, ERRORLOG_BUFSIZE, ERRORLOG_WRITE_FORMAT,
|
||||||
|
date.year, date.month, date.day, s_strWeek[ date.week ],
|
||||||
|
time.hour, time.minute, time.second,
|
||||||
|
err, s_strError[ err ] );
|
||||||
|
|
||||||
|
// エントリ一つのサイズをきっちり128バイト固定にするために余白分を空白で埋めて
|
||||||
|
// \0で終端する
|
||||||
|
ELi_fillSpace( buf, ERRORLOG_BUFSIZE );
|
||||||
|
buf[ERRORLOG_BUFSIZE-1] = '\0';
|
||||||
|
|
||||||
|
// 最後のエントリをファイルに書き出す
|
||||||
|
if( FS_WriteFile( file, buf, (s32)strlen(buf) ) == -1 )
|
||||||
|
{
|
||||||
|
OS_TPrintf("EL Error: FS_WriteFile() failed.\n" );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ファイルの余りを0埋めする
|
||||||
|
// open modeがサイズ固定なのでファイル終端を気にせず書き込む
|
||||||
|
MI_CpuClear8( buf, ERRORLOG_BUFSIZE );
|
||||||
|
while ( FS_WriteFile( file, buf, (s32) ERRORLOG_BUFSIZE ) == ERRORLOG_BUFSIZE ) {};
|
||||||
|
|
||||||
|
|
||||||
|
if( !FS_CloseFile( file ) )
|
||||||
|
{
|
||||||
|
OS_TPrintf("EL Error: FS_CloseFile() failed.\n" );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ELi_fillSpace( char *buf, int bufsize )
|
||||||
|
{
|
||||||
|
// エントリの末尾にスペースを入れて
|
||||||
|
// 一つのエントリがちょうど128バイトになるように辻褄を合わせる
|
||||||
|
u32 length = strlen( buf );
|
||||||
|
MI_CpuFill8( &buf[length], ' ', bufsize - length );
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *s_strWeek[] = {
|
||||||
|
"SUN",
|
||||||
|
"MON",
|
||||||
|
"TUE",
|
||||||
|
"WED",
|
||||||
|
"THU",
|
||||||
|
"FRI",
|
||||||
|
"SAT"
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *s_strError[] = {
|
||||||
|
"FATAL_ERROR_UNDEFINED",
|
||||||
|
"FATAL_ERROR_NAND",
|
||||||
|
"FATAL_ERROR_HWINFO_NORMAL",
|
||||||
|
"FATAL_ERROR_HWINFO_SECURE",
|
||||||
|
"FATAL_ERROR_TWLSETTINGS",
|
||||||
|
"FATAL_ERROR_SHARED_FONT",
|
||||||
|
"FATAL_ERROR_WLANFIRM_AUTH",
|
||||||
|
"FATAL_ERROR_WLANFIRM_LOAD",
|
||||||
|
"FATAL_ERROR_TITLE_LOAD_FAILED",
|
||||||
|
"FATAL_ERROR_TITLE_POINTER_ERROR",
|
||||||
|
"FATAL_ERROR_AUTHENTICATE_FAILED",
|
||||||
|
"FATAL_ERROR_ENTRY_ADDRESS_ERROR",
|
||||||
|
"FATAL_ERROR_TITLE_BOOTTYPE_ERROR",
|
||||||
|
"FATAL_ERROR_SIGN_DECRYPTION_FAILED",
|
||||||
|
"FATAL_ERROR_SIGN_COMPARE_FAILED",
|
||||||
|
"FATAL_ERROR_HEADER_HASH_CALC_FAILED",
|
||||||
|
"FATAL_ERROR_TITLEID_COMPARE_FAILED",
|
||||||
|
"FATAL_ERROR_VALID_SIGN_FLAG_OFF",
|
||||||
|
"FATAL_ERROR_CHECK_TITLE_LAUNCH_RIGHTS_FAILED",
|
||||||
|
"FATAL_ERROR_MODULE_HASH_CHECK_FAILED",
|
||||||
|
"FATAL_ERROR_MODULE_HASH_CALC_FAILED",
|
||||||
|
"FATAL_ERROR_MEDIA_CHECK_FAILED",
|
||||||
|
"FATAL_ERROR_DL_MAGICCODE_CHECK_FAILED",
|
||||||
|
"FATAL_ERROR_DL_SIGN_DECRYPTION_FAILED",
|
||||||
|
"FATAL_ERROR_DL_HASH_CALC_FAILED",
|
||||||
|
"FATAL_ERROR_DL_SIGN_COMPARE_FAILED",
|
||||||
|
"FATAL_ERROR_WHITELIST_INITDB_FAILED",
|
||||||
|
"FATAL_ERROR_WHITELIST_NOTFOUND",
|
||||||
|
"FATAL_ERROR_DHT_PHASE1_FAILED",
|
||||||
|
"FATAL_ERROR_DHT_PHASE2_FAILED",
|
||||||
|
"FATAL_ERROR_LANDING_TMP_JUMP_FLAG_OFF",
|
||||||
|
"FATAL_ERROR_TWL_BOOTTYPE_UNKNOWN",
|
||||||
|
"FATAL_ERROR_NTR_BOOTTYPE_UNKNOWN",
|
||||||
|
"FATAL_ERROR_PLATFORM_UNKNOWN",
|
||||||
|
"FATAL_ERROR_LOAD_UNFINISHED"
|
||||||
|
};
|
||||||
31
build/libraries_sysmenu/errorLog/Makefile
Normal file
31
build/libraries_sysmenu/errorLog/Makefile
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
#! make -f
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
# Project: TwlIPL - NAMUT
|
||||||
|
# File: Makefile
|
||||||
|
#
|
||||||
|
# Copyright 2008 Nintendo. All rights reserved.
|
||||||
|
#
|
||||||
|
# These coded instructions, statements, and computer programs contain
|
||||||
|
# proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
# Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
# not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
# in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
#
|
||||||
|
# $Date:: $
|
||||||
|
# $Rev$
|
||||||
|
# $Author$
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
SUBDIRS = ARM9
|
||||||
|
|
||||||
|
TARGET_FIRM = SYSTEMMENU
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/commondefs
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
do-build: $(TARGETS)
|
||||||
|
|
||||||
|
include $(TWL_IPL_RED_ROOT)/build/buildtools/modulerules
|
||||||
|
|
||||||
|
#===== End of Makefile =====
|
||||||
41
include/sysmenu/errorLog.h
Normal file
41
include/sysmenu/errorLog.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*---------------------------------------------------------------------------*
|
||||||
|
Project: TwlIPL - ErrorLog
|
||||||
|
File: errorLog.h
|
||||||
|
|
||||||
|
Copyright **** Nintendo. All rights reserved.
|
||||||
|
|
||||||
|
These coded instructions, statements, and computer programs contain
|
||||||
|
proprietary information of Nintendo of America Inc. and/or Nintendo
|
||||||
|
Company Ltd., and are protected by Federal copyright law. They may
|
||||||
|
not be disclosed to third parties or copied or duplicated in any form,
|
||||||
|
in whole or in part, without the prior written consent of Nintendo.
|
||||||
|
|
||||||
|
$Date:: $
|
||||||
|
$Rev$
|
||||||
|
$Author$
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __SYSM_ERRORLOG__
|
||||||
|
#define __SYSM_ERRORLOG__
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SDK_ARM9
|
||||||
|
|
||||||
|
/*-- function prototype -------------------------*/
|
||||||
|
extern BOOL EL_WriteErrorLog( u64 errorCode );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif // SDK_ARM9
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue
Block a user