mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 12:12:45 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			70 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <bits/sighow.h>
 | |
| 
 | |
| //
 | |
| // /!\ Read setjmp.h before modifying this file!
 | |
| //
 | |
| 
 | |
| .global setjmp
 | |
| setjmp:
 | |
|     mov $0, %esi            // Set val argument to 0
 | |
| 
 | |
| .global sigsetjmp
 | |
| sigsetjmp:
 | |
|     mov %esi, 64(%rdi)      // Store val into did_save_signal_mask
 | |
|     movl $0, 68(%rdi)       // Clear saved_signal_mask
 | |
|     test %esi, %esi
 | |
|     jz .Lsaveregs
 | |
| 
 | |
|     push %rbp               // Prepare ABI-compliant call to sigprocmask
 | |
|     mov %rsp, %rbp
 | |
|     push %rdi
 | |
|     lea 68(%rdi), %rdx      // Set argument oldset
 | |
|     mov $0, %rsi            // Set argument set
 | |
|     mov $0, %rdi            // Set argument how
 | |
|     call sigprocmask@plt
 | |
|     pop %rdi
 | |
|     pop %rbp
 | |
| 
 | |
| .Lsaveregs:
 | |
|     mov %rbx, (0 * 8)(%rdi) // Save registers
 | |
|     mov %r12, (1 * 8)(%rdi)
 | |
|     mov %r13, (2 * 8)(%rdi)
 | |
|     mov %r14, (3 * 8)(%rdi)
 | |
|     mov %r15, (4 * 8)(%rdi)
 | |
|     mov %rbp, (5 * 8)(%rdi)
 | |
|     mov %rsp, (6 * 8)(%rdi)
 | |
|     mov (%rsp), %rax        // Grab return address
 | |
|     mov %rax, (7 * 8)(%rdi)    
 | |
|     xor %eax, %eax
 | |
|     ret
 | |
| 
 | |
| .global longjmp
 | |
| longjmp:
 | |
|     mov %esi, %eax
 | |
|     test %eax, %eax
 | |
|     jnz  .Lnonzero
 | |
|     mov $1, %eax
 | |
| 
 | |
| .Lnonzero:
 | |
|     mov (0 * 8)(%rdi), %rbx // Restore registers
 | |
|     mov (1 * 8)(%rdi), %r12
 | |
|     mov (2 * 8)(%rdi), %r13
 | |
|     mov (3 * 8)(%rdi), %r14
 | |
|     mov (4 * 8)(%rdi), %r15
 | |
|     mov (5 * 8)(%rdi), %rbp
 | |
|     //
 | |
|     // Until this point, the stack is still from the caller.
 | |
|     //
 | |
|     mov (6 * 8)(%rdi), %rsp
 | |
|     mov (7 * 8)(%rdi), %rcx
 | |
|     mov %rcx, (%rsp)        // Patch return address
 | |
|     //
 | |
|     // From this point on, the former stack has been restored.
 | |
|     //
 | |
|     ret
 | 
