ConfigMem: Clean up the Config memory to be more like the shared page and moved
the helper macro for padding to common_funcs.h
This commit is contained in:
parent
9b69079c83
commit
c3c309f33d
|
@ -35,6 +35,13 @@ template<> struct CompileTimeAssert<true> {};
|
||||||
#define CONCAT2(x, y) DO_CONCAT2(x, y)
|
#define CONCAT2(x, y) DO_CONCAT2(x, y)
|
||||||
#define DO_CONCAT2(x, y) x ## y
|
#define DO_CONCAT2(x, y) x ## y
|
||||||
|
|
||||||
|
// helper macro to properly align structure members.
|
||||||
|
// Calling INSERT_PADDING_BYTES will add a new member variable with a name like "pad121",
|
||||||
|
// depending on the current source line to make sure variable names are unique.
|
||||||
|
#define INSERT_PADDING_BYTES_HELPER1(x, y) x ## y
|
||||||
|
#define INSERT_PADDING_BYTES_HELPER2(x, y) INSERT_PADDING_BYTES_HELPER1(x, y)
|
||||||
|
#define INSERT_PADDING_BYTES(num_words) u8 INSERT_PADDING_BYTES_HELPER2(pad, __LINE__)[(num_words)]
|
||||||
|
|
||||||
#ifndef _MSC_VER
|
#ifndef _MSC_VER
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
|
@ -3,60 +3,54 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/common_funcs.h"
|
||||||
|
|
||||||
|
#include "core/core.h"
|
||||||
|
#include "core/mem_map.h"
|
||||||
#include "core/hle/config_mem.h"
|
#include "core/hle/config_mem.h"
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
namespace ConfigMem {
|
namespace ConfigMem {
|
||||||
|
|
||||||
enum {
|
struct ConfigMemDef {
|
||||||
KERNEL_VERSIONREVISION = 0x1FF80001,
|
u8 kernel_unk; // 0
|
||||||
KERNEL_VERSIONMINOR = 0x1FF80002,
|
u8 kernel_version_rev; // 1
|
||||||
KERNEL_VERSIONMAJOR = 0x1FF80003,
|
u8 kernel_version_min; // 2
|
||||||
UPDATEFLAG = 0x1FF80004,
|
u8 kernel_version_maj; // 3
|
||||||
NSTID = 0x1FF80008,
|
u32 update_flag; // 4
|
||||||
SYSCOREVER = 0x1FF80010,
|
u64 ns_tid; // 8
|
||||||
UNITINFO = 0x1FF80014,
|
u32 sys_core_ver; // 10
|
||||||
KERNEL_CTRSDKVERSION = 0x1FF80018,
|
u8 unit_info; // 14
|
||||||
APPMEMTYPE = 0x1FF80030,
|
u8 boot_firm; // 15
|
||||||
APPMEMALLOC = 0x1FF80040,
|
u8 prev_firm; // 16
|
||||||
FIRM_VERSIONREVISION = 0x1FF80061,
|
INSERT_PADDING_BYTES(0x1); // 17
|
||||||
FIRM_VERSIONMINOR = 0x1FF80062,
|
u32 ctr_sdk_ver; // 18
|
||||||
FIRM_VERSIONMAJOR = 0x1FF80063,
|
INSERT_PADDING_BYTES(0x30 - 0x1C); // 1C
|
||||||
FIRM_SYSCOREVER = 0x1FF80064,
|
u32 app_mem_type; // 30
|
||||||
FIRM_CTRSDKVERSION = 0x1FF80068,
|
INSERT_PADDING_BYTES(0x40 - 0x34); // 34
|
||||||
|
u32 app_mem_alloc; // 40
|
||||||
|
u32 sys_mem_alloc; // 44
|
||||||
|
u32 base_mem_alloc; // 48
|
||||||
|
INSERT_PADDING_BYTES(0x60 - 0x4C); // 4C
|
||||||
|
u8 firm_unk; // 60
|
||||||
|
u8 firm_version_rev; // 61
|
||||||
|
u8 firm_version_min; // 62
|
||||||
|
u8 firm_version_maj; // 63
|
||||||
|
u32 firm_sys_core_ver; // 64
|
||||||
|
u32 firm_ctr_sdk_ver; // 68
|
||||||
|
INSERT_PADDING_BYTES(0x1000 - 0x6C); // 6C
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static_assert(sizeof(ConfigMemDef) == Memory::CONFIG_MEMORY_SIZE, "Config Memory structure size is wrong");
|
||||||
|
|
||||||
|
static ConfigMemDef config_mem;
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline void Read(T &var, const u32 addr) {
|
inline void Read(T &var, const u32 addr) {
|
||||||
switch (addr) {
|
u32 offset = addr - Memory::CONFIG_MEMORY_VADDR;
|
||||||
|
ASSERT(offset < Memory::CONFIG_MEMORY_SIZE);
|
||||||
// Bit 0 set for Retail
|
var = *(reinterpret_cast<T*>(((uintptr_t)&config_mem) + offset));
|
||||||
case UNITINFO:
|
|
||||||
var = 0x00000001;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Set app memory size to 64MB?
|
|
||||||
case APPMEMALLOC:
|
|
||||||
var = 0x04000000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Unknown - normally set to: 0x08000000 - (APPMEMALLOC + *0x1FF80048)
|
|
||||||
// (Total FCRAM size - APPMEMALLOC - *0x1FF80048)
|
|
||||||
case 0x1FF80044:
|
|
||||||
var = 0x08000000 - (0x04000000 + 0x1400000);
|
|
||||||
break;
|
|
||||||
|
|
||||||
// Unknown - normally set to: 0x1400000 (20MB)
|
|
||||||
case 0x1FF80048:
|
|
||||||
var = 0x1400000;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
LOG_ERROR(Kernel, "unknown addr=0x%08X", addr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Explicitly instantiate template functions because we aren't defining this in the header:
|
// Explicitly instantiate template functions because we aren't defining this in the header:
|
||||||
|
@ -66,5 +60,21 @@ template void Read<u32>(u32 &var, const u32 addr);
|
||||||
template void Read<u16>(u16 &var, const u32 addr);
|
template void Read<u16>(u16 &var, const u32 addr);
|
||||||
template void Read<u8>(u8 &var, const u32 addr);
|
template void Read<u8>(u8 &var, const u32 addr);
|
||||||
|
|
||||||
|
void Init() {
|
||||||
|
config_mem.update_flag = 0; // No update
|
||||||
|
config_mem.sys_core_ver = 0x2;
|
||||||
|
config_mem.unit_info = 0x1; // Bit 0 set for Retail
|
||||||
|
config_mem.prev_firm = 0;
|
||||||
|
config_mem.app_mem_type = 0; // Defualt app mem type
|
||||||
|
config_mem.unit_info = 0x1; // Bit 0 set for Retail
|
||||||
|
config_mem.app_mem_alloc = 0x04000000; // Default app memory size is 64MB
|
||||||
|
config_mem.base_mem_alloc = 0x01400000; // Default base memory is 20MB
|
||||||
|
config_mem.sys_mem_alloc = Memory::FCRAM_SIZE - (config_mem.app_mem_alloc + config_mem.base_mem_alloc);
|
||||||
|
config_mem.firm_unk = 0;
|
||||||
|
config_mem.firm_version_rev = 0;
|
||||||
|
config_mem.firm_version_min = 0x40;
|
||||||
|
config_mem.firm_version_maj = 0x2;
|
||||||
|
config_mem.firm_sys_core_ver = 0x2;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -18,4 +18,6 @@ namespace ConfigMem {
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void Read(T &var, const u32 addr);
|
void Read(T &var, const u32 addr);
|
||||||
|
|
||||||
|
void Init();
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "core/arm/arm_interface.h"
|
#include "core/arm/arm_interface.h"
|
||||||
#include "core/mem_map.h"
|
#include "core/mem_map.h"
|
||||||
#include "core/hle/hle.h"
|
#include "core/hle/hle.h"
|
||||||
|
#include "core/hle/config_mem.h"
|
||||||
#include "core/hle/shared_page.h"
|
#include "core/hle/shared_page.h"
|
||||||
#include "core/hle/kernel/thread.h"
|
#include "core/hle/kernel/thread.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
@ -75,6 +76,7 @@ void Init() {
|
||||||
|
|
||||||
RegisterAllModules();
|
RegisterAllModules();
|
||||||
|
|
||||||
|
ConfigMem::Init();
|
||||||
SharedPage::Init();
|
SharedPage::Init();
|
||||||
|
|
||||||
LOG_DEBUG(Kernel, "initialized OK");
|
LOG_DEBUG(Kernel, "initialized OK");
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
#include "common/common_funcs.h"
|
||||||
|
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
#include "core/mem_map.h"
|
#include "core/mem_map.h"
|
||||||
|
@ -12,13 +13,6 @@
|
||||||
|
|
||||||
namespace SharedPage {
|
namespace SharedPage {
|
||||||
|
|
||||||
// helper macro to properly align structure members.
|
|
||||||
// Calling INSERT_PADDING_BYTES will add a new member variable with a name like "pad121",
|
|
||||||
// depending on the current source line to make sure variable names are unique.
|
|
||||||
#define INSERT_PADDING_BYTES_HELPER1(x, y) x ## y
|
|
||||||
#define INSERT_PADDING_BYTES_HELPER2(x, y) INSERT_PADDING_BYTES_HELPER1(x, y)
|
|
||||||
#define INSERT_PADDING_BYTES(num_words) u8 INSERT_PADDING_BYTES_HELPER2(pad, __LINE__)[(num_words)]
|
|
||||||
|
|
||||||
// see http://3dbrew.org/wiki/Configuration_Memory#Shared_Memory_Page_For_ARM11_Processes
|
// see http://3dbrew.org/wiki/Configuration_Memory#Shared_Memory_Page_For_ARM11_Processes
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
Reference in New Issue