trunk r355,356,357,394のマージ

git-svn-id: file:///Volumes/Transfer/gigaleak_20231201/2020-05-23%20-%20ctr.7z%20+%20svn_v1.068.zip/ctr/svn/ctr_Repair@395 385bec56-5757-e545-9c3a-d8741f4650f1
This commit is contained in:
N2614 2011-07-25 06:49:03 +00:00
parent 80dfa3e041
commit 1103dd42a9
10 changed files with 339 additions and 29 deletions

View File

@ -0,0 +1,59 @@
/*---------------------------------------------------------------------------*
Project: Horizon
File: HeapManager.cpp
Copyright 2009 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.
$Rev$
*---------------------------------------------------------------------------*/
#include "HeapManager.h"
nn::fnd::ThreadSafeExpHeap s_AppHeap;
HeapManager::HeapManager(size_t byteSize, s32 alignment, bit8 groupId, nn::fnd::ExpHeapBase::AllocationMode mode, bool reuse)
{
m_Ptr = s_AppHeap.Allocate(byteSize, alignment, groupId, mode, reuse);
}
HeapManager::~HeapManager()
{
if(m_Ptr != NULL)
{
s_AppHeap.Free(m_Ptr);
}
}
void* HeapManager::GetAddr()
{
return m_Ptr;
}
void InitializeHeap()
{
s_AppHeap.Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR);
}
size_t GetAllocatableSize(s32 alignment)
{
return s_AppHeap.GetAllocatableSize(alignment);
}
void* ForceAllocate(size_t byteSize, s32 alignment, bit8 groupId, nn::fnd::ExpHeapBase::AllocationMode mode, bool reuse)
{
return s_AppHeap.Allocate(byteSize, alignment, groupId, mode, reuse);
}
void ForceFree(void* ptr)
{
if(ptr != NULL)
{
s_AppHeap.Free(ptr);
}
}

View File

@ -0,0 +1,46 @@
/*---------------------------------------------------------------------------*
Project: Horizon
File: HeapManager.h
Copyright 2009 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.
$Rev$
*---------------------------------------------------------------------------*/
#ifndef HEAPMANAGER_H_
#define HEAPMANAGER_H_
#include <nn.h>
#include <nn/fnd.h>
class HeapManager
{
public:
explicit HeapManager(size_t byteSize, s32 alignment = nn::fnd::ExpHeapBase::DEFAULT_ALIGNMENT, bit8 groupId = 0,
nn::fnd::ExpHeapBase::AllocationMode mode = nn::fnd::ExpHeapBase::ALLOCATION_MODE_FIRST_FIT, bool reuse = false);
virtual ~HeapManager();
void* GetAddr();
private:
void* m_Ptr;
};
void InitializeHeap();
size_t GetAllocatableSize(s32 alignment = nn::fnd::ExpHeapBase::DEFAULT_ALIGNMENT);
// HeapManagerを使わず確保する場合のみ
void* ForceAllocate(size_t byteSize, s32 alignment = nn::fnd::ExpHeapBase::DEFAULT_ALIGNMENT, bit8 groupId = 0,
nn::fnd::ExpHeapBase::AllocationMode mode = nn::fnd::ExpHeapBase::ALLOCATION_MODE_FIRST_FIT, bool reuse = false);
// HeapManagerを使わず解放する場合のみ
void ForceFree(void* ptr);
#endif /* HEAPMANAGER_H_ */

View File

@ -23,12 +23,15 @@ INCLUDES += $(SAMPLED_DEMOS_COMMON_INCLUDE_DIR)
SOURCES[] = SOURCES[] =
main.cpp main.cpp
scrollBuffer.cpp scrollBuffer.cpp
VersionDetect.cpp
HeapManager.cpp
LIBS += lib_demo \ LIBS += lib_demo \
libnn_am \ libnn_am \
libnn_cup \ libnn_cup \
libnn_ns \ libnn_ns \
ROMFS_ROOT = romfiles
DESCRIPTOR = $(HORIZON_ROOT)/resources/specfiles/SelfCup.desc DESCRIPTOR = $(HORIZON_ROOT)/resources/specfiles/SelfCup.desc

Binary file not shown.

View File

@ -0,0 +1,26 @@
BasicInfo:
Title: SelfCupTool
ProductCode: CTR-P-234A
BackupMemoryType: None
Logo: Nintendo
CardInfo:
CardDevice: None
TitleInfo:
Use: Evaluation
UniqueId: 0xf802a
Version: 0
SystemControlInfo:
AppType : Application
StackSize : 65536
Dependency:
- nwm
- socket
- ssl
- friends
- ac
- cecd
- boss
- ndm

