kernel_executable: Optimize BLZ decompression
This commit is contained in:
parent
c417b4fe28
commit
9db119f8a2
|
@ -34,7 +34,7 @@ bool DecompressBLZ(std::vector<u8>& data) {
|
||||||
--index;
|
--index;
|
||||||
auto control = data[index + start_offset];
|
auto control = data[index + start_offset];
|
||||||
for (size_t i = 0; i < 8; ++i) {
|
for (size_t i = 0; i < 8; ++i) {
|
||||||
if ((control & 0x80) > 0) {
|
if (((control << i) & 0x80) > 0) {
|
||||||
if (index < 2) {
|
if (index < 2) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -70,9 +70,8 @@ bool DecompressBLZ(std::vector<u8>& data) {
|
||||||
data[out_index + start_offset] = data[index + start_offset];
|
data[out_index + start_offset] = data[index + start_offset];
|
||||||
}
|
}
|
||||||
|
|
||||||
control <<= 1;
|
|
||||||
if (out_index == 0)
|
if (out_index == 0)
|
||||||
return true;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,15 +131,15 @@ std::vector<u8> KIP::GetSectionDecompressed(u8 index) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KIP::Is64Bit() const {
|
bool KIP::Is64Bit() const {
|
||||||
return header.flags & 0x8;
|
return (header.flags & 0x8) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KIP::Is39BitAddressSpace() const {
|
bool KIP::Is39BitAddressSpace() const {
|
||||||
return header.flags & 0x10;
|
return (header.flags & 0x10) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool KIP::IsService() const {
|
bool KIP::IsService() const {
|
||||||
return header.flags & 0x20;
|
return (header.flags & 0x20) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<u32> KIP::GetKernelCapabilities() const {
|
std::vector<u32> KIP::GetKernelCapabilities() const {
|
||||||
|
|
|
@ -53,10 +53,14 @@ AppLoader::LoadResult AppLoader_KIP::Load(Kernel::Process& process) {
|
||||||
return {kip->GetStatus(), {}};
|
return {kip->GetStatus(), {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto address_space =
|
const auto get_kip_address_space_type = [](const auto& kip) {
|
||||||
kip->Is64Bit() ? (kip->Is39BitAddressSpace() ? FileSys::ProgramAddressSpaceType::Is39Bit
|
return kip.Is64Bit()
|
||||||
|
? (kip.Is39BitAddressSpace() ? FileSys::ProgramAddressSpaceType::Is39Bit
|
||||||
: FileSys::ProgramAddressSpaceType::Is36Bit)
|
: FileSys::ProgramAddressSpaceType::Is36Bit)
|
||||||
: FileSys::ProgramAddressSpaceType::Is32Bit;
|
: FileSys::ProgramAddressSpaceType::Is32Bit;
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto address_space = get_kip_address_space_type(*kip);
|
||||||
|
|
||||||
FileSys::ProgramMetadata metadata;
|
FileSys::ProgramMetadata metadata;
|
||||||
metadata.LoadManual(kip->Is64Bit(), address_space, kip->GetMainThreadPriority(),
|
metadata.LoadManual(kip->Is64Bit(), address_space, kip->GetMainThreadPriority(),
|
||||||
|
|
Reference in New Issue