mirror of
https://github.com/PabloMK7/citra.git
synced 2025-10-11 12:00:03 +00:00
service/apt: Add and implement more service commands. (#6721)
* service/apt: Add and implement more service commands. * service/apt: Implement power button. * Address review comments and fix GetApplicationRunningMode bug.
This commit is contained in:
parent
51996c54f0
commit
bb364d9bc0
31 changed files with 939 additions and 221 deletions
|
@ -23,13 +23,15 @@ namespace Kernel {
|
|||
|
||||
/// Initialize the kernel
|
||||
KernelSystem::KernelSystem(Memory::MemorySystem& memory, Core::Timing& timing,
|
||||
std::function<void()> prepare_reschedule_callback, u32 system_mode,
|
||||
u32 num_cores, u8 n3ds_mode)
|
||||
std::function<void()> prepare_reschedule_callback,
|
||||
MemoryMode memory_mode, u32 num_cores,
|
||||
const New3dsHwCapabilities& n3ds_hw_caps)
|
||||
: memory(memory), timing(timing),
|
||||
prepare_reschedule_callback(std::move(prepare_reschedule_callback)) {
|
||||
prepare_reschedule_callback(std::move(prepare_reschedule_callback)), memory_mode(memory_mode),
|
||||
n3ds_hw_caps(n3ds_hw_caps) {
|
||||
std::generate(memory_regions.begin(), memory_regions.end(),
|
||||
[] { return std::make_shared<MemoryRegionInfo>(); });
|
||||
MemoryInit(system_mode, n3ds_mode);
|
||||
MemoryInit(memory_mode, n3ds_hw_caps.memory_mode);
|
||||
|
||||
resource_limits = std::make_unique<ResourceLimitList>(*this);
|
||||
for (u32 core_id = 0; core_id < num_cores; ++core_id) {
|
||||
|
@ -176,6 +178,8 @@ void KernelSystem::serialize(Archive& ar, const unsigned int file_version) {
|
|||
ar& shared_page_handler;
|
||||
ar& stored_processes;
|
||||
ar& next_thread_id;
|
||||
ar& memory_mode;
|
||||
ar& n3ds_hw_caps;
|
||||
// Deliberately don't include debugger info to allow debugging through loads
|
||||
|
||||
if (Archive::is_loading::value) {
|
||||
|
|
|
@ -97,11 +97,44 @@ union CoreVersion {
|
|||
BitField<24, 8, u32> major;
|
||||
};
|
||||
|
||||
/// Common memory memory modes.
|
||||
enum class MemoryMode : u8 {
|
||||
Prod = 0, ///< 64MB app memory
|
||||
Dev1 = 2, ///< 96MB app memory
|
||||
Dev2 = 3, ///< 80MB app memory
|
||||
Dev3 = 4, ///< 72MB app memory
|
||||
Dev4 = 5, ///< 32MB app memory
|
||||
};
|
||||
|
||||
/// New 3DS memory modes.
|
||||
enum class New3dsMemoryMode : u8 {
|
||||
Legacy = 0, ///< Use Old 3DS system mode.
|
||||
NewProd = 1, ///< 124MB app memory
|
||||
NewDev1 = 2, ///< 178MB app memory
|
||||
NewDev2 = 3, ///< 124MB app memory
|
||||
};
|
||||
|
||||
/// Structure containing N3DS hardware capability flags.
|
||||
struct New3dsHwCapabilities {
|
||||
bool enable_l2_cache; ///< Whether extra L2 cache should be enabled.
|
||||
bool enable_804MHz_cpu; ///< Whether the CPU should run at 804MHz.
|
||||
New3dsMemoryMode memory_mode; ///< The New 3DS memory mode.
|
||||
|
||||
private:
|
||||
template <class Archive>
|
||||
void serialize(Archive& ar, const unsigned int) {
|
||||
ar& enable_l2_cache;
|
||||
ar& enable_804MHz_cpu;
|
||||
ar& memory_mode;
|
||||
}
|
||||
friend class boost::serialization::access;
|
||||
};
|
||||
|
||||
class KernelSystem {
|
||||
public:
|
||||
explicit KernelSystem(Memory::MemorySystem& memory, Core::Timing& timing,
|
||||
std::function<void()> prepare_reschedule_callback, u32 system_mode,
|
||||
u32 num_cores, u8 n3ds_mode);
|
||||
std::function<void()> prepare_reschedule_callback, MemoryMode memory_mode,
|
||||
u32 num_cores, const New3dsHwCapabilities& n3ds_hw_caps);
|
||||
~KernelSystem();
|
||||
|
||||
using PortPair = std::pair<std::shared_ptr<ServerPort>, std::shared_ptr<ClientPort>>;
|
||||
|
@ -279,6 +312,14 @@ public:
|
|||
|
||||
void ResetThreadIDs();
|
||||
|
||||
MemoryMode GetMemoryMode() const {
|
||||
return memory_mode;
|
||||
}
|
||||
|
||||
const New3dsHwCapabilities& GetNew3dsHwCapabilities() const {
|
||||
return n3ds_hw_caps;
|
||||
}
|
||||
|
||||
/// Map of named ports managed by the kernel, which can be retrieved using the ConnectToPort
|
||||
std::unordered_map<std::string, std::shared_ptr<ClientPort>> named_ports;
|
||||
|
||||
|
@ -289,7 +330,7 @@ public:
|
|||
Core::Timing& timing;
|
||||
|
||||
private:
|
||||
void MemoryInit(u32 mem_type, u8 n3ds_mode);
|
||||
void MemoryInit(MemoryMode memory_mode, New3dsMemoryMode n3ds_mode);
|
||||
|
||||
std::function<void()> prepare_reschedule_callback;
|
||||
|
||||
|
@ -324,6 +365,9 @@ private:
|
|||
|
||||
u32 next_thread_id;
|
||||
|
||||
MemoryMode memory_mode;
|
||||
New3dsHwCapabilities n3ds_hw_caps;
|
||||
|
||||
friend class boost::serialization::access;
|
||||
template <class Archive>
|
||||
void serialize(Archive& ar, const unsigned int file_version);
|
||||
|
|
|
@ -37,29 +37,20 @@ static const u32 memory_region_sizes[8][3] = {
|
|||
{0x0B200000, 0x02E00000, 0x02000000}, // 7
|
||||
};
|
||||
|
||||
namespace MemoryMode {
|
||||
enum N3DSMode : u8 {
|
||||
Mode6 = 1,
|
||||
Mode7 = 2,
|
||||
Mode6_2 = 3,
|
||||
};
|
||||
}
|
||||
|
||||
void KernelSystem::MemoryInit(u32 mem_type, u8 n3ds_mode) {
|
||||
ASSERT(mem_type != 1);
|
||||
|
||||
void KernelSystem::MemoryInit(MemoryMode memory_mode, New3dsMemoryMode n3ds_mode) {
|
||||
const bool is_new_3ds = Settings::values.is_new_3ds.GetValue();
|
||||
u32 reported_mem_type = mem_type;
|
||||
u32 mem_type_index = static_cast<u32>(memory_mode);
|
||||
u32 reported_mem_type = static_cast<u32>(memory_mode);
|
||||
if (is_new_3ds) {
|
||||
if (n3ds_mode == MemoryMode::Mode6 || n3ds_mode == MemoryMode::Mode6_2) {
|
||||
mem_type = 6;
|
||||
if (n3ds_mode == New3dsMemoryMode::NewProd || n3ds_mode == New3dsMemoryMode::NewDev2) {
|
||||
mem_type_index = 6;
|
||||
reported_mem_type = 6;
|
||||
} else if (n3ds_mode == MemoryMode::Mode7) {
|
||||
mem_type = 7;
|
||||
} else if (n3ds_mode == New3dsMemoryMode::NewDev1) {
|
||||
mem_type_index = 7;
|
||||
reported_mem_type = 7;
|
||||
} else {
|
||||
// On the N3ds, all O3ds configurations (<=5) are forced to 6 instead.
|
||||
mem_type = 6;
|
||||
mem_type_index = 6;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -67,7 +58,7 @@ void KernelSystem::MemoryInit(u32 mem_type, u8 n3ds_mode) {
|
|||
// the sizes specified in the memory_region_sizes table.
|
||||
VAddr base = 0;
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
memory_regions[i]->Reset(base, memory_region_sizes[mem_type][i]);
|
||||
memory_regions[i]->Reset(base, memory_region_sizes[mem_type_index][i]);
|
||||
|
||||
base += memory_regions[i]->size;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue