svc_cache.cpp 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "core/core.h"
  4. #include "core/hle/kernel/k_process.h"
  5. #include "core/hle/kernel/svc.h"
  6. #include "core/hle/kernel/svc_results.h"
  7. #include "core/hle/kernel/svc_types.h"
  8. namespace Kernel::Svc {
  9. void FlushEntireDataCache(Core::System& system) {
  10. UNIMPLEMENTED();
  11. }
  12. Result FlushDataCache(Core::System& system, VAddr address, size_t size) {
  13. UNIMPLEMENTED();
  14. R_THROW(ResultNotImplemented);
  15. }
  16. Result InvalidateProcessDataCache(Core::System& system, Handle process_handle, uint64_t address,
  17. uint64_t size) {
  18. UNIMPLEMENTED();
  19. R_THROW(ResultNotImplemented);
  20. }
  21. Result StoreProcessDataCache(Core::System& system, Handle process_handle, uint64_t address,
  22. uint64_t size) {
  23. UNIMPLEMENTED();
  24. R_THROW(ResultNotImplemented);
  25. }
  26. Result FlushProcessDataCache(Core::System& system, Handle process_handle, u64 address, u64 size) {
  27. // Validate address/size.
  28. R_UNLESS(size > 0, ResultInvalidSize);
  29. R_UNLESS(address == static_cast<uintptr_t>(address), ResultInvalidCurrentMemory);
  30. R_UNLESS(size == static_cast<size_t>(size), ResultInvalidCurrentMemory);
  31. // Get the process from its handle.
  32. KScopedAutoObject process =
  33. system.Kernel().CurrentProcess()->GetHandleTable().GetObject<KProcess>(process_handle);
  34. R_UNLESS(process.IsNotNull(), ResultInvalidHandle);
  35. // Verify the region is within range.
  36. auto& page_table = process->PageTable();
  37. R_UNLESS(page_table.Contains(address, size), ResultInvalidCurrentMemory);
  38. // Perform the operation.
  39. R_RETURN(system.Memory().FlushDataCache(*process, address, size));
  40. }
  41. void FlushEntireDataCache64(Core::System& system) {
  42. FlushEntireDataCache(system);
  43. }
  44. Result FlushDataCache64(Core::System& system, VAddr address, size_t size) {
  45. R_RETURN(FlushDataCache(system, address, size));
  46. }
  47. Result InvalidateProcessDataCache64(Core::System& system, Handle process_handle, uint64_t address,
  48. uint64_t size) {
  49. R_RETURN(InvalidateProcessDataCache(system, process_handle, address, size));
  50. }
  51. Result StoreProcessDataCache64(Core::System& system, Handle process_handle, uint64_t address,
  52. uint64_t size) {
  53. R_RETURN(StoreProcessDataCache(system, process_handle, address, size));
  54. }
  55. Result FlushProcessDataCache64(Core::System& system, Handle process_handle, uint64_t address,
  56. uint64_t size) {
  57. R_RETURN(FlushProcessDataCache(system, process_handle, address, size));
  58. }
  59. void FlushEntireDataCache64From32(Core::System& system) {
  60. return FlushEntireDataCache(system);
  61. }
  62. Result FlushDataCache64From32(Core::System& system, uint32_t address, uint32_t size) {
  63. R_RETURN(FlushDataCache(system, address, size));
  64. }
  65. Result InvalidateProcessDataCache64From32(Core::System& system, Handle process_handle,
  66. uint64_t address, uint64_t size) {
  67. R_RETURN(InvalidateProcessDataCache(system, process_handle, address, size));
  68. }
  69. Result StoreProcessDataCache64From32(Core::System& system, Handle process_handle, uint64_t address,
  70. uint64_t size) {
  71. R_RETURN(StoreProcessDataCache(system, process_handle, address, size));
  72. }
  73. Result FlushProcessDataCache64From32(Core::System& system, Handle process_handle, uint64_t address,
  74. uint64_t size) {
  75. R_RETURN(FlushProcessDataCache(system, process_handle, address, size));
  76. }
  77. } // namespace Kernel::Svc