10 changed files with 146 additions and 20 deletions
-
2src/core/CMakeLists.txt
-
12src/core/hle/service/hid/controllers/npad.cpp
-
8src/core/hle/service/hid/controllers/npad.h
-
14src/core/hle/service/hid/hid.cpp
-
13src/core/hle/service/hid/hid.h
-
64src/core/hle/service/kernel_helpers.cpp
-
35src/core/hle/service/kernel_helpers.h
-
10src/core/hle/service/nvdrv/nvdrv.cpp
-
3src/core/hle/service/nvdrv/nvdrv.h
-
5src/core/hle/service/service.h
@ -0,0 +1,64 @@ |
|||
// Copyright 2021 yuzu emulator team
|
|||
// Licensed under GPLv2 or any later version
|
|||
// Refer to the license.txt file included.
|
|||
|
|||
#pragma once
|
|||
|
|||
#include "core/core.h"
|
|||
#include "core/hle/kernel/k_event.h"
|
|||
#include "core/hle/kernel/k_process.h"
|
|||
#include "core/hle/kernel/k_readable_event.h"
|
|||
#include "core/hle/kernel/k_resource_limit.h"
|
|||
#include "core/hle/kernel/k_scoped_resource_reservation.h"
|
|||
#include "core/hle/kernel/k_writable_event.h"
|
|||
#include "core/hle/service/kernel_helpers.h"
|
|||
|
|||
namespace Service::KernelHelpers { |
|||
|
|||
ServiceContext::ServiceContext(Core::System& system_, std::string name_) |
|||
: kernel(system_.Kernel()) { |
|||
process = Kernel::KProcess::Create(kernel); |
|||
ASSERT(Kernel::KProcess::Initialize(process, system_, std::move(name_), |
|||
Kernel::KProcess::ProcessType::Userland) |
|||
.IsSuccess()); |
|||
} |
|||
|
|||
ServiceContext::~ServiceContext() { |
|||
process->Close(); |
|||
process = nullptr; |
|||
} |
|||
|
|||
Kernel::KEvent* ServiceContext::CreateEvent(std::string&& name) { |
|||
// Reserve a new event from the process resource limit
|
|||
Kernel::KScopedResourceReservation event_reservation(process, |
|||
Kernel::LimitableResource::Events); |
|||
if (!event_reservation.Succeeded()) { |
|||
LOG_CRITICAL(Service, "Resource limit reached!"); |
|||
return {}; |
|||
} |
|||
|
|||
// Create a new event.
|
|||
auto* event = Kernel::KEvent::Create(kernel); |
|||
if (!event) { |
|||
LOG_CRITICAL(Service, "Unable to create event!"); |
|||
return {}; |
|||
} |
|||
|
|||
// Initialize the event.
|
|||
event->Initialize(std::move(name)); |
|||
|
|||
// Commit the thread reservation.
|
|||
event_reservation.Commit(); |
|||
|
|||
// Register the event.
|
|||
Kernel::KEvent::Register(kernel, event); |
|||
|
|||
return event; |
|||
} |
|||
|
|||
void ServiceContext::CloseEvent(Kernel::KEvent* event) { |
|||
event->GetReadableEvent().Close(); |
|||
event->GetWritableEvent().Close(); |
|||
} |
|||
|
|||
} // namespace Service::KernelHelpers
|
|||
@ -0,0 +1,35 @@ |
|||
// Copyright 2021 yuzu emulator team |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <string> |
|||
|
|||
namespace Core { |
|||
class System; |
|||
} |
|||
|
|||
namespace Kernel { |
|||
class KernelCore; |
|||
class KEvent; |
|||
class KProcess; |
|||
} // namespace Kernel |
|||
|
|||
namespace Service::KernelHelpers { |
|||
|
|||
class ServiceContext { |
|||
public: |
|||
ServiceContext(Core::System& system_, std::string name_); |
|||
~ServiceContext(); |
|||
|
|||
Kernel::KEvent* CreateEvent(std::string&& name); |
|||
|
|||
void CloseEvent(Kernel::KEvent* event); |
|||
|
|||
private: |
|||
Kernel::KernelCore& kernel; |
|||
Kernel::KProcess* process{}; |
|||
}; |
|||
|
|||
} // namespace Service::KernelHelpers |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue