mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	added framework for APT service (application and title launching service)
This commit is contained in:
		
							parent
							
								
									524e78ece8
								
							
						
					
					
						commit
						9f4d677cdf
					
				
					 7 changed files with 126 additions and 5 deletions
				
			
		|  | @ -153,6 +153,7 @@ | ||||||
|     <ClCompile Include="file_sys\directory_file_system.cpp" /> |     <ClCompile Include="file_sys\directory_file_system.cpp" /> | ||||||
|     <ClCompile Include="file_sys\meta_file_system.cpp" /> |     <ClCompile Include="file_sys\meta_file_system.cpp" /> | ||||||
|     <ClCompile Include="hle\hle.cpp" /> |     <ClCompile Include="hle\hle.cpp" /> | ||||||
|  |     <ClCompile Include="hle\service\apt.cpp" /> | ||||||
|     <ClCompile Include="hle\service\service.cpp" /> |     <ClCompile Include="hle\service\service.cpp" /> | ||||||
|     <ClCompile Include="hle\syscall.cpp" /> |     <ClCompile Include="hle\syscall.cpp" /> | ||||||
|     <ClCompile Include="hw\hw.cpp" /> |     <ClCompile Include="hw\hw.cpp" /> | ||||||
|  | @ -187,6 +188,7 @@ | ||||||
|     <ClInclude Include="file_sys\meta_file_system.h" /> |     <ClInclude Include="file_sys\meta_file_system.h" /> | ||||||
|     <ClInclude Include="hle\function_wrappers.h" /> |     <ClInclude Include="hle\function_wrappers.h" /> | ||||||
|     <ClInclude Include="hle\hle.h" /> |     <ClInclude Include="hle\hle.h" /> | ||||||
|  |     <ClInclude Include="hle\service\apt.h" /> | ||||||
|     <ClInclude Include="hle\service\service.h" /> |     <ClInclude Include="hle\service\service.h" /> | ||||||
|     <ClInclude Include="hle\syscall.h" /> |     <ClInclude Include="hle\syscall.h" /> | ||||||
|     <ClInclude Include="hw\hw.h" /> |     <ClInclude Include="hw\hw.h" /> | ||||||
|  |  | ||||||
|  | @ -90,6 +90,9 @@ | ||||||
|     <ClCompile Include="hle\service\service.cpp"> |     <ClCompile Include="hle\service\service.cpp"> | ||||||
|       <Filter>hle\service</Filter> |       <Filter>hle\service</Filter> | ||||||
|     </ClCompile> |     </ClCompile> | ||||||
|  |     <ClCompile Include="hle\service\apt.cpp"> | ||||||
|  |       <Filter>hle\service</Filter> | ||||||
|  |     </ClCompile> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <ClInclude Include="arm\disassembler\arm_disasm.h"> |     <ClInclude Include="arm\disassembler\arm_disasm.h"> | ||||||
|  | @ -175,6 +178,9 @@ | ||||||
|     <ClInclude Include="hle\syscall.h"> |     <ClInclude Include="hle\syscall.h"> | ||||||
|       <Filter>hle</Filter> |       <Filter>hle</Filter> | ||||||
|     </ClInclude> |     </ClInclude> | ||||||
|  |     <ClInclude Include="hle\service\apt.h"> | ||||||
|  |       <Filter>hle\service</Filter> | ||||||
|  |     </ClInclude> | ||||||
|   </ItemGroup> |   </ItemGroup> | ||||||
|   <ItemGroup> |   <ItemGroup> | ||||||
|     <Text Include="CMakeLists.txt" /> |     <Text Include="CMakeLists.txt" /> | ||||||
|  |  | ||||||
|  | @ -42,6 +42,7 @@ u8 *GetPointer(const u32 addr) { | ||||||
|         return g_command_buffer + (addr & CMD_BUFFER_MASK); |         return g_command_buffer + (addr & CMD_BUFFER_MASK); | ||||||
|     } else { |     } else { | ||||||
|         ERROR_LOG(HLE, "unknown pointer from address %08X", addr); |         ERROR_LOG(HLE, "unknown pointer from address %08X", addr); | ||||||
|  |         return 0; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										21
									
								
								src/core/hle/service/apt.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								src/core/hle/service/apt.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | ||||||
|  | // Copyright 2014 Citra Emulator Project
 | ||||||
|  | // Licensed under GPLv2
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | #include "common/log.h" | ||||||
|  | #include "core/hle/service/apt.h" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | namespace Service { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Syscall::Result APT::Sync() { | ||||||
|  |     NOTICE_LOG(HLE, "APT::Sync - Initialize"); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | } | ||||||
							
								
								
									
										71
									
								
								src/core/hle/service/apt.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								src/core/hle/service/apt.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,71 @@ | ||||||
