s32 sys_raw_spu_load(s32 id, vm::cptr<char> path, vm::ptr<u32> entry) { sysPrxForUser.warning("sys_raw_spu_load(id=%d, path=*0x%x, entry=*0x%x)", id, path, entry); sysPrxForUser.warning("*** path = '%s'", path.get_ptr()); vfsFile f(path.get_ptr()); if (!f.IsOpened()) { sysPrxForUser.error("sys_raw_spu_load error: '%s' not found!", path.get_ptr()); return CELL_ENOENT; } SceHeader hdr; hdr.Load(f); if (hdr.CheckMagic()) { sysPrxForUser.error("sys_raw_spu_load error: '%s' is encrypted! Decrypt SELF and try again.", path.get_ptr()); Emu.Pause(); return CELL_ENOENT; } f.Seek(0); u32 _entry; LoadSpuImage(f, _entry, RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id); *entry = _entry | 1; return CELL_OK; }
s32 sys_raw_spu_load(s32 id, vm::cptr<char> path, vm::ptr<u32> entry) { sysPrxForUser.warning("sys_raw_spu_load(id=%d, path=*0x%x, entry=*0x%x)", id, path, entry); sysPrxForUser.warning("*** path = '%s'", path.get_ptr()); const fs::file f(vfs::get(path.get_ptr())); if (!f) { sysPrxForUser.error("sys_raw_spu_load() error: '%s' not found!", path.get_ptr()); return CELL_ENOENT; } SceHeader hdr; hdr.Load(f); if (hdr.CheckMagic()) { throw fmt::exception("sys_raw_spu_load() error: '%s' is encrypted! Try to decrypt it manually and try again.", path.get_ptr()); } f.seek(0); u32 _entry; LoadSpuImage(f, _entry, RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * id); *entry = _entry | 1; return CELL_OK; }
s32 sys_spu_image_open(vm::ptr<sys_spu_image_t> img, vm::cptr<char> path) { sys_spu.warning("sys_spu_image_open(img=*0x%x, path=*0x%x)", img, path); const fs::file f(vfs::get(path.get_ptr())); if (!f) { sys_spu.error("sys_spu_image_open() error: '%s' not found!", path.get_ptr()); return CELL_ENOENT; } SceHeader hdr; hdr.Load(f); if (hdr.CheckMagic()) { throw fmt::exception("sys_spu_image_open() error: '%s' is encrypted! Try to decrypt it manually and try again.", path.get_ptr()); } f.seek(0); u32 entry; u32 offset = LoadSpuImage(f, entry); img->type = SYS_SPU_IMAGE_TYPE_USER; img->entry_point = entry; img->segs.set(offset); // TODO: writing actual segment info img->nsegs = 1; // wrong value return CELL_OK; }
//156 s32 sys_spu_image_open(mem_ptr_t<sys_spu_image> img, u32 path_addr) { const std::string path = Memory.ReadString(path_addr).c_str(); sc_spu.Warning("sys_spu_image_open(img_addr=0x%x, path_addr=0x%x [%s])", img.GetAddr(), path_addr, path.c_str()); if(!img.IsGood() || !Memory.IsGoodAddr(path_addr)) { return CELL_EFAULT; } vfsFile f(path); if(!f.IsOpened()) { sc_spu.Error("sys_spu_image_open error: '%s' not found!", path.c_str()); return CELL_ENOENT; } u32 entry; u32 offset = LoadSpuImage(f, entry); img->type = 1; img->entry_point = entry; img->segs_addr = offset; img->nsegs = 0; return CELL_OK; }
s32 sys_spu_image_open(vm::ptr<sys_spu_image> img, vm::cptr<char> path) { sys_spu.Warning("sys_spu_image_open(img_addr=0x%x, path_addr=0x%x [%s])", img.addr(), path.addr(), path.get_ptr()); vfsFile f(path.get_ptr()); if(!f.IsOpened()) { sys_spu.Error("sys_spu_image_open error: '%s' not found!", path.get_ptr()); return CELL_ENOENT; } SceHeader hdr; hdr.Load(f); if (hdr.CheckMagic()) { sys_spu.Error("sys_spu_image_open error: '%s' is encrypted! Decrypt SELF and try again.", path.get_ptr()); Emu.Pause(); return CELL_ENOENT; } f.Seek(0); u32 entry; u32 offset = LoadSpuImage(f, entry); img->type = SYS_SPU_IMAGE_TYPE_USER; img->entry_point = entry; img->addr = offset; // TODO: writing actual segment info img->nsegs = 1; // wrong value return CELL_OK; }
//156 int sys_spu_image_open(u32 img_addr, u32 path_addr) { const wxString& path = Memory.ReadString(path_addr); sc_spu.Warning("sys_spu_image_open(img_addr=0x%x, path_addr=0x%x [%s])", img_addr, path_addr, path); if(!Memory.IsGoodAddr(img_addr, sizeof(sys_spu_image)) || !Memory.IsGoodAddr(path_addr)) { return CELL_EFAULT; } vfsStream* stream = Emu.GetVFS().Open(path, vfsRead); if(!stream || !stream->IsOpened()) { sc_spu.Error("sys_spu_image_open error: '%s' not found!", path); delete stream; return CELL_ENOENT; } u32 entry = LoadSpuImage(*stream); delete stream; auto& ret = (sys_spu_image&)Memory[img_addr]; re(ret.type, 1); re(ret.entry_point, entry); re(ret.segs_addr, 0x0); re(ret.nsegs, 0); return CELL_OK; }
u32 LoadSpuImage(const fs::file& stream, u32& spu_ep) { const u32 alloc_size = 256 * 1024; u32 spu_offset = (u32)vm::alloc(alloc_size, vm::main); LoadSpuImage(stream, spu_ep, spu_offset); return spu_offset; }
s32 sys_spu_image_import(vm::ptr<sys_spu_image_t> img, u32 src, u32 type) { sysPrxForUser.warning("sys_spu_image_import(img=*0x%x, src=0x%x, type=%d)", img, src, type); u32 entry, offset = LoadSpuImage(fs::file(vm::base(src), 0 - src), entry); img->type = SYS_SPU_IMAGE_TYPE_USER; img->entry_point = entry; img->segs.set(offset); // TODO: writing actual segment info img->nsegs = 1; // wrong value return CELL_OK; }
s32 spu_image_import(sys_spu_image& img, u32 src, u32 type) { vfsStreamMemory f(src); u32 entry; u32 offset = LoadSpuImage(f, entry); img.type = SYS_SPU_IMAGE_TYPE_USER; img.entry_point = entry; img.addr = offset; // TODO: writing actual segment info img.nsegs = 1; // wrong value return CELL_OK; }
int sys_spu_image_import(vm::ptr<sys_spu_image> img, u32 src, u32 type) { sysPrxForUser->Warning("sys_spu_image_import(img=0x%x, src=0x%x, type=0x%x)", img.addr(), src, type); vfsStreamMemory f(src); u32 entry; u32 offset = LoadSpuImage(f, entry); img->type = type; img->entry_point = entry; img->segs_addr = offset; img->nsegs = 0; return CELL_OK; }
int sys_spu_image_import(mem_ptr_t<sys_spu_image> img, u32 src, u32 type) { sysPrxForUser->Warning("sys_spu_image_import(img=0x%x, src=0x%x, type=0x%x)", img.GetAddr(), src, type); if(!img.IsGood() || !Memory.IsGoodAddr(src)) { return CELL_EFAULT; } vfsStreamMemory f(src); u32 entry; u32 offset = LoadSpuImage(f, entry); img->type = type; img->entry_point = entry; img->segs_addr = offset; img->nsegs = 0; return CELL_OK; }