View File

@ -0,0 +1,109 @@
/*---------------------------------------------------------------------------*
Project: Horizon
File: VersionDetect.cpp
Copyright 2009 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.
$Rev$
*---------------------------------------------------------------------------*/
#include <nn.h>
#include <nn/fs.h>
#include <nn/fs/CTR/MPCore/fs_FileSystemBasePrivate.h>
#include "VersionDetect.h"
#include "HeapManager.h"
void GetCupVersion(nn::pl::CTR::CardUpdateVersion* cup, nn::cfg::CTR::CfgRegionCode region)
{
nn::Result result;
const size_t BUF_SIZE = 1024;
u8 buf[BUF_SIZE];
// CUPバージョン
{
result = nn::fs::MountContent("cver:", nn::fs::MEDIA_TYPE_NAND, cCupVerId[region], 0, 1, 1, buf,
BUF_SIZE);
nn::fs::FileInputStream fis;
result = fis.TryInitialize(L"cver:/version.bin");
if (result.IsSuccess())
{
s64 fileSize = fis.GetSize();
NN_LOG("version.bin size = %lld\n", fileSize);
s32 ret;
void* addr = NULL;
HeapManager heap(fileSize);
addr = heap.GetAddr();
if (addr != NULL)
{
result = fis.TryRead(&ret, addr, fileSize);
if (result.IsSuccess())
{
nn::pl::CTR::CardUpdateVersion* ver_buf = reinterpret_cast<nn::pl::CTR::CardUpdateVersion*> (addr);
std::memcpy(cup, ver_buf, sizeof(nn::pl::CTR::CardUpdateVersion));
}
}
}
fis.Finalize();
nn::fs::Unmount("cver:");
}
}
void GetNupVersion(nn::pl::CTR::NetworkUpdateVersion* nup, nn::cfg::CTR::CfgRegionCode region)
{
nn::Result result;
const size_t BUF_SIZE = 1024;
u8 buf[BUF_SIZE];
// NUPバージョン
{
result = nn::fs::MountContent("nver:", nn::fs::MEDIA_TYPE_NAND, cNupVerId[region], 0, 1, 1, buf,
BUF_SIZE);
nn::fs::FileInputStream fis;
result = fis.TryInitialize(L"nver:/version.bin");
if (result.IsSuccess())
{
s64 fileSize = fis.GetSize();
NN_LOG("version.bin size = %lld\n", fileSize);
s32 ret;
void* addr = NULL;
HeapManager heap(fileSize);
addr = heap.GetAddr();
if (addr != NULL)
{
result = fis.TryRead(&ret, addr, fileSize);
if (result.IsSuccess())
{
nn::pl::CTR::NetworkUpdateVersion* ver_buf =
reinterpret_cast<nn::pl::CTR::NetworkUpdateVersion*> (addr);
std::memcpy(nup, ver_buf, sizeof(nn::pl::CTR::NetworkUpdateVersion));
}
}
}
fis.Finalize();
nn::fs::Unmount("nver:");
}
}
void GetSystemVersion(VerDef* mVerData, nn::cfg::CTR::CfgRegionCode region)
{
GetCupVersion(&mVerData->cup, region);
GetNupVersion(&mVerData->nup, region);
}

View File

@ -0,0 +1,55 @@
/*---------------------------------------------------------------------------*
Project: Horizon
File: VersionDetect.h
Copyright 2009 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.
$Rev$
*---------------------------------------------------------------------------*/
#ifndef VERSIONDETECT_H_
#define VERSIONDETECT_H_
#include <nn/cfg/CTR/cfg_RegionCode.h>
#include <nn/pl/CTR/pl_SharedDataTitleId.h>
#include <nn/pl/CTR/pl_Version.h>
struct VerDef
{
nn::pl::CTR::CardUpdateVersion cup;
nn::pl::CTR::NetworkUpdateVersion nup;
};
// TODO:リージョン追加時に範囲外アクセスにならないよう注意
const nn::ProgramId cCupVerId[] =
{
nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_JP,
nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_US,
nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_EU,
nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_EU,
nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_CN,
nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_KR,
nn::pl::CTR::SHAREDDATA_TITLEID_CUP_VERSION_TW,
};
const nn::ProgramId cNupVerId[] =
{
nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_JP,
nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_US,
nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_EU,
nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_EU,
nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_CN,
nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_KR,
nn::pl::CTR::SHAREDDATA_TITLEID_NUP_VERSION_TW,
};
// リージョンコードに基づいてバージョン情報を取得する
void GetSystemVersion(VerDef* mVerData, nn::cfg::CTR::CfgRegionCode region);
#endif /* VERSIONDETECT_H_ */

