mirror of
https://git.suyu.dev/suyu/suyu
synced 2025-12-08 13:52:08 -06:00
Compare commits
3 Commits
more-f18-c
...
qlaunch-wo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fed0ec70e0 | ||
|
|
097e340d40 | ||
|
|
aebf13752e |
@@ -175,9 +175,8 @@ constexpr KMemoryPermission ConvertToKMemoryPermission(Svc::MemoryPermission per
|
||||
return static_cast<KMemoryPermission>(
|
||||
(static_cast<KMemoryPermission>(perm) & KMemoryPermission::UserMask) |
|
||||
KMemoryPermission::KernelRead |
|
||||
((static_cast<KMemoryPermission>(perm) & Svc::MemoryPermission::UserWrite)
|
||||
? KMemoryPermission::KernelWrite
|
||||
: KMemoryPermission::None) |
|
||||
((static_cast<KMemoryPermission>(perm) & KMemoryPermission::UserWrite)
|
||||
<< KMemoryPermission::KernelShift) |
|
||||
(perm == Svc::MemoryPermission::None ? KMemoryPermission::NotMapped
|
||||
: KMemoryPermission::None));
|
||||
}
|
||||
|
||||
@@ -172,6 +172,7 @@ Result KPageTableBase::InitializeForKernel(bool is_64_bit, KVirtualAddress start
|
||||
m_mapped_unsafe_physical_memory = 0;
|
||||
m_mapped_insecure_memory = 0;
|
||||
m_mapped_ipc_server_memory = 0;
|
||||
m_alias_region_extra_size = 0;
|
||||
|
||||
m_memory_block_slab_manager =
|
||||
m_kernel.GetSystemSystemResource().GetMemoryBlockSlabManagerPointer();
|
||||
@@ -269,6 +270,12 @@ Result KPageTableBase::InitializeForProcess(Svc::CreateProcessFlag as_type, bool
|
||||
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.
|
||||
m_enable_aslr = enable_aslr;
|
||||
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,
|
||||
size_t num_pages, KPageProperties& perm) {
|
||||
size_t num_pages, KMemoryPermission perm) {
|
||||
ASSERT(this->IsLockedByCurrentThread());
|
||||
|
||||
// Create a page group to hold the pages we allocate.
|
||||
@@ -1615,6 +1622,7 @@ Result KPageTableBase::AllocateAndMapPagesImpl(PageLinkedList* page_list, KProce
|
||||
}
|
||||
|
||||
// Map the pages.
|
||||
const KPageProperties properties = {perm, false, false, DisableMergeAttribute::None};
|
||||
R_RETURN(this->Operate(page_list, address, num_pages, pg, properties, OperationType::MapGroup,
|
||||
false));
|
||||
}
|
||||
@@ -2748,12 +2756,12 @@ Result KPageTableBase::MapPages(KProcessAddress* out_addr, size_t num_pages, siz
|
||||
KScopedPageTableUpdater updater(this);
|
||||
|
||||
// Perform mapping operation.
|
||||
KPageProperties properties = {perm, false, false, DisableMergeAttribute::DisableHead};
|
||||
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,
|
||||
OperationType::Map, false));
|
||||
} else {
|
||||
R_TRY(this->AllocateAndMapPagesImpl(updater.GetPageList(), addr, num_pages, properties));
|
||||
R_TRY(this->AllocateAndMapPagesImpl(updater.GetPageList(), addr, num_pages, perm));
|
||||
}
|
||||
|
||||
// Update the blocks.
|
||||
@@ -2792,8 +2800,7 @@ Result KPageTableBase::MapPages(KProcessAddress address, size_t num_pages, KMemo
|
||||
KScopedPageTableUpdater updater(this);
|
||||
|
||||
// Map the pages.
|
||||
KPageProperties properties = {perm, false, false, DisableMergeAttribute::DisableHead};
|
||||
R_TRY(this->AllocateAndMapPagesImpl(updater.GetPageList(), address, num_pages, properties));
|
||||
R_TRY(this->AllocateAndMapPagesImpl(updater.GetPageList(), address, num_pages, perm));
|
||||
|
||||
// Update the blocks.
|
||||
m_memory_block_manager.Update(std::addressof(allocator), address, num_pages, state, perm,
|
||||
|
||||
@@ -208,6 +208,7 @@ private:
|
||||
size_t m_mapped_unsafe_physical_memory{};
|
||||
size_t m_mapped_insecure_memory{};
|
||||
size_t m_mapped_ipc_server_memory{};
|
||||
size_t m_alias_region_extra_size{};
|
||||
mutable KLightLock m_general_lock;
|
||||
mutable KLightLock m_map_physical_memory_lock;
|
||||
KLightLock m_device_map_lock;
|
||||
@@ -441,7 +442,7 @@ private:
|
||||
Svc::MemoryState state) const;
|
||||
|
||||
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,
|
||||
const KPageGroup& pg, const KPageProperties properties, bool reuse_ll);
|
||||
|
||||
@@ -682,6 +683,9 @@ public:
|
||||
size_t GetAliasRegionSize() const {
|
||||
return m_alias_region_end - m_alias_region_start;
|
||||
}
|
||||
size_t GetReservedRegionExtraSize() const {
|
||||
return m_alias_region_extra_size;
|
||||
}
|
||||
size_t GetStackRegionSize() const {
|
||||
return m_stack_region_end - m_stack_region_start;
|
||||
}
|
||||
|
||||
@@ -410,6 +410,9 @@ public:
|
||||
size_t GetAliasRegionSize() const {
|
||||
return m_page_table.GetAliasRegionSize();
|
||||
}
|
||||
size_t GetReservedRegionExtraSize() const {
|
||||
return m_page_table.GetReservedRegionExtraSize();
|
||||
}
|
||||
size_t GetStackRegionSize() const {
|
||||
return m_page_table.GetStackRegionSize();
|
||||
}
|
||||
|
||||
@@ -37,7 +37,8 @@ Result GetInfo(Core::System& system, u64* result, InfoType info_id_type, Handle
|
||||
case InfoType::TotalNonSystemMemorySize:
|
||||
case InfoType::UsedNonSystemMemorySize:
|
||||
case InfoType::IsApplication:
|
||||
case InfoType::FreeThreadCount: {
|
||||
case InfoType::FreeThreadCount:
|
||||
case InfoType::ReservedRegionExtraSize: {
|
||||
R_UNLESS(info_sub_id == 0, ResultInvalidEnumValue);
|
||||
|
||||
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();
|
||||
|
||||
case InfoType::ReservedRegionExtraSize:
|
||||
*result = process->GetPageTable().GetReservedRegionExtraSize();
|
||||
R_SUCCEED();
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -153,6 +153,7 @@ enum class InfoType : u32 {
|
||||
ThreadTickCount = 25,
|
||||
IsSvcPermitted = 26,
|
||||
IoRegionHint = 27,
|
||||
ReservedRegionExtraSize = 28,
|
||||
|
||||
MesosphereMeta = 65000,
|
||||
MesosphereCurrentProcess = 65001,
|
||||
@@ -642,9 +643,12 @@ enum class CreateProcessFlag : u32 {
|
||||
// 11.x+ DisableDeviceAddressSpaceMerge.
|
||||
DisableDeviceAddressSpaceMerge = (1 << 12),
|
||||
|
||||
EnableReservedRegionExtraSize = (1 << 13),
|
||||
|
||||
// Mask of all flags.
|
||||
All = Is64Bit | AddressSpaceMask | EnableDebug | EnableAslr | IsApplication |
|
||||
PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge,
|
||||
PoolPartitionMask | OptimizeMemoryAllocation | DisableDeviceAddressSpaceMerge |
|
||||
EnableReservedRegionExtraSize,
|
||||
};
|
||||
DECLARE_ENUM_FLAG_OPERATORS(CreateProcessFlag);
|
||||
|
||||
|
||||
@@ -323,7 +323,7 @@ public:
|
||||
{11, &IProfileCommon::LoadImage, "LoadImage"},
|
||||
{20, &IProfileCommon::GetImageSize, "GetLargeImageSize"}, // 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);
|
||||
@@ -494,6 +494,13 @@ protected:
|
||||
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;
|
||||
Common::UUID user_id{}; ///< The user id this profile refers to.
|
||||
};
|
||||
@@ -509,7 +516,15 @@ class IProfileEditor final : public IProfileCommon {
|
||||
public:
|
||||
explicit IProfileEditor(Core::System& system_, Common::UUID user_id_,
|
||||
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> {
|
||||
|
||||
@@ -14,6 +14,7 @@ IAudioDevice::IAudioDevice(Core::System& system_, u64 applet_resource_user_id, u
|
||||
: ServiceFramework{system_, "IAudioDevice"}, service_context{system_, "IAudioDevice"},
|
||||
impl{std::make_unique<AudioDevice>(system_, applet_resource_user_id, revision)},
|
||||
event{service_context.CreateEvent(fmt::format("IAudioDeviceEvent-{}", device_num))} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, D<&IAudioDevice::ListAudioDeviceName>, "ListAudioDeviceName"},
|
||||
{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+
|
||||
{20, nullptr, "IsAudioDeviceOutputVolumeAutoTuneEnabled"} // 18.0.0+
|
||||
};
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
|
||||
event->Signal();
|
||||
|
||||
@@ -105,7 +105,7 @@ IParentalControlService::IParentalControlService(Core::System& system_, Capabili
|
||||
{1954, nullptr, "IsBedtimeAlarmEnabled"}, // 18.0.0+
|
||||
{1955, nullptr, "GetBedtimeAlarmTime"}, // 18.0.0+
|
||||
{1956, nullptr, "GetBedtimeAlarmTimeHour"}, // 18.0.0+
|
||||
{1967, nullptr, "GetBedtimeAlarmMinute"}, // 18.0.0+
|
||||
{1967, nullptr, "GetBedtimeAlarmTimeMinute"}, // 18.0.0+
|
||||
{2001, nullptr, "RequestPairingAsync"},
|
||||
{2002, nullptr, "FinishRequestPairing"},
|
||||
{2003, nullptr, "AuthorizePairingAsync"},
|
||||
|
||||
Reference in New Issue
Block a user