yuzu/src/core/hle/service/sm/controller.cpp

73 lines
2.5 KiB
C++
Raw Normal View History

2020-12-28 19:15:37 +04:00
// Copyright 2018 yuzu emulator team
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include "common/assert.h"
#include "common/logging/log.h"
#include "core/hle/ipc_helpers.h"
2021-05-06 06:45:54 +04:00
#include "core/hle/kernel/k_client_session.h"
#include "core/hle/kernel/k_server_session.h"
#include "core/hle/kernel/k_session.h"
2020-12-28 19:15:37 +04:00
#include "core/hle/service/sm/controller.h"
namespace Service::SM {
void Controller::ConvertCurrentObjectToDomain(Kernel::HLERequestContext& ctx) {
ASSERT_MSG(ctx.Session()->IsSession(), "Session is already a domain");
2021-05-06 06:45:54 +04:00
LOG_DEBUG(Service, "called, server_session={}", ctx.Session()->GetId());
2020-12-28 19:15:37 +04:00
ctx.Session()->ConvertToDomain();
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(RESULT_SUCCESS);
rb.Push<u32>(1); // Converted sessions start with 1 request handler
}
2021-05-11 04:22:43 +04:00
void Controller::DuplicateSession(Kernel::HLERequestContext& ctx) {
2020-12-28 19:15:37 +04:00
// TODO(bunnei): This is just creating a new handle to the same Session. I assume this is wrong
// and that we probably want to actually make an entirely new Session, but we still need to
// verify this on hardware.
2021-05-11 04:22:43 +04:00
2020-12-28 19:15:37 +04:00
LOG_DEBUG(Service, "called");
2021-05-11 04:22:43 +04:00
auto session = ctx.Session()->GetParent();
// Open a reference to the session to simulate a new one being created.
session->Open();
session->GetClientSession().Open();
session->GetServerSession().Open();
2020-12-28 19:15:37 +04:00
IPC::ResponseBuilder rb{ctx, 2, 0, 1, IPC::ResponseBuilder::Flags::AlwaysMoveHandles};
rb.Push(RESULT_SUCCESS);
2021-05-11 04:22:43 +04:00
rb.PushMoveObjects(session->GetClientSession());
2020-12-28 19:15:37 +04:00
}
2021-05-11 04:22:43 +04:00
void Controller::DuplicateSessionEx(Kernel::HLERequestContext& ctx) {
LOG_DEBUG(Service, "called");
2020-12-28 19:15:37 +04:00
2021-05-11 04:22:43 +04:00
DuplicateSession(ctx);
2020-12-28 19:15:37 +04:00
}
void Controller::QueryPointerBufferSize(Kernel::HLERequestContext& ctx) {
LOG_WARNING(Service, "(STUBBED) called");
IPC::ResponseBuilder rb{ctx, 3};
rb.Push(RESULT_SUCCESS);
2021-05-11 04:22:43 +04:00
rb.Push<u16>(0x8000);
2020-12-28 19:15:37 +04:00
}
// https://switchbrew.org/wiki/IPC_Marshalling
Controller::Controller(Core::System& system_) : ServiceFramework{system_, "IpcController"} {
static const FunctionInfo functions[] = {
{0, &Controller::ConvertCurrentObjectToDomain, "ConvertCurrentObjectToDomain"},
{1, nullptr, "CopyFromCurrentDomain"},
2021-05-11 04:22:43 +04:00
{2, &Controller::DuplicateSession, "DuplicateSession"},
2020-12-28 19:15:37 +04:00
{3, &Controller::QueryPointerBufferSize, "QueryPointerBufferSize"},
2021-05-11 04:22:43 +04:00
{4, &Controller::DuplicateSessionEx, "DuplicateSessionEx"},
2020-12-28 19:15:37 +04:00
};
RegisterHandlers(functions);
}
Controller::~Controller() = default;
} // namespace Service::SM