Browse Source

kernel_executable: Optimize BLZ decompression

nce_cpp
Zach Hilman 7 years ago
parent
commit
ae00309771
  1. 11
      src/core/file_sys/kernel_executable.cpp
  2. 12
      src/core/loader/kip.cpp

11
src/core/file_sys/kernel_executable.cpp

@ -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 {

12
src/core/loader/kip.cpp

@ -53,10 +53,14 @@ AppLoader::LoadResult AppLoader_KIP::Load(Kernel::Process& process) {
return {kip->GetStatus(), {}}; return {kip->GetStatus(), {}};
} }
const auto address_space =
kip->Is64Bit() ? (kip->Is39BitAddressSpace() ? FileSys::ProgramAddressSpaceType::Is39Bit
: FileSys::ProgramAddressSpaceType::Is36Bit)
: FileSys::ProgramAddressSpaceType::Is32Bit;
const auto get_kip_address_space_type = [](const auto& kip) {
return kip.Is64Bit()
? (kip.Is39BitAddressSpace() ? FileSys::ProgramAddressSpaceType::Is39Bit
: FileSys::ProgramAddressSpaceType::Is36Bit)
: 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(),

Loading…
Cancel
Save