|  | // Copyright 2014 Citra Emulator Project
 | ||||||
|  | // Licensed under GPLv2
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | #include "core/hle/service/service.h" | ||||||
|  | 
 | ||||||
|  | ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||||
|  | // Namespace Service
 | ||||||
|  | 
 | ||||||
|  | namespace Service { | ||||||
|  | 
 | ||||||
|  | // Application and title launching service. These services handle signaling for home/power button as
 | ||||||
|  | // well. Only one session for either APT service can be open at a time, normally processes close the
 | ||||||
|  | // service handle immediately once finished using the service. The commands for APT:U and APT:S are 
 | ||||||
|  | // exactly the same, however certain commands are only accessible with APT:S(NS module will call 
 | ||||||
|  | // svcBreak when the command isn't accessible). See http://3dbrew.org/wiki/NS#APT_Services.
 | ||||||
|  | 
 | ||||||
|  | class APT : public Interface { | ||||||
|  | public: | ||||||
|  | 
 | ||||||
|  |     APT() { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ~APT() { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     enum { | ||||||
|  |         CMD_OFFSET                              = 0x00000080, | ||||||
|  | 
 | ||||||
|  |         CMD_HEADER_INIT                         = 0x00020080,   ///< Initialize service
 | ||||||
|  |         CMD_HEADER_GET_LOCK_HANDLE              = 0x00010040,   ///< Get service Mutex
 | ||||||
|  |         CMD_HEADER_ENABLE                       = 0x00030040,   ///< Enable service
 | ||||||
|  |         CMD_HEADER_INQUIRE_NOTIFICATION         = 0x000B0040,   ///< Inquire notification
 | ||||||
|  |         CMD_HEADER_PREPARE_TO_JUMP_TO_HOME_MENU = 0x002B0000,   ///< Prepare to jump to home menu
 | ||||||
|  |         CMD_HEADER_JUMP_TO_HOME_MENU            = 0x002C0044,   ///< Jump to home menu
 | ||||||
|  |         CMD_HEADER_NOTIFY_TO_WAIT               = 0x00430040,   ///< Notify to wait
 | ||||||
|  |         CMD_HEADER_APPLET_UTILITY               = 0x004B00C2,   ///< Applet utility
 | ||||||
|  |         CMD_HEADER_GLANCE_PARAMETER             = 0x000E0080,   ///< Glance parameter
 | ||||||
|  |         CMD_HEADER_RECEIVE_PARAMETER            = 0x000D0080,   ///< Receive parameter
 | ||||||
|  |         CMD_HEADER_REPLY_SLEEP_QUERY            = 0x003E0080,   ///< Reply sleep query
 | ||||||
|  |         CMD_HEADER_PREPARE_TO_CLOSE_APP         = 0x00220040,   ///< Prepare to close application
 | ||||||
|  |         CMD_HEADER_CLOSE_APP                    = 0x00270044,   ///< Close application
 | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * Gets the string name used by CTROS for the APT service | ||||||
|  |      * @return String name of service | ||||||
|  |      */ | ||||||
|  |     std::string GetName() const { | ||||||
|  |         return "APT"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * Gets the string port name used by CTROS for the APT service | ||||||
|  |      * @return Port name of service | ||||||
|  |      */ | ||||||
|  |     std::string GetPortName() const { | ||||||
|  |         return "APT:U"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * Called when svcSendSyncRequest is called, loads command buffer and executes comand | ||||||
|  |      * @return Return result of svcSendSyncRequest passed back to user app | ||||||
|  |      */ | ||||||
|  |     virtual Syscall::Result Sync(); | ||||||
|  | 
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace
 | ||||||
|  | @ -7,6 +7,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "core/hle/hle.h" | #include "core/hle/hle.h" | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
|  | #include "core/hle/service/apt.h" | ||||||
| 
 | 
 | ||||||
| namespace Service { | namespace Service { | ||||||
| 
 | 
 | ||||||
|  | @ -104,19 +105,36 @@ public: | ||||||
|      */ |      */ | ||||||
|     Syscall::Result Sync() { |     Syscall::Result Sync() { | ||||||
|         u32 header = 0; |         u32 header = 0; | ||||||
|         HLE::Read<u32>(header, (HLE::CMD_BUFFER_ADDR + CMD_OFFSET)); |         Syscall::Result res = 0; | ||||||
|  |          | ||||||
|  |         u32* cmd_buff = (u32*)HLE::GetPointer(HLE::CMD_BUFFER_ADDR + CMD_OFFSET); | ||||||
|  | 
 | ||||||
|  |         switch (cmd_buff[0]) { | ||||||
| 
 | 
 | ||||||
|         switch (header) { |  | ||||||
|         case CMD_HEADER_INIT: |         case CMD_HEADER_INIT: | ||||||
|             NOTICE_LOG(HLE, "SRV::Sync - Initialize"); |             NOTICE_LOG(OSHLE, "SRV::Sync - Initialize"); | ||||||
|             break; |             break; | ||||||
| 
 | 
 | ||||||
|         case CMD_HEADER_GET_HANDLE: |         case CMD_HEADER_GET_HANDLE: | ||||||
|             NOTICE_LOG(HLE, "SRV::Sync - GetHandle, port: %s", HLE::GetCharPointer(HLE::CMD_BUFFER_ADDR + CMD_OFFSET + 4)); |             const char* port_name = (const char*)&cmd_buff[1]; | ||||||
|  |             Interface* service = g_manager->FetchFromPortName(port_name); | ||||||
|  | 
 | ||||||
|  |             NOTICE_LOG(OSHLE, "SRV::Sync - GetHandle - port: %s, handle: 0x%08X", port_name,  | ||||||
|  |                 service->GetUID()); | ||||||
|  | 
 | ||||||
|  |             if (NULL != service) { | ||||||
|  |                 cmd_buff[3] = service->GetUID(); | ||||||
|  |             } else { | ||||||
|  |                 ERROR_LOG(OSHLE, "Service %s does not exist", port_name); | ||||||
|  |                 res = -1; | ||||||
|  |             } | ||||||
|  |              | ||||||
|             break; |             break; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return 0; |         cmd_buff[1] = res; | ||||||
|  | 
 | ||||||
|  |         return res; | ||||||
|     } |     } | ||||||
|       |       | ||||||
| }; | }; | ||||||
|  | @ -128,6 +146,7 @@ public: | ||||||
| void Init() { | void Init() { | ||||||
|     g_manager = new Manager; |     g_manager = new Manager; | ||||||
|     g_manager->AddService(new SRV); |     g_manager->AddService(new SRV); | ||||||
|  |     g_manager->AddService(new APT); | ||||||
|     NOTICE_LOG(HLE, "Services initialized OK"); |     NOTICE_LOG(HLE, "Services initialized OK"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ | ||||||
| #include <map> | #include <map> | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
|  | #include "common/common.h" | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
| #include "core/hle/syscall.h" | #include "core/hle/syscall.h" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue