|
|
@ -63,21 +63,28 @@ static Result ControlMemory(u32* out_addr, u32 operation, u32 addr0, u32 addr1, |
|
|
|
|
|
|
|
|
/// Maps a memory block to specified address
|
|
|
/// Maps a memory block to specified address
|
|
|
static Result MapMemoryBlock(Handle handle, u32 addr, u32 permissions, u32 other_permissions) { |
|
|
static Result MapMemoryBlock(Handle handle, u32 addr, u32 permissions, u32 other_permissions) { |
|
|
|
|
|
using Kernel::SharedMemory; |
|
|
|
|
|
using Kernel::MemoryPermission; |
|
|
|
|
|
|
|
|
LOG_TRACE(Kernel_SVC, "called memblock=0x%08X, addr=0x%08X, mypermissions=0x%08X, otherpermission=%d", |
|
|
LOG_TRACE(Kernel_SVC, "called memblock=0x%08X, addr=0x%08X, mypermissions=0x%08X, otherpermission=%d", |
|
|
handle, addr, permissions, other_permissions); |
|
|
handle, addr, permissions, other_permissions); |
|
|
|
|
|
|
|
|
Kernel::MemoryPermission permissions_type = static_cast<Kernel::MemoryPermission>(permissions); |
|
|
|
|
|
|
|
|
SharedPtr<SharedMemory> shared_memory = Kernel::g_handle_table.Get<SharedMemory>(handle); |
|
|
|
|
|
if (shared_memory == nullptr) |
|
|
|
|
|
return InvalidHandle(ErrorModule::Kernel).raw; |
|
|
|
|
|
|
|
|
|
|
|
MemoryPermission permissions_type = static_cast<MemoryPermission>(permissions); |
|
|
switch (permissions_type) { |
|
|
switch (permissions_type) { |
|
|
case Kernel::MemoryPermission::Read: |
|
|
|
|
|
case Kernel::MemoryPermission::Write: |
|
|
|
|
|
case Kernel::MemoryPermission::ReadWrite: |
|
|
|
|
|
case Kernel::MemoryPermission::Execute: |
|
|
|
|
|
case Kernel::MemoryPermission::ReadExecute: |
|
|
|
|
|
case Kernel::MemoryPermission::WriteExecute: |
|
|
|
|
|
case Kernel::MemoryPermission::ReadWriteExecute: |
|
|
|
|
|
case Kernel::MemoryPermission::DontCare: |
|
|
|
|
|
Kernel::MapSharedMemory(handle, addr, permissions_type, |
|
|
|
|
|
static_cast<Kernel::MemoryPermission>(other_permissions)); |
|
|
|
|
|
|
|
|
case MemoryPermission::Read: |
|
|
|
|
|
case MemoryPermission::Write: |
|
|
|
|
|
case MemoryPermission::ReadWrite: |
|
|
|
|
|
case MemoryPermission::Execute: |
|
|
|
|
|
case MemoryPermission::ReadExecute: |
|
|
|
|
|
case MemoryPermission::WriteExecute: |
|
|
|
|
|
case MemoryPermission::ReadWriteExecute: |
|
|
|
|
|
case MemoryPermission::DontCare: |
|
|
|
|
|
shared_memory->Map(addr, permissions_type, |
|
|
|
|
|
static_cast<MemoryPermission>(other_permissions)); |
|
|
break; |
|
|
break; |
|
|
default: |
|
|
default: |
|
|
LOG_ERROR(Kernel_SVC, "unknown permissions=0x%08X", permissions); |
|
|
LOG_ERROR(Kernel_SVC, "unknown permissions=0x%08X", permissions); |
|
|
@ -463,12 +470,19 @@ static s64 GetSystemTick() { |
|
|
|
|
|
|
|
|
/// Creates a memory block at the specified address with the specified permissions and size
|
|
|
/// Creates a memory block at the specified address with the specified permissions and size
|
|
|
static Result CreateMemoryBlock(Handle* memblock, u32 addr, u32 size, u32 my_permission, |
|
|
static Result CreateMemoryBlock(Handle* memblock, u32 addr, u32 size, u32 my_permission, |
|
|
u32 other_permission) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
u32 other_permission) { |
|
|
|
|
|
using Kernel::SharedMemory; |
|
|
// TODO(Subv): Implement this function
|
|
|
// TODO(Subv): Implement this function
|
|
|
|
|
|
|
|
|
Handle shared_memory = Kernel::CreateSharedMemory(); |
|
|
|
|
|
*memblock = shared_memory; |
|
|
|
|
|
|
|
|
ResultVal<SharedPtr<SharedMemory>> shared_memory_res = SharedMemory::Create(); |
|
|
|
|
|
if (shared_memory_res.Failed()) |
|
|
|
|
|
return shared_memory_res.Code().raw; |
|
|
|
|
|
|
|
|
|
|
|
ResultVal<Handle> handle_res = Kernel::g_handle_table.Create(*shared_memory_res); |
|
|
|
|
|
if (handle_res.Failed()) |
|
|
|
|
|
return handle_res.Code().raw; |
|
|
|
|
|
|
|
|
|
|
|
*memblock = *handle_res; |
|
|
LOG_WARNING(Kernel_SVC, "(STUBBED) called addr=0x%08X", addr); |
|
|
LOG_WARNING(Kernel_SVC, "(STUBBED) called addr=0x%08X", addr); |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|