1
0
mirror of https://git.suyu.dev/suyu/suyu synced 2025-12-09 22:32:08 -06:00

3 Commits

Author SHA1 Message Date
Belal Ashraf
fed0ec70e0 fix line wrapping in the functions list 2024-04-10 21:21:09 +02:00
Belal Ashraf
097e340d40 fix wrong function name 2024-04-10 17:45:33 +02:00
Belal Ashraf
aebf13752e fix qlaunch on firmware 18
yea
2024-04-10 17:27:32 +02:00
9 changed files with 53 additions and 14 deletions

View File

@@ -175,9 +175,8 @@ constexpr KMemoryPermission ConvertToKMemoryPermission(Svc::MemoryPermission per
return static_cast<KMemoryPermission>( return static_cast<KMemoryPermission>(
(static_cast<KMemoryPermission>(perm) & KMemoryPermission::UserMask) | (static_cast<KMemoryPermission>(perm) & KMemoryPermission::UserMask) |
KMemoryPermission::KernelRead | KMemoryPermission::KernelRead |
((static_cast<KMemoryPermission>(perm) & Svc::MemoryPermission::UserWrite) ((static_cast<KMemoryPermission>(perm) & KMemoryPermission::UserWrite)
? KMemoryPermission::KernelWrite << KMemoryPermission::KernelShift) |
: KMemoryPermission::None) |
(perm == Svc::MemoryPermission::None ? KMemoryPermission::NotMapped (perm == Svc::MemoryPermission::None ? KMemoryPermission::NotMapped
: KMemoryPermission::None)); : KMemoryPermission::None));
} }

View File

