vm: Remove vm::dealloc_verbose_nothrow

This commit is contained in:
Eladash 2021-01-09 16:35:54 +02:00 committed by Ivan
commit e4c3b1c2bd
9 changed files with 23 additions and 36 deletions

View file

@ -19,7 +19,7 @@ struct libio_sys_config
{ {
if (stack_addr) if (stack_addr)
{ {
vm::dealloc_verbose_nothrow(stack_addr, vm::stack); ensure(vm::dealloc(stack_addr, vm::stack));
} }
} }
}; };

View file

@ -58,7 +58,7 @@ static void ppu_free_tls(u32 addr)
if (addr < s_tls_area || i >= s_tls_max || (addr - s_tls_area) % s_tls_size) if (addr < s_tls_area || i >= s_tls_max || (addr - s_tls_area) % s_tls_size)
{ {
// Alternative TLS allocation detected // Alternative TLS allocation detected
vm::dealloc_verbose_nothrow(addr, vm::main); ensure(vm::dealloc(addr, vm::main));
return; return;
} }

View file

@ -362,7 +362,7 @@ error_code sys_spu_image_close(ppu_thread& ppu, vm::ptr<sys_spu_image> img)
if (img->type == SYS_SPU_IMAGE_TYPE_USER) if (img->type == SYS_SPU_IMAGE_TYPE_USER)
{ {
//_sys_free(img->segs.addr()); //_sys_free(img->segs.addr());
vm::dealloc_verbose_nothrow(img->segs.addr(), vm::main); vm::dealloc(img->segs.addr(), vm::main);
} }
else if (img->type == SYS_SPU_IMAGE_TYPE_KERNEL) else if (img->type == SYS_SPU_IMAGE_TYPE_KERNEL)
{ {

View file

@ -910,7 +910,7 @@ void ppu_thread::exec_task()
ppu_thread::~ppu_thread() ppu_thread::~ppu_thread()
{ {
// Deallocate Stack Area // Deallocate Stack Area
vm::dealloc_verbose_nothrow(stack_addr, vm::stack); ensure(vm::dealloc(stack_addr, vm::stack));
if (const auto dct = g_fxo->get<lv2_memory_container>()) if (const auto dct = g_fxo->get<lv2_memory_container>())
{ {

View file

@ -1690,7 +1690,7 @@ spu_thread::~spu_thread()
if (!group) if (!group)
{ {
// Deallocate local storage (thread groups are handled in sys_spu.cpp) // Deallocate local storage (thread groups are handled in sys_spu.cpp)
vm::dealloc_verbose_nothrow(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * index, vm::spu); ensure(vm::dealloc(RAW_SPU_BASE_ADDR + RAW_SPU_OFFSET * index, vm::spu));
} }
// Release LS mirrors area // Release LS mirrors area

View file

@ -106,7 +106,8 @@ void sys_spu_image::free()
{ {
if (type == SYS_SPU_IMAGE_TYPE_KERNEL) if (type == SYS_SPU_IMAGE_TYPE_KERNEL)
{ {
vm::dealloc_verbose_nothrow(segs.addr(), vm::main); // TODO: Remove, should be handled by syscalls
ensure(vm::dealloc(segs.addr(), vm::main));
} }
} }

View file

@ -998,51 +998,40 @@ namespace vm
if (!block) if (!block)
{ {
fmt::throw_exception("Invalid memory location (%u)", +location); vm_log.error("vm::alloc(): Invalid memory location (%u)", +location);
ensure(location < memory_location_max); // The only allowed locations to fail
return 0;
} }
return block->alloc(size, nullptr, align); return block->alloc(size, nullptr, align);
} }
u32 falloc(u32 addr, u32 size, memory_location_t location) u32 falloc(u32 addr, u32 size, memory_location_t location, const std::shared_ptr<utils::shm>* src)
{ {
const auto block = get(location, addr); const auto block = get(location, addr);
if (!block) if (!block)
{ {
fmt::throw_exception("Invalid memory location (%u, addr=0x%x)", +location, addr); vm_log.error("vm::falloc(): Invalid memory location (%u, addr=0x%x)", +location, addr);
ensure(location == any || location < memory_location_max); // The only allowed locations to fail
return 0;
} }
return block->falloc(addr, size); return block->falloc(addr, size, src);
} }
u32 dealloc(u32 addr, memory_location_t location) u32 dealloc(u32 addr, memory_location_t location, const std::shared_ptr<utils::shm>* src)
{ {
const auto block = get(location, addr); const auto block = get(location, addr);
if (!block) if (!block)
{ {
fmt::throw_exception("Invalid memory location (%u, addr=0x%x)", +location, addr); vm_log.error("vm::dealloc(): Invalid memory location (%u, addr=0x%x)", +location, addr);
ensure(location == any || location < memory_location_max); // The only allowed locations to fail
return 0;
} }
return block->dealloc(addr); return block->dealloc(addr, src);
}
void dealloc_verbose_nothrow(u32 addr, memory_location_t location) noexcept
{
const auto block = get(location, addr);
if (!block)
{
vm_log.error("vm::dealloc(): invalid memory location (%u, addr=0x%x)\n", +location, addr);
return;
}
if (!block->dealloc(addr))
{
vm_log.error("vm::dealloc(): deallocation failed (addr=0x%x)\n", addr);
return;
}
} }
void lock_sudo(u32 addr, u32 size) void lock_sudo(u32 addr, u32 size)

View file

@ -81,13 +81,10 @@ namespace vm
u32 alloc(u32 size, memory_location_t location, u32 align = 0x10000); u32 alloc(u32 size, memory_location_t location, u32 align = 0x10000);
// Map memory at specified address (in optionally specified memory location) // Map memory at specified address (in optionally specified memory location)
u32 falloc(u32 addr, u32 size, memory_location_t location = any); u32 falloc(u32 addr, u32 size, memory_location_t location = any, const std::shared_ptr<utils::shm>* src = nullptr);
// Unmap memory at specified address (in optionally specified memory location), return size // Unmap memory at specified address (in optionally specified memory location), return size
u32 dealloc(u32 addr, memory_location_t location = any); u32 dealloc(u32 addr, memory_location_t location = any, const std::shared_ptr<utils::shm>* src = nullptr);
// dealloc() with no return value and no exceptions
void dealloc_verbose_nothrow(u32 addr, memory_location_t location = any) noexcept;
// utils::memory_lock wrapper for locking sudo memory // utils::memory_lock wrapper for locking sudo memory
void lock_sudo(u32 addr, u32 size); void lock_sudo(u32 addr, u32 size);

View file

@ -16,7 +16,7 @@ namespace vm
static inline void dealloc(u32 addr, u32 size = 0) noexcept static inline void dealloc(u32 addr, u32 size = 0) noexcept
{ {
return vm::dealloc_verbose_nothrow(addr, Location); ensure(vm::dealloc(addr, Location));
} }
}; };