mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-11 06:40:39 +00:00
SPU TG: Simplify state of saved SPU image data
Save only entry points instead of sys_spu_image structure.
This commit is contained in:
parent
ca0d38d19d
commit
0224c7a9eb
@ -389,7 +389,7 @@ error_code sys_raw_spu_load(s32 id, vm::cptr<char> path, vm::ptr<u32> entry)
|
|||||||
|
|
||||||
sys_spu_image img;
|
sys_spu_image img;
|
||||||
img.load(elf_file);
|
img.load(elf_file);
|
||||||
img.deploy(vm::_ptr<u8>(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id), img.segs.get_ptr(), img.nsegs);
|
img.deploy(vm::_ptr<u8>(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id), std::span(img.segs.get_ptr(), img.nsegs));
|
||||||
img.free();
|
img.free();
|
||||||
|
|
||||||
*entry = img.entry_point;
|
*entry = img.entry_point;
|
||||||
@ -402,7 +402,7 @@ error_code sys_raw_spu_image_load(s32 id, vm::ptr<sys_spu_image> img)
|
|||||||
sysPrxForUser.warning("sys_raw_spu_image_load(id=%d, img=*0x%x)", id, img);
|
sysPrxForUser.warning("sys_raw_spu_image_load(id=%d, img=*0x%x)", id, img);
|
||||||
|
|
||||||
// Load SPU segments
|
// Load SPU segments
|
||||||
img->deploy(vm::_ptr<u8>(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id), img->segs.get_ptr(), img->nsegs);
|
img->deploy(vm::_ptr<u8>(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id), std::span(img->segs.get_ptr(), img->nsegs));
|
||||||
|
|
||||||
// Use MMIO
|
// Use MMIO
|
||||||
vm::write32(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id + RAW_SPU_PROB_OFFSET + SPU_NPC_offs, img->entry_point);
|
vm::write32(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id + RAW_SPU_PROB_OFFSET + SPU_NPC_offs, img->entry_point);
|
||||||
|
@ -109,7 +109,7 @@ void sys_spu_image::free() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void sys_spu_image::deploy(u8* loc, sys_spu_segment* segs, u32 nsegs)
|
void sys_spu_image::deploy(u8* loc, std::span<const sys_spu_segment> segs)
|
||||||
{
|
{
|
||||||
// Segment info dump
|
// Segment info dump
|
||||||
std::string dump;
|
std::string dump;
|
||||||
@ -119,20 +119,18 @@ void sys_spu_image::deploy(u8* loc, sys_spu_segment* segs, u32 nsegs)
|
|||||||
sha1_starts(&sha);
|
sha1_starts(&sha);
|
||||||
u8 sha1_hash[20];
|
u8 sha1_hash[20];
|
||||||
|
|
||||||
for (u32 i = 0; i < nsegs; i++)
|
for (const auto& seg : segs)
|
||||||
{
|
{
|
||||||
auto& seg = segs[i];
|
fmt::append(dump, "\n\t[%u] t=0x%x, ls=0x%x, size=0x%x, addr=0x%x", &seg - segs.data(), seg.type, seg.ls, seg.size, seg.addr);
|
||||||
|
|
||||||
fmt::append(dump, "\n\t[%d] t=0x%x, ls=0x%x, size=0x%x, addr=0x%x", i, seg.type, seg.ls, seg.size, seg.addr);
|
sha1_update(&sha, reinterpret_cast<const uchar*>(&seg.type), sizeof(seg.type));
|
||||||
|
|
||||||
sha1_update(&sha, reinterpret_cast<uchar*>(&seg.type), sizeof(seg.type));
|
|
||||||
|
|
||||||
// Hash big-endian values
|
// Hash big-endian values
|
||||||
if (seg.type == SYS_SPU_SEGMENT_TYPE_COPY)
|
if (seg.type == SYS_SPU_SEGMENT_TYPE_COPY)
|
||||||
{
|
{
|
||||||
std::memcpy(loc + seg.ls, vm::base(seg.addr), seg.size);
|
std::memcpy(loc + seg.ls, vm::base(seg.addr), seg.size);
|
||||||
sha1_update(&sha, reinterpret_cast<uchar*>(&seg.size), sizeof(seg.size));
|
sha1_update(&sha, reinterpret_cast<const uchar*>(&seg.size), sizeof(seg.size));
|
||||||
sha1_update(&sha, reinterpret_cast<uchar*>(&seg.ls), sizeof(seg.ls));
|
sha1_update(&sha, reinterpret_cast<const uchar*>(&seg.ls), sizeof(seg.ls));
|
||||||
sha1_update(&sha, vm::_ptr<uchar>(seg.addr), seg.size);
|
sha1_update(&sha, vm::_ptr<uchar>(seg.addr), seg.size);
|
||||||
}
|
}
|
||||||
else if (seg.type == SYS_SPU_SEGMENT_TYPE_FILL)
|
else if (seg.type == SYS_SPU_SEGMENT_TYPE_FILL)
|
||||||
@ -143,9 +141,9 @@ void sys_spu_image::deploy(u8* loc, sys_spu_segment* segs, u32 nsegs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::fill_n(reinterpret_cast<be_t<u32>*>(loc + seg.ls), seg.size / 4, seg.addr);
|
std::fill_n(reinterpret_cast<be_t<u32>*>(loc + seg.ls), seg.size / 4, seg.addr);
|
||||||
sha1_update(&sha, reinterpret_cast<uchar*>(&seg.size), sizeof(seg.size));
|
sha1_update(&sha, reinterpret_cast<const uchar*>(&seg.size), sizeof(seg.size));
|
||||||
sha1_update(&sha, reinterpret_cast<uchar*>(&seg.ls), sizeof(seg.ls));
|
sha1_update(&sha, reinterpret_cast<const uchar*>(&seg.ls), sizeof(seg.ls));
|
||||||
sha1_update(&sha, reinterpret_cast<uchar*>(&seg.addr), sizeof(seg.addr));
|
sha1_update(&sha, reinterpret_cast<const uchar*>(&seg.addr), sizeof(seg.addr));
|
||||||
}
|
}
|
||||||
else if (seg.type == SYS_SPU_SEGMENT_TYPE_INFO)
|
else if (seg.type == SYS_SPU_SEGMENT_TYPE_INFO)
|
||||||
{
|
{
|
||||||
@ -417,7 +415,7 @@ error_code sys_spu_thread_initialize(ppu_thread& ppu, vm::ptr<u32> thread, u32 g
|
|||||||
*thread = tid;
|
*thread = tid;
|
||||||
|
|
||||||
group->args[inited] = {arg->arg1, arg->arg2, arg->arg3, arg->arg4};
|
group->args[inited] = {arg->arg1, arg->arg2, arg->arg3, arg->arg4};
|
||||||
group->imgs[inited].first = image;
|
group->imgs[inited].first = image.entry_point;
|
||||||
group->imgs[inited].second.assign(image.segs.get_ptr(), image.segs.get_ptr() + image.nsegs);
|
group->imgs[inited].second.assign(image.segs.get_ptr(), image.segs.get_ptr() + image.nsegs);
|
||||||
|
|
||||||
if (++group->init == group->max_num)
|
if (++group->init == group->max_num)
|
||||||
@ -725,7 +723,7 @@ error_code sys_spu_thread_group_start(ppu_thread& ppu, u32 id)
|
|||||||
auto& args = group->args[thread->lv2_id >> 24];
|
auto& args = group->args[thread->lv2_id >> 24];
|
||||||
auto& img = group->imgs[thread->lv2_id >> 24];
|
auto& img = group->imgs[thread->lv2_id >> 24];
|
||||||
|
|
||||||
sys_spu_image::deploy(thread->ls, img.second.data(), img.first.nsegs);
|
sys_spu_image::deploy(thread->ls, std::span(img.second.data(), img.second.size()));
|
||||||
|
|
||||||
thread->cpu_init();
|
thread->cpu_init();
|
||||||
thread->gpr[3] = v128::from64(0, args[0]);
|
thread->gpr[3] = v128::from64(0, args[0]);
|
||||||
@ -733,7 +731,7 @@ error_code sys_spu_thread_group_start(ppu_thread& ppu, u32 id)
|
|||||||
thread->gpr[5] = v128::from64(0, args[2]);
|
thread->gpr[5] = v128::from64(0, args[2]);
|
||||||
thread->gpr[6] = v128::from64(0, args[3]);
|
thread->gpr[6] = v128::from64(0, args[3]);
|
||||||
|
|
||||||
thread->status_npc = {SPU_STATUS_RUNNING, img.first.entry_point};
|
thread->status_npc = {SPU_STATUS_RUNNING, img.first};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1903,7 +1901,7 @@ error_code sys_isolated_spu_create(ppu_thread& ppu, vm::ptr<u32> id, vm::ptr<voi
|
|||||||
img.load(obj);
|
img.load(obj);
|
||||||
|
|
||||||
auto image_info = idm::get<lv2_obj, lv2_spu_image>(img.entry_point);
|
auto image_info = idm::get<lv2_obj, lv2_spu_image>(img.entry_point);
|
||||||
img.deploy(thread->ls, image_info->segs.get_ptr(), image_info->nsegs);
|
img.deploy(thread->ls, std::span(image_info->segs.get_ptr(), image_info->nsegs));
|
||||||
|
|
||||||
thread->write_reg(ls_addr + RAW_SPU_PROB_OFFSET + SPU_NPC_offs, image_info->e_entry);
|
thread->write_reg(ls_addr + RAW_SPU_PROB_OFFSET + SPU_NPC_offs, image_info->e_entry);
|
||||||
ensure(idm::remove_verify<lv2_obj, lv2_spu_image>(img.entry_point, std::move(image_info)));
|
ensure(idm::remove_verify<lv2_obj, lv2_spu_image>(img.entry_point, std::move(image_info)));
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#include "Emu/Memory/vm_ptr.h"
|
#include "Emu/Memory/vm_ptr.h"
|
||||||
#include "Utilities/File.h"
|
#include "Utilities/File.h"
|
||||||
|
|
||||||
|
#include <span>
|
||||||
|
|
||||||
struct lv2_memory_container;
|
struct lv2_memory_container;
|
||||||
|
|
||||||
enum : s32
|
enum : s32
|
||||||
@ -223,7 +225,7 @@ struct sys_spu_image
|
|||||||
|
|
||||||
void load(const fs::file& stream);
|
void load(const fs::file& stream);
|
||||||
void free() const;
|
void free() const;
|
||||||
static void deploy(u8* loc, sys_spu_segment* segs, u32 nsegs);
|
static void deploy(u8* loc, std::span<const sys_spu_segment> segs);
|
||||||
};
|
};
|
||||||
|
|
||||||
enum : u32
|
enum : u32
|
||||||
@ -288,7 +290,7 @@ struct lv2_spu_group
|
|||||||
|
|
||||||
std::array<std::shared_ptr<named_thread<spu_thread>>, 8> threads; // SPU Threads
|
std::array<std::shared_ptr<named_thread<spu_thread>>, 8> threads; // SPU Threads
|
||||||
std::array<s8, 256> threads_map; // SPU Threads map based number
|
std::array<s8, 256> threads_map; // SPU Threads map based number
|
||||||
std::array<std::pair<sys_spu_image, std::vector<sys_spu_segment>>, 8> imgs; // SPU Images
|
std::array<std::pair<u32, std::vector<sys_spu_segment>>, 8> imgs; // Entry points, SPU image segments
|
||||||
std::array<std::array<u64, 4>, 8> args; // SPU Thread Arguments
|
std::array<std::array<u64, 4>, 8> args; // SPU Thread Arguments
|
||||||
|
|
||||||
std::weak_ptr<lv2_event_queue> ep_run; // port for SYS_SPU_THREAD_GROUP_EVENT_RUN events
|
std::weak_ptr<lv2_event_queue> ep_run; // port for SYS_SPU_THREAD_GROUP_EVENT_RUN events
|
||||||
|
Loading…
x
Reference in New Issue
Block a user