@@ -172,6 +172,7 @@ Result KPageTableBase::InitializeForKernel(bool is_64_bit, KVirtualAddress start
m_mapped_unsafe_physical_memory = 0; m_mapped_unsafe_physical_memory = 0;
m_mapped_insecure_memory = 0; m_mapped_insecure_memory = 0;
m_mapped_ipc_server_memory = 0; m_mapped_ipc_server_memory = 0;
m_alias_region_extra_size = 0;
m_memory_block_slab_manager = m_memory_block_slab_manager =
m_kernel.GetSystemSystemResource().GetMemoryBlockSlabManagerPointer(); m_kernel.GetSystemSystemResource().GetMemoryBlockSlabManagerPointer();
@@ -269,6 +270,12 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool
process_code_end = m_code_region_end; process_code_end = m_code_region_end;
} }
m_alias_region_extra_size = 0;
if (as_type == Svc::CreateProcessFlag::EnableReservedRegionExtraSize) {
m_alias_region_extra_size = GetAddressSpaceSize() / 8;
alias_region_size += m_alias_region_extra_size;
}
// Set other basic fields. // Set other basic fields.
m_enable_aslr = enable_aslr; m_enable_aslr = enable_aslr;
m_enable_device_address_space_merge = enable_das_merge; m_enable_device_address_space_merge = enable_das_merge;
@@ -1594,7 +1601,7 @@ size_t KPageTableBase::GetAliasCodeDataSize() const {
} }
Result KPageTableBase::AllocateAndMapPagesImpl(PageLinkedList* page_list, KProcessAddress address, Result KPageTableBase::AllocateAndMapPagesImpl(PageLinkedList* page_list, KProcessAddress address,
size_t num_pages, KPageProperties& perm) { size_t num_pages, KMemoryPermission perm) {
ASSERT(this->IsLockedByCurrentThread()); ASSERT(this->IsLockedByCurrentThread());
// Create a page group to hold the pages we allocate. // Create a page group to hold the pages we allocate.
@@ -1615,6 +1622,7 @@ Result KPageTableBase::AllocateAndMapPagesImpl(PageLinkedList* page_list, KProce
} }
// Map the pages. // Map the pages.
const KPageProperties properties = {perm, false, false, DisableMergeAttribute::None};
R_RETURN(this->Operate(page_list, address, num_pages, pg, properties, OperationType::MapGroup, R_RETURN(this->Operate(page_list, address, num_pages, pg, properties, OperationType::MapGroup,
false)); false));
} }
@@ -2748,12 +2756,12 @@ Result KPageTableBase::MapPages(KProcessAddress* out_addr, size_t num_pages, siz
KScopedPageTableUpdater updater(this); KScopedPageTableUpdater updater(this);
// Perform mapping operation. // Perform mapping operation.
KPageProperties properties = {perm, false, false, DisableMergeAttribute::DisableHead};
if (is_pa_valid) { if (is_pa_valid) {
const KPageProperties properties = {perm, false, false, DisableMergeAttribute::DisableHead};
R_TRY(this->Operate(updater.GetPageList(), addr, num_pages, phys_addr, true, properties, R_TRY(this->Operate(updater.GetPageList(), addr, num_pages, phys_addr, true, properties,
OperationType::Map, false)); OperationType::Map, false));
} else { } else {
R_TRY(this->AllocateAndMapPagesImpl(updater.GetPageList(), addr, num_pages, properties)); R_TRY(this->AllocateAndMapPagesImpl(updater.GetPageList(), addr, num_pages, perm));
} }
// Update the blocks. // Update the blocks.
@@ -2792,8 +2800,7 @@ Result KPageTableBase::MapPages(KProcessAddress address, size_t num_pages, KMemo
KScopedPageTableUpdater updater(this); KScopedPageTableUpdater updater(this);
// Map the pages. // Map the pages.
KPageProperties properties = {perm, false, false, DisableMergeAttribute::DisableHead}; R_TRY(this->AllocateAndMapPagesImpl(updater.GetPageList(), address, num_pages, perm));
R_TRY(this->AllocateAndMapPagesImpl(updater.GetPageList(), address, num_pages, properties));
// Update the blocks. // Update the blocks.
m_memory_block_manager.Update(std::addressof(allocator), address, num_pages, state, perm, m_memory_block_manager.Update(std::addressof(allocator), address, num_pages, state, perm,

View File

@@ -208,6 +208,7 @@ private:
size_t m_mapped_unsafe_physical_memory{}; size_t m_mapped_unsafe_physical_memory{};
size_t m_mapped_insecure_memory{}; size_t m_mapped_insecure_memory{};
size_t m_mapped_ipc_server_memory{}; size_t m_mapped_ipc_server_memory{};
size_t m_alias_region_extra_size{};
mutable KLightLock m_general_lock; mutable KLightLock m_general_lock;
mutable KLightLock m_map_physical_memory_lock; mutable KLightLock m_map_physical_memory_lock;
KLightLock m_device_map_lock; KLightLock m_device_map_lock;
@@ -441,7 +442,7 @@ private:
Svc::MemoryState state) const; Svc::MemoryState state) const;
Result AllocateAndMapPagesImpl(PageLinkedList* page_list, KProcessAddress address, Result AllocateAndMapPagesImpl(PageLinkedList* page_list, KProcessAddress address,
size_t num_pages, KPageProperties& perm); size_t num_pages, KMemoryPermission perm);
Result MapPageGroupImpl(PageLinkedList* page_list, KProcessAddress address, Result MapPageGroupImpl(PageLinkedList* page_list, KProcessAddress address,
const KPageGroup& pg, const KPageProperties properties, bool reuse_ll); const KPageGroup& pg, const KPageProperties properties, bool reuse_ll);
@@ -682,6 +683,9 @@ public:
size_t GetAliasRegionSize() const { size_t GetAliasRegionSize() const {
return m_alias_region_end - m_alias_region_start; return m_alias_region_end - m_alias_region_start;
} }
size_t GetReservedRegionExtraSize() const {
return m_alias_region_extra_size;
}
size_t GetStackRegionSize() const { size_t GetStackRegionSize() const {
return m_stack_region_end - m_stack_region_start; return m_stack_region_end - m_stack_region_start;
} }

View File

@@ -410,6 +410,9 @@ public:
size_t GetAliasRegionSize() const { size_t GetAliasRegionSize() const {
return m_page_table.GetAliasRegionSize(); return m_page_table.GetAliasRegionSize();
} }
size_t GetReservedRegionExtraSize() const {
return m_page_table.GetReservedRegionExtraSize();
}
size_t GetStackRegionSize() const { size_t GetStackRegionSize() const {
return m_page_table.GetStackRegionSize(); return m_page_table.GetStackRegionSize();
} }

View File

@@ -37,7 +37,8 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle
case InfoType::TotalNonSystemMemorySize: case InfoType::TotalNonSystemMemorySize:
case InfoType::UsedNonSystemMemorySize: case InfoType::UsedNonSystemMemorySize:
case InfoType::IsApplication: case InfoType::IsApplication:
case InfoType::FreeThreadCount: { case InfoType::FreeThreadCount:
case InfoType::ReservedRegionExtraSize: {
R_UNLESS(info_sub_id == 0, ResultInvalidEnumValue); R_UNLESS(info_sub_id == 0, ResultInvalidEnumValue);
const auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable(); const auto& handle_table = GetCurrentProcess(system.Kernel()).GetHandleTable();
@@ -134,6 +135,10 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle
} }
R_SUCCEED(); R_SUCCEED();
case InfoType::ReservedRegionExtraSize:
*result = process->GetPageTable().GetReservedRegionExtraSize();
R_SUCCEED();
default: default:
break; break;
} }

View File

