mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-06-30 06:16:16 +00:00
Fix name behavior
All memory naming functions restrict the name size to a 31 character limit, and return `ORBIS_KERNEL_ERROR_ENAMETOOLONG` if that limit is exceeded. Since this value is constant for all functions involving names, I've defined it as a constant in kernel's memory.h, and used that in place of any hardcoded 32 character limits.
This commit is contained in:
parent
f96089638e
commit
0dcd372d2d
3 changed files with 22 additions and 14 deletions
|
@ -168,10 +168,12 @@ int PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, int prot, i
|
||||||
LOG_ERROR(Kernel_Vmm, "Map size is either zero or not 16KB aligned!");
|
LOG_ERROR(Kernel_Vmm, "Map size is either zero or not 16KB aligned!");
|
||||||
return ORBIS_KERNEL_ERROR_EINVAL;
|
return ORBIS_KERNEL_ERROR_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Common::Is16KBAligned(directMemoryStart)) {
|
if (!Common::Is16KBAligned(directMemoryStart)) {
|
||||||
LOG_ERROR(Kernel_Vmm, "Start address is not 16KB aligned!");
|
LOG_ERROR(Kernel_Vmm, "Start address is not 16KB aligned!");
|
||||||
return ORBIS_KERNEL_ERROR_EINVAL;
|
return ORBIS_KERNEL_ERROR_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (alignment != 0) {
|
if (alignment != 0) {
|
||||||
if ((!std::has_single_bit(alignment) && !Common::Is16KBAligned(alignment))) {
|
if ((!std::has_single_bit(alignment) && !Common::Is16KBAligned(alignment))) {
|
||||||
LOG_ERROR(Kernel_Vmm, "Alignment value is invalid!");
|
LOG_ERROR(Kernel_Vmm, "Alignment value is invalid!");
|
||||||
|
@ -179,6 +181,11 @@ int PS4_SYSV_ABI sceKernelMapNamedDirectMemory(void** addr, u64 len, int prot, i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (std::strlen(name) >= ORBIS_KERNEL_MAXIMUM_NAME_LENGTH) {
|
||||||
|
LOG_ERROR(Kernel_Vmm, "name exceeds 32 bytes!");
|
||||||
|
return ORBIS_KERNEL_ERROR_ENAMETOOLONG;
|
||||||
|
}
|
||||||
|
|
||||||
const VAddr in_addr = reinterpret_cast<VAddr>(*addr);
|
const VAddr in_addr = reinterpret_cast<VAddr>(*addr);
|
||||||
const auto mem_prot = static_cast<Core::MemoryProt>(prot);
|
const auto mem_prot = static_cast<Core::MemoryProt>(prot);
|
||||||
const auto map_flags = static_cast<Core::MemoryMapFlags>(flags);
|
const auto map_flags = static_cast<Core::MemoryMapFlags>(flags);
|
||||||
|
@ -207,17 +214,16 @@ s32 PS4_SYSV_ABI sceKernelMapNamedFlexibleMemory(void** addr_in_out, std::size_t
|
||||||
return ORBIS_KERNEL_ERROR_EINVAL;
|
return ORBIS_KERNEL_ERROR_EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr size_t MaxNameSize = 32;
|
|
||||||
if (std::strlen(name) > MaxNameSize) {
|
|
||||||
LOG_ERROR(Kernel_Vmm, "name exceeds 32 bytes!");
|
|
||||||
return ORBIS_KERNEL_ERROR_ENAMETOOLONG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == nullptr) {
|
if (name == nullptr) {
|
||||||
LOG_ERROR(Kernel_Vmm, "name is invalid!");
|
LOG_ERROR(Kernel_Vmm, "name is invalid!");
|
||||||
return ORBIS_KERNEL_ERROR_EFAULT;
|
return ORBIS_KERNEL_ERROR_EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (std::strlen(name) >= ORBIS_KERNEL_MAXIMUM_NAME_LENGTH) {
|
||||||
|
LOG_ERROR(Kernel_Vmm, "name exceeds 32 bytes!");
|
||||||
|
return ORBIS_KERNEL_ERROR_ENAMETOOLONG;
|
||||||
|
}
|
||||||
|
|
||||||
const VAddr in_addr = reinterpret_cast<VAddr>(*addr_in_out);
|
const VAddr in_addr = reinterpret_cast<VAddr>(*addr_in_out);
|
||||||
const auto mem_prot = static_cast<Core::MemoryProt>(prot);
|
const auto mem_prot = static_cast<Core::MemoryProt>(prot);
|
||||||
const auto map_flags = static_cast<Core::MemoryMapFlags>(flags);
|
const auto map_flags = static_cast<Core::MemoryMapFlags>(flags);
|
||||||
|
@ -353,16 +359,16 @@ s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, int numEn
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, size_t len, const char* name) {
|
s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, size_t len, const char* name) {
|
||||||
static constexpr size_t MaxNameSize = 32;
|
|
||||||
if (std::strlen(name) > MaxNameSize) {
|
|
||||||
LOG_ERROR(Kernel_Vmm, "name exceeds 32 bytes!");
|
|
||||||
return ORBIS_KERNEL_ERROR_ENAMETOOLONG;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name == nullptr) {
|
if (name == nullptr) {
|
||||||
LOG_ERROR(Kernel_Vmm, "name is invalid!");
|
LOG_ERROR(Kernel_Vmm, "name is invalid!");
|
||||||
return ORBIS_KERNEL_ERROR_EFAULT;
|
return ORBIS_KERNEL_ERROR_EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (std::strlen(name) >= ORBIS_KERNEL_MAXIMUM_NAME_LENGTH) {
|
||||||
|
LOG_ERROR(Kernel_Vmm, "name exceeds 32 bytes!");
|
||||||
|
return ORBIS_KERNEL_ERROR_ENAMETOOLONG;
|
||||||
|
}
|
||||||
|
|
||||||
auto* memory = Core::Memory::Instance();
|
auto* memory = Core::Memory::Instance();
|
||||||
memory->NameVirtualRange(std::bit_cast<VAddr>(addr), len, name);
|
memory->NameVirtualRange(std::bit_cast<VAddr>(addr), len, name);
|
||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
|
|
|
@ -47,6 +47,8 @@ enum MemoryOpTypes : u32 {
|
||||||
ORBIS_KERNEL_MAP_OP_TYPE_PROTECT = 4
|
ORBIS_KERNEL_MAP_OP_TYPE_PROTECT = 4
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr u32 ORBIS_KERNEL_MAXIMUM_NAME_LENGTH = 32;
|
||||||
|
|
||||||
struct OrbisQueryInfo {
|
struct OrbisQueryInfo {
|
||||||
uintptr_t start;
|
uintptr_t start;
|
||||||
uintptr_t end;
|
uintptr_t end;
|
||||||
|
@ -64,7 +66,7 @@ struct OrbisVirtualQueryInfo {
|
||||||
u32 is_stack : 1;
|
u32 is_stack : 1;
|
||||||
u32 is_pooled : 1;
|
u32 is_pooled : 1;
|
||||||
u32 is_committed : 1;
|
u32 is_committed : 1;
|
||||||
char name[32];
|
char name[ORBIS_KERNEL_MAXIMUM_NAME_LENGTH];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct OrbisKernelBatchMapEntry {
|
struct OrbisKernelBatchMapEntry {
|
||||||
|
|
|
@ -615,7 +615,7 @@ int MemoryManager::VirtualQuery(VAddr addr, int flags,
|
||||||
info->is_pooled = vma.type == VMAType::PoolReserved || vma.type == VMAType::Pooled ? 1 : 0;
|
info->is_pooled = vma.type == VMAType::PoolReserved || vma.type == VMAType::Pooled ? 1 : 0;
|
||||||
info->is_committed = vma.IsMapped() ? 1 : 0;
|
info->is_committed = vma.IsMapped() ? 1 : 0;
|
||||||
|
|
||||||
strncpy(info->name, vma.name.data(), 32);
|
strncpy(info->name, vma.name.data(), ::Libraries::Kernel::ORBIS_KERNEL_MAXIMUM_NAME_LENGTH);
|
||||||
|
|
||||||
if (vma.type == VMAType::Direct) {
|
if (vma.type == VMAType::Direct) {
|
||||||
const auto dmem_it = FindDmemArea(vma.phys_base);
|
const auto dmem_it = FindDmemArea(vma.phys_base);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue