mirror of
https://github.com/Lime3DS/Lime3DS.git
synced 2024-11-25 02:56:56 +01:00
2067946f59
* Kernel: reimplement memory management on physical FCRAM * Kernel/Process: Unmap does not care the source memory permission What game usually does is after mapping the memory, they reprotect the source memory as no permission to avoid modification there * Kernel/SharedMemory: zero initialize new-allocated memory * Process/Thread: zero new TLS entry * Kernel: fix a bug where code segments memory usage are accumulated twice It is added to both misc and heap (done inside HeapAlloc), which results a doubled number reported by svcGetProcessInfo. While we are on it, we just merge the three number misc, heap and linear heap usage together, as there is no where they are distinguished. Question: is TLS page also added to this number? * Kernel/SharedMemory: add more object info on mapping error * Process: lower log level; SharedMemory: store phys offset * VMManager: add helper function to retrieve backing block list for a range
72 lines
2.5 KiB
C++
72 lines
2.5 KiB
C++
// Copyright 2016 Citra Emulator Project
|
|
// Licensed under GPLv2 or any later version
|
|
// Refer to the license.txt file included.
|
|
|
|
#include "common/string_util.h"
|
|
#include "core/core.h"
|
|
#include "core/hle/applets/erreula.h"
|
|
#include "core/hle/service/apt/apt.h"
|
|
|
|
namespace HLE {
|
|
namespace Applets {
|
|
|
|
ResultCode ErrEula::ReceiveParameter(const Service::APT::MessageParameter& parameter) {
|
|
if (parameter.signal != Service::APT::SignalType::Request) {
|
|
LOG_ERROR(Service_APT, "unsupported signal {}", static_cast<u32>(parameter.signal));
|
|
UNIMPLEMENTED();
|
|
// TODO(Subv): Find the right error code
|
|
return ResultCode(-1);
|
|
}
|
|
|
|
// The LibAppJustStarted message contains a buffer with the size of the framebuffer shared
|
|
// memory.
|
|
// Create the SharedMemory that will hold the framebuffer data
|
|
Service::APT::CaptureBufferInfo capture_info;
|
|
ASSERT(sizeof(capture_info) == parameter.buffer.size());
|
|
|
|
memcpy(&capture_info, parameter.buffer.data(), sizeof(capture_info));
|
|
|
|
// TODO: allocated memory never released
|
|
using Kernel::MemoryPermission;
|
|
// Create a SharedMemory that directly points to this heap block.
|
|
framebuffer_memory = Core::System::GetInstance().Kernel().CreateSharedMemoryForApplet(
|
|
0, capture_info.size, MemoryPermission::ReadWrite, MemoryPermission::ReadWrite,
|
|
"ErrEula Memory");
|
|
|
|
// Send the response message with the newly created SharedMemory
|
|
Service::APT::MessageParameter result;
|
|
result.signal = Service::APT::SignalType::Response;
|
|
result.buffer.clear();
|
|
result.destination_id = Service::APT::AppletId::Application;
|
|
result.sender_id = id;
|
|
result.object = framebuffer_memory;
|
|
|
|
SendParameter(result);
|
|
return RESULT_SUCCESS;
|
|
}
|
|
|
|
ResultCode ErrEula::StartImpl(const Service::APT::AppletStartupParameter& parameter) {
|
|
is_running = true;
|
|
|
|
// TODO(Subv): Set the expected fields in the response buffer before resending it to the
|
|
// application.
|
|
// TODO(Subv): Reverse the parameter format for the ErrEula applet
|
|
|
|
// Let the application know that we're closing
|
|
Service::APT::MessageParameter message;
|
|
message.buffer.resize(parameter.buffer.size());
|
|
std::fill(message.buffer.begin(), message.buffer.end(), 0);
|
|
message.signal = Service::APT::SignalType::WakeupByExit;
|
|
message.destination_id = Service::APT::AppletId::Application;
|
|
message.sender_id = id;
|
|
SendParameter(message);
|
|
|
|
is_running = false;
|
|
return RESULT_SUCCESS;
|
|
}
|
|
|
|
void ErrEula::Update() {}
|
|
|
|
} // namespace Applets
|
|
} // namespace HLE
|