diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/kernel/session.h | 34 | ||||
| -rw-r--r-- | src/core/hle/service/apt/apt.cpp | 6 | ||||
| -rw-r--r-- | src/core/hle/service/y2r_u.cpp | 10 |
3 files changed, 43 insertions, 7 deletions
diff --git a/src/core/hle/kernel/session.h b/src/core/hle/kernel/session.h index 54a062971..257da9105 100644 --- a/src/core/hle/kernel/session.h +++ b/src/core/hle/kernel/session.h | |||
| @@ -8,6 +8,40 @@ | |||
| 8 | #include "core/hle/kernel/thread.h" | 8 | #include "core/hle/kernel/thread.h" |
| 9 | #include "core/memory.h" | 9 | #include "core/memory.h" |
| 10 | 10 | ||
| 11 | namespace IPC { | ||
| 12 | |||
| 13 | inline u32 MakeHeader(u16 command_id, unsigned int regular_params, unsigned int translate_params) { | ||
| 14 | return ((u32)command_id << 16) | (((u32)regular_params & 0x3F) << 6) | (((u32)translate_params & 0x3F) << 0); | ||
| 15 | } | ||
| 16 | |||
| 17 | inline u32 MoveHandleDesc(unsigned int num_handles = 1) { | ||
| 18 | return 0x0 | ((num_handles - 1) << 26); | ||
| 19 | } | ||
| 20 | |||
| 21 | inline u32 CopyHandleDesc(unsigned int num_handles = 1) { | ||
| 22 | return 0x10 | ((num_handles - 1) << 26); | ||
| 23 | } | ||
| 24 | |||
| 25 | inline u32 CallingPidDesc() { | ||
| 26 | return 0x20; | ||
| 27 | } | ||
| 28 | |||
| 29 | inline u32 StaticBufferDesc(u32 size, unsigned int buffer_id) { | ||
| 30 | return 0x2 | (size << 14) | ((buffer_id & 0xF) << 10); | ||
| 31 | } | ||
| 32 | |||
| 33 | enum MappedBufferPermissions { | ||
| 34 | R = 2, | ||
| 35 | W = 4, | ||
| 36 | RW = R | W, | ||
| 37 | }; | ||
| 38 | |||
| 39 | inline u32 MappedBufferDesc(u32 size, MappedBufferPermissions perms) { | ||
| 40 | return 0x8 | (size << 4) | (u32)perms; | ||
| 41 | } | ||
| 42 | |||
| 43 | } | ||
| 44 | |||
| 11 | namespace Kernel { | 45 | namespace Kernel { |
| 12 | 46 | ||
| 13 | static const int kCommandHeaderOffset = 0x80; ///< Offset into command buffer of header | 47 | static const int kCommandHeaderOffset = 0x80; ///< Offset into command buffer of header |
diff --git a/src/core/hle/service/apt/apt.cpp b/src/core/hle/service/apt/apt.cpp index 5d14f393d..b454a2709 100644 --- a/src/core/hle/service/apt/apt.cpp +++ b/src/core/hle/service/apt/apt.cpp | |||
| @@ -45,7 +45,7 @@ void Initialize(Service::Interface* self) { | |||
| 45 | u32 app_id = cmd_buff[1]; | 45 | u32 app_id = cmd_buff[1]; |
| 46 | u32 flags = cmd_buff[2]; | 46 | u32 flags = cmd_buff[2]; |
| 47 | 47 | ||
| 48 | cmd_buff[2] = 0x04000000; // According to 3dbrew, this value should be 0x04000000 | 48 | cmd_buff[2] = IPC::MoveHandleDesc(2); |
| 49 | cmd_buff[3] = Kernel::g_handle_table.Create(notification_event).MoveFrom(); | 49 | cmd_buff[3] = Kernel::g_handle_table.Create(notification_event).MoveFrom(); |
| 50 | cmd_buff[4] = Kernel::g_handle_table.Create(start_event).MoveFrom(); | 50 | cmd_buff[4] = Kernel::g_handle_table.Create(start_event).MoveFrom(); |
| 51 | 51 | ||
| @@ -70,11 +70,13 @@ void GetSharedFont(Service::Interface* self) { | |||
| 70 | // an easy way to do this, but the copy should be sufficient for now. | 70 | // an easy way to do this, but the copy should be sufficient for now. |
| 71 | memcpy(Memory::GetPointer(SHARED_FONT_VADDR), shared_font.data(), shared_font.size()); | 71 | memcpy(Memory::GetPointer(SHARED_FONT_VADDR), shared_font.data(), shared_font.size()); |
| 72 | 72 | ||
| 73 | cmd_buff[0] = 0x00440082; | 73 | cmd_buff[0] = IPC::MakeHeader(0x44, 2, 2); |
| 74 | cmd_buff[1] = RESULT_SUCCESS.raw; // No error | 74 | cmd_buff[1] = RESULT_SUCCESS.raw; // No error |
| 75 | cmd_buff[2] = SHARED_FONT_VADDR; | 75 | cmd_buff[2] = SHARED_FONT_VADDR; |
| 76 | cmd_buff[3] = IPC::MoveHandleDesc(); | ||
| 76 | cmd_buff[4] = Kernel::g_handle_table.Create(shared_font_mem).MoveFrom(); | 77 | cmd_buff[4] = Kernel::g_handle_table.Create(shared_font_mem).MoveFrom(); |
| 77 | } else { | 78 | } else { |
| 79 | cmd_buff[0] = IPC::MakeHeader(0x44, 1, 0); | ||
| 78 | cmd_buff[1] = -1; // Generic error (not really possible to verify this on hardware) | 80 | cmd_buff[1] = -1; // Generic error (not really possible to verify this on hardware) |
| 79 | LOG_ERROR(Kernel_SVC, "called, but %s has not been loaded!", SHARED_FONT); | 81 | LOG_ERROR(Kernel_SVC, "called, but %s has not been loaded!", SHARED_FONT); |
| 80 | } | 82 | } |
diff --git a/src/core/hle/service/y2r_u.cpp b/src/core/hle/service/y2r_u.cpp index 17cb4f0f0..ac1967da8 100644 --- a/src/core/hle/service/y2r_u.cpp +++ b/src/core/hle/service/y2r_u.cpp | |||
| @@ -121,7 +121,7 @@ static void SetBlockAlignment(Service::Interface* self) { | |||
| 121 | static void SetTransferEndInterrupt(Service::Interface* self) { | 121 | static void SetTransferEndInterrupt(Service::Interface* self) { |
| 122 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 122 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 123 | 123 | ||
| 124 | cmd_buff[0] = 0x000D0040; | 124 | cmd_buff[0] = IPC::MakeHeader(0xD, 1, 0); |
| 125 | cmd_buff[1] = RESULT_SUCCESS.raw; | 125 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 126 | LOG_DEBUG(Service_Y2R, "(STUBBED) called"); | 126 | LOG_DEBUG(Service_Y2R, "(STUBBED) called"); |
| 127 | } | 127 | } |
| @@ -279,7 +279,7 @@ static void StartConversion(Service::Interface* self) { | |||
| 279 | static void StopConversion(Service::Interface* self) { | 279 | static void StopConversion(Service::Interface* self) { |
| 280 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 280 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 281 | 281 | ||
| 282 | cmd_buff[0] = 0x00270040; | 282 | cmd_buff[0] = IPC::MakeHeader(0x27, 1, 0); |
| 283 | cmd_buff[1] = RESULT_SUCCESS.raw; | 283 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 284 | LOG_DEBUG(Service_Y2R, "called"); | 284 | LOG_DEBUG(Service_Y2R, "called"); |
| 285 | } | 285 | } |
| @@ -328,7 +328,7 @@ static void SetConversionParams(Service::Interface* self) { | |||
| 328 | conversion.alpha = params->alpha; | 328 | conversion.alpha = params->alpha; |
| 329 | 329 | ||
| 330 | cleanup: | 330 | cleanup: |
| 331 | cmd_buff[0] = 0x00290040; // TODO verify | 331 | cmd_buff[0] = IPC::MakeHeader(0x29, 1, 0); |
| 332 | cmd_buff[1] = result.raw; | 332 | cmd_buff[1] = result.raw; |
| 333 | } | 333 | } |
| 334 | 334 | ||
| @@ -360,7 +360,7 @@ static void DriverInitialize(Service::Interface* self) { | |||
| 360 | 360 | ||
| 361 | completion_event->Clear(); | 361 | completion_event->Clear(); |
| 362 | 362 | ||
| 363 | cmd_buff[0] = 0x002B0040; | 363 | cmd_buff[0] = IPC::MakeHeader(0x2B, 1, 0); |
| 364 | cmd_buff[1] = RESULT_SUCCESS.raw; | 364 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 365 | LOG_DEBUG(Service_Y2R, "called"); | 365 | LOG_DEBUG(Service_Y2R, "called"); |
| 366 | } | 366 | } |
| @@ -368,7 +368,7 @@ static void DriverInitialize(Service::Interface* self) { | |||
| 368 | static void DriverFinalize(Service::Interface* self) { | 368 | static void DriverFinalize(Service::Interface* self) { |
| 369 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 369 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 370 | 370 | ||
| 371 | cmd_buff[0] = 0x002C0040; | 371 | cmd_buff[0] = IPC::MakeHeader(0x2C, 1, 0); |
| 372 | cmd_buff[1] = RESULT_SUCCESS.raw; | 372 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 373 | LOG_DEBUG(Service_Y2R, "called"); | 373 | LOG_DEBUG(Service_Y2R, "called"); |
| 374 | } | 374 | } |