nwm_uds.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "core/hle/hle.h"
  5. #include "core/hle/kernel/event.h"
  6. #include "core/hle/service/nwm_uds.h"
  7. ////////////////////////////////////////////////////////////////////////////////////////////////////
  8. // Namespace NWM_UDS
  9. namespace NWM_UDS {
  10. static Kernel::SharedPtr<Kernel::Event> handle_event;
  11. /**
  12. * NWM_UDS::Shutdown service function
  13. * Inputs:
  14. * 1 : None
  15. * Outputs:
  16. * 0 : Return header
  17. * 1 : Result of function, 0 on success, otherwise error code
  18. */
  19. static void Shutdown(Service::Interface* self) {
  20. u32* cmd_buff = Kernel::GetCommandBuffer();
  21. // TODO(purpasmart): Verify return header on HW
  22. cmd_buff[1] = RESULT_SUCCESS.raw;
  23. LOG_WARNING(Service_NWM, "(STUBBED) called");
  24. }
  25. /**
  26. * NWM_UDS::RecvBeaconBroadcastData service function
  27. * Inputs:
  28. * 1 : Output buffer max size
  29. * 2 : Unknown
  30. * 3 : Unknown
  31. * 4 : MAC address?
  32. * 6-14 : Unknown, usually zero / uninitialized?
  33. * 15 : WLan Comm ID
  34. * 16 : This is the ID also located at offset 0xE in the CTR-generation structure.
  35. * 17 : Value 0
  36. * 18 : Input handle
  37. * 19 : (Size<<4) | 12
  38. * 20 : Output buffer ptr
  39. * Outputs:
  40. * 0 : Return header
  41. * 1 : Result of function, 0 on success, otherwise error code
  42. */
  43. static void RecvBeaconBroadcastData(Service::Interface* self) {
  44. u32* cmd_buff = Kernel::GetCommandBuffer();
  45. u32 out_buffer_size = cmd_buff[1];
  46. u32 unk1 = cmd_buff[2];
  47. u32 unk2 = cmd_buff[3];
  48. u32 mac_address = cmd_buff[4];
  49. u32 unk3 = cmd_buff[6];
  50. u32 wlan_comm_id = cmd_buff[15];
  51. u32 ctr_gen_id = cmd_buff[16];
  52. u32 value = cmd_buff[17];
  53. u32 input_handle = cmd_buff[18];
  54. u32 new_buffer_size = cmd_buff[19];
  55. u32 out_buffer_ptr = cmd_buff[20];
  56. cmd_buff[1] = RESULT_SUCCESS.raw;
  57. LOG_WARNING(Service_NWM, "(STUBBED) called out_buffer_size=0x%08X, unk1=0x%08X, unk2=0x%08X,"
  58. "mac_address=0x%08X, unk3=0x%08X, wlan_comm_id=0x%08X, ctr_gen_id=0x%08X,"
  59. "value=%u, input_handle=0x%08X, new_buffer_size=0x%08X, out_buffer_ptr=0x%08X",
  60. out_buffer_size, unk1, unk2, mac_address, unk3, wlan_comm_id, ctr_gen_id, value,
  61. input_handle, new_buffer_size, out_buffer_ptr);
  62. }
  63. /**
  64. * NWM_UDS::Initialize service function
  65. * Inputs:
  66. * 1 : Unknown
  67. * 2-11 : Input Structure
  68. * 12 : Unknown u16
  69. * 13 : Value 0
  70. * 14 : Handle
  71. * Outputs:
  72. * 0 : Return header
  73. * 1 : Result of function, 0 on success, otherwise error code
  74. * 2 : Value 0
  75. * 3 : Output handle
  76. */
  77. static void Initialize(Service::Interface* self) {
  78. u32* cmd_buff = Kernel::GetCommandBuffer();
  79. u32 unk1 = cmd_buff[1];
  80. u32 unk2 = cmd_buff[12];
  81. u32 value = cmd_buff[13];
  82. u32 handle = cmd_buff[14];
  83. cmd_buff[1] = RESULT_SUCCESS.raw;
  84. cmd_buff[2] = 0;
  85. cmd_buff[3] = Kernel::g_handle_table.Create(handle_event).MoveFrom(); //TODO(purpasmart): Verify if this is a event handle
  86. LOG_WARNING(Service_NWM, "(STUBBED) called unk1=0x%08X, unk2=0x%08X, value=%u, handle=0x%08X",
  87. unk1, unk2, value, handle);
  88. }
  89. const Interface::FunctionInfo FunctionTable[] = {
  90. {0x00030000, Shutdown, "Shutdown"},
  91. {0x000F0404, RecvBeaconBroadcastData, "RecvBeaconBroadcastData"},
  92. {0x00100042, nullptr, "SetBeaconAdditionalData"},
  93. {0x001400C0, nullptr, "RecvBroadcastDataFrame"},
  94. {0x001B0302, Initialize, "Initialize"},
  95. {0x001D0044, nullptr, "BeginHostingNetwork"},
  96. {0x001E0084, nullptr, "ConnectToNetwork"},
  97. {0x001F0006, nullptr, "DecryptBeaconData"},
  98. };
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////
  100. // Interface class
  101. Interface::Interface() {
  102. handle_event = Kernel::Event::Create(RESETTYPE_ONESHOT, "NWM_UDS::handle_event");
  103. Register(FunctionTable);
  104. }
  105. } // namespace