@@ -153,6 +153,7 @@ enum class InfoType : u32 {
ThreadTickCount = 25, ThreadTickCount = 25,
IsSvcPermitted = 26, IsSvcPermitted = 26,
IoRegionHint = 27, IoRegionHint = 27,
ReservedRegionExtraSize = 28,
MesosphereMeta = 65000, MesosphereMeta = 65000,
MesosphereCurrentProcess = 65001, MesosphereCurrentProcess = 65001,
@@ -642,9 +643,12 @@ enum class CreateProcessFlag : u32 {
// 11.x+ DisableDeviceAddressSpaceMerge. // 11.x+ DisableDeviceAddressSpaceMerge.
DisableDeviceAddressSpaceMerge = (1 << 12), DisableDeviceAddressSpaceMerge = (1 << 12),
EnableReservedRegionExtraSize = (1 << 13),
// Mask of all flags. // Mask of all flags.
All = Is64Bit | AddressSpaceMask | EnableDebug | EnableAslr | IsApplication | All = Is64Bit | AddressSpaceMask | EnableDebug | EnableAslr | IsApplication |
PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge, PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge |
EnableReservedRegionExtraSize,
}; };
DECLARE_ENUM_FLAG_OPERATORS(CreateProcessFlag); DECLARE_ENUM_FLAG_OPERATORS(CreateProcessFlag);

View File

@@ -323,7 +323,7 @@ public:
{11, &IProfileCommon::LoadImage, "LoadImage"}, {11, &IProfileCommon::LoadImage, "LoadImage"},
{20, &IProfileCommon::GetImageSize, "GetLargeImageSize"}, // 18.0.0+ {20, &IProfileCommon::GetImageSize, "GetLargeImageSize"}, // 18.0.0+
{21, &IProfileCommon::LoadImage, "LoadLargeImage"}, // 18.0.0+ {21, &IProfileCommon::LoadImage, "LoadLargeImage"}, // 18.0.0+
{30, nullptr, "GetImageId"}, // 18.0.0+ {30, &IProfileCommon::Unknown, "GetImageId"}, // 18.0.0+
}; };
RegisterHandlers(functions); RegisterHandlers(functions);
@@ -494,6 +494,13 @@ protected:
rb.Push(ResultSuccess); rb.Push(ResultSuccess);
} }
void Unknown(HLERequestContext& ctx) {
LOG_WARNING(Service_ACC, "(STUBBED) called");
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(ResultSuccess);
rb.Push(0);
}
ProfileManager& profile_manager; ProfileManager& profile_manager;
Common::UUID user_id{}; ///< The user id this profile refers to. Common::UUID user_id{}; ///< The user id this profile refers to.
}; };
@@ -509,7 +516,15 @@ class IProfileEditor final : public IProfileCommon {
public: public:
explicit IProfileEditor(Core::System& system_, Common::UUID user_id_, explicit IProfileEditor(Core::System& system_, Common::UUID user_id_,
ProfileManager& profile_manager_) ProfileManager& profile_manager_)
: IProfileCommon{system_, "IProfileEditor", true, user_id_, profile_manager_} {} : IProfileCommon{system_, "IProfileEditor", true, user_id_, profile_manager_} {
// clang-format off
static const FunctionInfo functions[] = {
{30, &IProfileEditor::Unknown, "Unknown"},
};
// clang-format on
RegisterHandlers(functions);
}
}; };
class ISessionObject final : public ServiceFramework<ISessionObject> { class ISessionObject final : public ServiceFramework<ISessionObject> {

View File

@@ -14,6 +14,7 @@ IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u
: ServiceFramework{system_, "IAudioDevice"}, service_context{system_, "IAudioDevice"}, : ServiceFramework{system_, "IAudioDevice"}, service_context{system_, "IAudioDevice"},
impl{std::make_unique<AudioDevice>(system_, applet_resource_user_id, revision)}, impl{std::make_unique<AudioDevice>(system_, applet_resource_user_id, revision)},
event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} { event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} {
// clang-format off
static const FunctionInfo functions[] = { static const FunctionInfo functions[] = {
{0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"}, {0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"},
{1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"}, {1, D<&IAudioDevice::SetAudioDeviceOutputVolume>, "SetAudioDeviceOutputVolume"},
@@ -37,6 +38,7 @@ IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u
{19, nullptr, "SetAudioDeviceOutputVolumeAutoTuneEnabled"}, // 18.0.0+ {19, nullptr, "SetAudioDeviceOutputVolumeAutoTuneEnabled"}, // 18.0.0+
{20, nullptr, "IsAudioDeviceOutputVolumeAutoTuneEnabled"} // 18.0.0+ {20, nullptr, "IsAudioDeviceOutputVolumeAutoTuneEnabled"} // 18.0.0+
}; };
// clang-format on
RegisterHandlers(functions); RegisterHandlers(functions);
event->Signal(); event->Signal();

View File

@@ -105,7 +105,7 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili
{1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+ {1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+
{1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+ {1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+
{1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+ {1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+
{1967, nullptr, "GetBedtimeAlarmMinute"}, // 18.0.0+ {1967, nullptr, "GetBedtimeAlarmTimeMinute"}, // 18.0.0+
{2001, nullptr, "RequestPairingAsync"}, {2001, nullptr, "RequestPairingAsync"},
{2002, nullptr, "FinishRequestPairing"}, {2002, nullptr, "FinishRequestPairing"},
{2003, nullptr, "AuthorizePairingAsync"}, {2003, nullptr, "AuthorizePairingAsync"},