Merge pull request #1249 from emoose/saverest-fix
[CPU] Fix XexModule::FindSaveRest not finding functions properly
This commit is contained in:
commit
3103ad8e16
|
@ -754,7 +754,7 @@ int XexModule::ReadImageBasicCompressed(const void* xex_addr,
|
||||||
xex2_page_descriptor desc;
|
xex2_page_descriptor desc;
|
||||||
desc.value = xe::byte_swap(xex_security_info()->page_descriptors[i].value);
|
desc.value = xe::byte_swap(xex_security_info()->page_descriptors[i].value);
|
||||||
|
|
||||||
total_size += desc.size * heap->page_size();
|
total_size += desc.page_count * heap->page_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate in-place the XEX memory.
|
// Allocate in-place the XEX memory.
|
||||||
|
@ -1108,13 +1108,13 @@ bool XexModule::LoadContinue() {
|
||||||
desc.value = xe::byte_swap(sec_header->page_descriptors[i].value);
|
desc.value = xe::byte_swap(sec_header->page_descriptors[i].value);
|
||||||
|
|
||||||
const auto start_address = base_address_ + (page * page_size);
|
const auto start_address = base_address_ + (page * page_size);
|
||||||
const auto end_address = start_address + (desc.size * page_size);
|
const auto end_address = start_address + (desc.page_count * page_size);
|
||||||
if (desc.info == XEX_SECTION_CODE) {
|
if (desc.info == XEX_SECTION_CODE) {
|
||||||
low_address_ = std::min(low_address_, start_address);
|
low_address_ = std::min(low_address_, start_address);
|
||||||
high_address_ = std::max(high_address_, end_address);
|
high_address_ = std::max(high_address_, end_address);
|
||||||
}
|
}
|
||||||
|
|
||||||
page += desc.size;
|
page += desc.page_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Notify backend that we have an executable range.
|
// Notify backend that we have an executable range.
|
||||||
|
@ -1180,7 +1180,7 @@ bool XexModule::LoadContinue() {
|
||||||
desc.value = xe::byte_swap(sec_header->page_descriptors[i].value);
|
desc.value = xe::byte_swap(sec_header->page_descriptors[i].value);
|
||||||
|
|
||||||
auto address = base_address_ + (page * page_size);
|
auto address = base_address_ + (page * page_size);
|
||||||
auto size = desc.size * page_size;
|
auto size = desc.page_count * page_size;
|
||||||
switch (desc.info) {
|
switch (desc.info) {
|
||||||
case XEX_SECTION_CODE:
|
case XEX_SECTION_CODE:
|
||||||
case XEX_SECTION_READONLY_DATA:
|
case XEX_SECTION_READONLY_DATA:
|
||||||
|
@ -1191,7 +1191,7 @@ bool XexModule::LoadContinue() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
page += desc.size;
|
page += desc.page_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1576,12 +1576,14 @@ bool XexModule::FindSaveRest() {
|
||||||
auto page_size = base_address_ <= 0x90000000 ? 64 * 1024 : 4 * 1024;
|
auto page_size = base_address_ <= 0x90000000 ? 64 * 1024 : 4 * 1024;
|
||||||
auto sec_header = xex_security_info();
|
auto sec_header = xex_security_info();
|
||||||
for (uint32_t i = 0, page = 0; i < sec_header->page_descriptor_count; i++) {
|
for (uint32_t i = 0, page = 0; i < sec_header->page_descriptor_count; i++) {
|
||||||
const xex2_page_descriptor* section =
|
// Byteswap the bitfield manually.
|
||||||
&xex_security_info()->page_descriptors[i];
|
xex2_page_descriptor desc;
|
||||||
const auto start_address = base_address_ + (page * page_size);
|
desc.value = xe::byte_swap(sec_header->page_descriptors[i].value);
|
||||||
const auto end_address = start_address + (section->size * page_size);
|
|
||||||
|
|
||||||
if (section->info == XEX_SECTION_CODE) {
|
const auto start_address = base_address_ + (page * page_size);
|
||||||
|
const auto end_address = start_address + (desc.page_count * page_size);
|
||||||
|
|
||||||
|
if (desc.info == XEX_SECTION_CODE) {
|
||||||
if (!gplr_start) {
|
if (!gplr_start) {
|
||||||
gplr_start = memory_->SearchAligned(start_address, end_address,
|
gplr_start = memory_->SearchAligned(start_address, end_address,
|
||||||
gprlr_code_values,
|
gprlr_code_values,
|
||||||
|
@ -1602,7 +1604,7 @@ bool XexModule::FindSaveRest() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
page += section->size;
|
page += desc.page_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add function stubs.
|
// Add function stubs.
|
||||||
|
|
|
@ -67,7 +67,7 @@ class XexModule : public xe::cpu::Module {
|
||||||
desc.value =
|
desc.value =
|
||||||
xe::byte_swap(xex_security_info()->page_descriptors[i].value);
|
xe::byte_swap(xex_security_info()->page_descriptors[i].value);
|
||||||
|
|
||||||
total_size += desc.size * heap->page_size();
|
total_size += desc.page_count * heap->page_size();
|
||||||
}
|
}
|
||||||
return total_size;
|
return total_size;
|
||||||
}
|
}
|
||||||
|
|
|
@ -679,12 +679,13 @@ void UserModule::Dump() {
|
||||||
const uint32_t page_size =
|
const uint32_t page_size =
|
||||||
xex_module()->base_address() < 0x90000000 ? 64 * 1024 : 4 * 1024;
|
xex_module()->base_address() < 0x90000000 ? 64 * 1024 : 4 * 1024;
|
||||||
uint32_t start_address = xex_module()->base_address() + (page * page_size);
|
uint32_t start_address = xex_module()->base_address() + (page * page_size);
|
||||||
uint32_t end_address = start_address + (page_descriptor.size * page_size);
|
uint32_t end_address =
|
||||||
|
start_address + (page_descriptor.page_count * page_size);
|
||||||
|
|
||||||
sb.AppendFormat(" %3u %s %3u pages %.8X - %.8X (%d bytes)\n", page,
|
sb.AppendFormat(" %3u %s %3u pages %.8X - %.8X (%d bytes)\n", page,
|
||||||
type, page_descriptor.size, start_address, end_address,
|
type, page_descriptor.page_count, start_address,
|
||||||
page_descriptor.size * page_size);
|
end_address, page_descriptor.page_count * page_size);
|
||||||
page += page_descriptor.size;
|
page += page_descriptor.page_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Print out imports.
|
// Print out imports.
|
||||||
|
|
|
@ -514,8 +514,8 @@ struct xex2_header {
|
||||||
struct xex2_page_descriptor {
|
struct xex2_page_descriptor {
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
uint32_t info : 4;
|
xex2_section_type info : 4;
|
||||||
uint32_t size : 28;
|
uint32_t page_count : 28;
|
||||||
};
|
};
|
||||||
xe::be<uint32_t> value; // 0x0
|
xe::be<uint32_t> value; // 0x0
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue