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