mirror of
				https://github.com/ITotalJustice/sphaira.git
				synced 2025-11-04 07:16:13 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
.section .text.nroEntrypointTrampoline, "ax", %progbits
 | 
						|
.align 2
 | 
						|
.global nroEntrypointTrampoline
 | 
						|
.type   nroEntrypointTrampoline, %function
 | 
						|
.cfi_startproc
 | 
						|
nroEntrypointTrampoline:
 | 
						|
 | 
						|
    // Reset stack pointer.
 | 
						|
    adrp x8, __stack_top //Defined in libnx.
 | 
						|
    ldr  x8, [x8, #:lo12:__stack_top]
 | 
						|
    mov  sp, x8
 | 
						|
 | 
						|
    // Call NRO.
 | 
						|
    blr  x2
 | 
						|
 | 
						|
    // Save retval
 | 
						|
    adrp x1, g_lastRet
 | 
						|
    str  w0, [x1, #:lo12:g_lastRet]
 | 
						|
 | 
						|
    // Reset stack pointer and load next NRO.
 | 
						|
    adrp x8, __stack_top
 | 
						|
    ldr  x8, [x8, #:lo12:__stack_top]
 | 
						|
    mov  sp, x8
 | 
						|
 | 
						|
    b    loadNro
 | 
						|
 | 
						|
.cfi_endproc
 | 
						|
 | 
						|
.section .text.__libnx_exception_entry, "ax", %progbits
 | 
						|
.align 2
 | 
						|
.global __libnx_exception_entry
 | 
						|
.type   __libnx_exception_entry, %function
 | 
						|
.cfi_startproc
 | 
						|
__libnx_exception_entry:
 | 
						|
 | 
						|
    // Divert execution to the NRO entrypoint (if a NRO is actually loaded).
 | 
						|
    adrp x7, g_nroAddr
 | 
						|
    ldr  x7, [x7, #:lo12:g_nroAddr]
 | 
						|
    cbz  x7, .Lfail
 | 
						|
    br   x7
 | 
						|
 | 
						|
.Lfail:
 | 
						|
    // Otherwise, pass this unhandled exception right back to the kernel.
 | 
						|
    mov w0, #0xf801 // KERNELRESULT(UnhandledUserInterrupt)
 | 
						|
    svc 0x28        // svcReturnFromException
 | 
						|
 | 
						|
.cfi_endproc
 |