View File

@ -26,16 +26,18 @@
#include <nn/am.h> #include <nn/am.h>
#include <nn/ndm.h> #include <nn/ndm.h>
#include <nn/cfg.h> #include <nn/cfg.h>
#include <nn/ptm_Private.h>
#include <nn/cup.h> #include <nn/cup.h>
#include "demo.h" #include "demo.h"
#include "scrollBuffer.h" #include "scrollBuffer.h"
#include "VersionDetect.h"
#include "HeapManager.h"
namespace namespace
{ {
const int s_GxHeapSize=0x800000; const s32 s_GxHeapSize = 0x800000;
nn::fnd::ExpHeap s_appHeap;
uptr s_GxHeap; uptr s_GxHeap;
demo::RenderSystemDrawing s_RenderSystem; demo::RenderSystemDrawing s_RenderSystem;
@ -47,9 +49,6 @@ namespace
// デモの初期化 // デモの初期化
void Initialize() void Initialize()
{ {
// os の初期化
nn::os::Initialize();
// NuiShellの初期化 (CUPに必須) // NuiShellの初期化 (CUPに必須)
NN_UTIL_PANIC_IF_FAILED(nn::ns::CTR::InitializeForShell()); NN_UTIL_PANIC_IF_FAILED(nn::ns::CTR::InitializeForShell());
@ -74,15 +73,15 @@ namespace
nn::cfg::Initialize(); nn::cfg::Initialize();
// デバイスメモリの設定 // デバイスメモリの設定
const int DEVICE_MEMORY_SIZE = 12*1024 * 1024; const s32 DEVICE_MEMORY_SIZE = 32 * 1024 * 1024;
NN_UTIL_PANIC_IF_FAILED(nn::os::SetDeviceMemorySize(DEVICE_MEMORY_SIZE)); NN_UTIL_PANIC_IF_FAILED(nn::os::SetDeviceMemorySize(DEVICE_MEMORY_SIZE));
// ヒープの初期化 // ヒープの初期化
s_appHeap.Initialize(nn::os::GetDeviceMemoryAddress(), nn::os::GetDeviceMemorySize(), nn::os::ALLOCATE_OPTION_LINEAR); InitializeHeap();
// 描画インスタンスの初期化 // 描画インスタンスの初期化
s_GxHeap = reinterpret_cast<uptr>(s_appHeap.Allocate(s_GxHeapSize)); s_GxHeap = reinterpret_cast<uptr>(ForceAllocate(s_GxHeapSize));s_RenderSystem
s_RenderSystem.Initialize(s_GxHeap, s_GxHeapSize); .Initialize(s_GxHeap, s_GxHeapSize);
// 描画インスタンスの初期化 // 描画インスタンスの初期化
s_scrollBufferInstance.Initialize(&s_RenderSystem); s_scrollBufferInstance.Initialize(&s_RenderSystem);
@ -107,7 +106,7 @@ namespace
// 動いていることを知らせるための、くるくる画面表示取得用メソッド // 動いていることを知らせるための、くるくる画面表示取得用メソッド
const char s_progress[]="-\\|/"; const char s_progress[]="-\\|/";
int s_progressIndex=0; s32 s_progressIndex = 0;
char GetProgressChar() char GetProgressChar()
{ {
s_progressIndex=(s_progressIndex+1)%(sizeof(s_progress)-1); s_progressIndex=(s_progressIndex+1)%(sizeof(s_progress)-1);
@ -123,25 +122,27 @@ namespace
s_scrollBuffer->AppendText("Initializing Cup Library")->Render(); s_scrollBuffer->AppendText("Initializing Cup Library")->Render();
SetTick(); // 初期化開始前の時間をセット SetTick(); // 初期化開始前の時間をセット
result=nn::cup::CTR::Initialize(s_updaterBuffer,sizeof(s_updaterBuffer)); result=nn::cup::CTR::Initialize(s_updaterBuffer,sizeof(s_updaterBuffer));
if(result==nn::cup::CTR::ResultUpdatePartitionNotFound()){ if (result == nn::cup::CTR::ResultUpdatePartitionNotFound())
{
s_scrollBuffer->AppendText(" - Update Partition Not Found (%lldmsec)", GetConsumedMillisec())->Render(); s_scrollBuffer->AppendText(" - Update Partition Not Found (%lldmsec)", GetConsumedMillisec())->Render();
s_scrollBuffer->AppendText("")->Render(); s_scrollBuffer->AppendText("")->Render();
*isHandledError=true; *isHandledError=true;
return result; return result;
} }
if(result==nn::cup::CTR::ResultUpdateNotRequired()){ if (result == nn::cup::CTR::ResultUpdateNotRequired())
{
s_scrollBuffer->AppendText(" - Already Updated (%lldmsec)", GetConsumedMillisec())->Render(); s_scrollBuffer->AppendText(" - Already Updated (%lldmsec)", GetConsumedMillisec())->Render();
s_scrollBuffer->AppendText("")->Render(); s_scrollBuffer->AppendText("")->Render();
*isHandledError=true; *isHandledError=true;
return result; return result;
} }
if(result==nn::cup::CTR::ResultInvalidUpdatePartitionFormat()){ if (result == nn::cup::CTR::ResultInvalidUpdatePartitionFormat())
{
s_scrollBuffer->AppendText(" - Invalid Update Partition (%lldmsec)", GetConsumedMillisec())->Render(); s_scrollBuffer->AppendText(" - Invalid Update Partition (%lldmsec)", GetConsumedMillisec())->Render();
s_scrollBuffer->AppendText("")->Render(); s_scrollBuffer->AppendText("")->Render();
*isHandledError=true; *isHandledError=true;
return result; return result;
} }NN_UTIL_RETURN_IF_FAILED(result);
NN_UTIL_RETURN_IF_FAILED(result);
s_scrollBuffer->AppendText(" - Need Update (%lldmsec)", GetConsumedMillisec())->Render(); s_scrollBuffer->AppendText(" - Need Update (%lldmsec)", GetConsumedMillisec())->Render();
*needUpdate = true; *needUpdate = true;
@ -156,9 +157,26 @@ namespace
} }
} }
nn::Result ExecuteCup(ScrollBuffer* scrollBuf, bool* needUpdte)
{
nn::Result result;
bool isHandledError = false;
result = UpdateSequence(&isHandledError, needUpdte);
if (isHandledError == false && result.IsFailure())
{
{
// それ以外の場合は、Resultを表示
scrollBuf->AppendText(" - Unhandled Error: 0x%08x", result.GetPrintableBits());
scrollBuf->AppendText("")->Render();
}
}
return result;
}
extern "C" void nnMain() extern "C" void nnMain()
{ {
NN_LOG("Start cup demo\n"); NN_LOG("Start Self Cup\n");
nn::Result result; nn::Result result;
Initialize(); Initialize();
@ -187,24 +205,12 @@ extern "C" void nnMain()
break; break;
} }
nn::am::ProgramInfo outInfos; nn::am::ProgramInfo outInfos;
result = nn::am::GetProgramInfos(&outInfos, nn::fs::MEDIA_TYPE_NAND, &MMEN_PROGRAM_ID, 1); result = nn::am::GetProgramInfos(&outInfos, nn::fs::MEDIA_TYPE_NAND, &MMEN_PROGRAM_ID, 1);
bool needUpdate = false; bool needUpdate = false;
if (result.IsSuccess()) if (result.IsSuccess())
{ {
result = ExecuteCup(s_scrollBuffer, &needUpdate);
/******************** CUPの実行 *******************/
bool isHandledError = false;
result = UpdateSequence(&isHandledError, &needUpdate);
if (isHandledError == false && result.IsFailure())
{
{
// それ以外の場合は、Resultを表示
s_scrollBuffer->AppendText(" - Unhandled Error: 0x%08x", result.GetPrintableBits());
s_scrollBuffer->AppendText("")->Render();
}
}
} }
else if(result == nn::am::ResultNotFound()) else if(result == nn::am::ResultNotFound())
{ {
@ -217,6 +223,11 @@ extern "C" void nnMain()
} }
s_scrollBuffer->AppendText("")->Render(); s_scrollBuffer->AppendText("")->Render();
VerDef versionData;
GetSystemVersion(&versionData, region);
s_scrollBuffer->AppendText("Version: %d.%d.%d-%d%c", versionData.cup.majorVersion, versionData.cup.minorVersion,
versionData.cup.microVersion, versionData.nup.majorVersion, nn::cfg::GetRegionCodeA3(region));
for(;;) for(;;)
{ {

View File

@ -0,0 +1 @@