module.cpp 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include <chrono>
  6. #include <cstdlib>
  7. #include <ctime>
  8. #include <functional>
  9. #include <vector>
  10. #include "common/logging/log.h"
  11. #include "core/hle/ipc_helpers.h"
  12. #include "core/hle/service/spl/csrng.h"
  13. #include "core/hle/service/spl/module.h"
  14. #include "core/hle/service/spl/spl.h"
  15. #include "core/settings.h"
  16. namespace Service::SPL {
  17. Module::Interface::Interface(std::shared_ptr<Module> module, const char* name)
  18. : ServiceFramework(name), module(std::move(module)),
  19. rng(Settings::values.rng_seed.value_or(std::time(nullptr))) {}
  20. Module::Interface::~Interface() = default;
  21. void Module::Interface::GetRandomBytes(Kernel::HLERequestContext& ctx) {
  22. LOG_DEBUG(Service_SPL, "called");
  23. IPC::RequestParser rp{ctx};
  24. std::size_t size = ctx.GetWriteBufferSize();
  25. std::uniform_int_distribution<u16> distribution(0, std::numeric_limits<u8>::max());
  26. std::vector<u8> data(size);
  27. std::generate(data.begin(), data.end(), [&] { return static_cast<u8>(distribution(rng)); });
  28. ctx.WriteBuffer(data);
  29. IPC::ResponseBuilder rb{ctx, 2};
  30. rb.Push(RESULT_SUCCESS);
  31. }
  32. void InstallInterfaces(SM::ServiceManager& service_manager) {
  33. auto module = std::make_shared<Module>();
  34. std::make_shared<CSRNG>(module)->InstallAsService(service_manager);
  35. std::make_shared<SPL>(module)->InstallAsService(service_manager);
  36. }
  37. } // namespace Service::SPL