106 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
===============================================
 | 
						|
Power Architecture 64-bit Linux system call ABI
 | 
						|
===============================================
 | 
						|
 | 
						|
syscall
 | 
						|
=======
 | 
						|
 | 
						|
syscall calling sequence[*] matches the Power Architecture 64-bit ELF ABI
 | 
						|
specification C function calling sequence, including register preservation
 | 
						|
rules, with the following differences.
 | 
						|
 | 
						|
[*] Some syscalls (typically low-level management functions) may have
 | 
						|
    different calling sequences (e.g., rt_sigreturn).
 | 
						|
 | 
						|
Parameters and return value
 | 
						|
---------------------------
 | 
						|
The system call number is specified in r0.
 | 
						|
 | 
						|
There is a maximum of 6 integer parameters to a syscall, passed in r3-r8.
 | 
						|
 | 
						|
Both a return value and a return error code are returned. cr0.SO is the return
 | 
						|
error code, and r3 is the return value or error code. When cr0.SO is clear,
 | 
						|
the syscall succeeded and r3 is the return value. When cr0.SO is set, the
 | 
						|
syscall failed and r3 is the error code that generally corresponds to errno.
 | 
						|
 | 
						|
Stack
 | 
						|
-----
 | 
						|
System calls do not modify the caller's stack frame. For example, the caller's
 | 
						|
stack frame LR and CR save fields are not used.
 | 
						|
 | 
						|
Register preservation rules
 | 
						|
---------------------------
 | 
						|
Register preservation rules match the ELF ABI calling sequence with the
 | 
						|
following differences:
 | 
						|
 | 
						|
r0:         Volatile.   (System call number.)
 | 
						|
r3:         Volatile.   (Parameter 1, and return value.)
 | 
						|
r4-r8:      Volatile.   (Parameters 2-6.)
 | 
						|
cr0:        Volatile    (cr0.SO is the return error condition)
 | 
						|
cr1, cr5-7: Nonvolatile.
 | 
						|
lr:         Nonvolatile.
 | 
						|
 | 
						|
All floating point and vector data registers as well as control and status
 | 
						|
registers are nonvolatile.
 | 
						|
 | 
						|
Invocation
 | 
						|
----------
 | 
						|
The syscall is performed with the sc instruction, and returns with execution
 | 
						|
continuing at the instruction following the sc instruction.
 | 
						|
 | 
						|
Transactional Memory
 | 
						|
--------------------
 | 
						|
Syscall behavior can change if the processor is in transactional or suspended
 | 
						|
transaction state, and the syscall can affect the behavior of the transaction.
 | 
						|
 | 
						|
If the processor is in suspended state when a syscall is made, the syscall
 | 
						|
will be performed as normal, and will return as normal. The syscall will be
 | 
						|
performed in suspended state, so its side effects will be persistent according
 | 
						|
to the usual transactional memory semantics. A syscall may or may not result
 | 
						|
in the transaction being doomed by hardware.
 | 
						|
 | 
						|
If the processor is in transactional state when a syscall is made, then the
 | 
						|
behavior depends on the presence of PPC_FEATURE2_HTM_NOSC in the AT_HWCAP2 ELF
 | 
						|
auxiliary vector.
 | 
						|
 | 
						|
- If present, which is the case for newer kernels, then the syscall will not
 | 
						|
  be performed and the transaction will be doomed by the kernel with the
 | 
						|
  failure code TM_CAUSE_SYSCALL | TM_CAUSE_PERSISTENT in the TEXASR SPR.
 | 
						|
 | 
						|
- If not present (older kernels), then the kernel will suspend the
 | 
						|
  transactional state and the syscall will proceed as in the case of a
 | 
						|
  suspended state syscall, and will resume the transactional state before
 | 
						|
  returning to the caller. This case is not well defined or supported, so this
 | 
						|
  behavior should not be relied upon.
 | 
						|
 | 
						|
 | 
						|
vsyscall
 | 
						|
========
 | 
						|
 | 
						|
vsyscall calling sequence matches the syscall calling sequence, with the
 | 
						|
following differences. Some vsyscalls may have different calling sequences.
 | 
						|
 | 
						|
Parameters and return value
 | 
						|
---------------------------
 | 
						|
r0 is not used as an input. The vsyscall is selected by its address.
 | 
						|
 | 
						|
Stack
 | 
						|
-----
 | 
						|
The vsyscall may or may not use the caller's stack frame save areas.
 | 
						|
 | 
						|
Register preservation rules
 | 
						|
---------------------------
 | 
						|
r0: Volatile.
 | 
						|
cr1, cr5-7: Volatile.
 | 
						|
lr: Volatile.
 | 
						|
 | 
						|
Invocation
 | 
						|
----------
 | 
						|
The vsyscall is performed with a branch-with-link instruction to the vsyscall
 | 
						|
function address.
 | 
						|
 | 
						|
Transactional Memory
 | 
						|
--------------------
 | 
						|
vsyscalls will run in the same transactional state as the caller. A vsyscall
 | 
						|
may or may not result in the transaction being doomed by hardware.
 |