Based on kernel version 4.16.1. Page generated on 2018-04-09 11:53 EST.
1 ========================= 2 MN10300 FUNCTION CALL ABI 3 ========================= 4 5 ======= 6 GENERAL 7 ======= 8 9 The MN10300/AM33 kernel runs in little-endian mode; big-endian mode is not 10 supported. 11 12 The stack grows downwards, and should always be 32-bit aligned. There are 13 separate stack pointer registers for userspace and the kernel. 14 15 16 ================ 17 ARGUMENT PASSING 18 ================ 19 20 The first two arguments (assuming up to 32-bits per argument) to a function are 21 passed in the D0 and D1 registers respectively; all other arguments are passed 22 on the stack. 23 24 If 64-bit arguments are being passed, then they are never split between 25 registers and the stack. If the first argument is a 64-bit value, it will be 26 passed in D0:D1. If the first argument is not a 64-bit value, but the second 27 is, the second will be passed entirely on the stack and D1 will be unused. 28 29 Arguments smaller than 32-bits are not coalesced within a register or a stack 30 word. For example, two byte-sized arguments will always be passed in separate 31 registers or word-sized stack slots. 32 33 34 ================= 35 CALLING FUNCTIONS 36 ================= 37 38 The caller must allocate twelve bytes on the stack for the callee's use before 39 it inserts a CALL instruction. The CALL instruction will write into the TOS 40 word, but won't actually modify the stack pointer; similarly, the RET 41 instruction reads from the TOS word of the stack, but doesn't move the stack 42 pointer beyond it. 43 44 45 Stack: 46 | | 47 | | 48 |---------------| SP+20 49 | 4th Arg | 50 |---------------| SP+16 51 | 3rd Arg | 52 |---------------| SP+12 53 | D1 Save Slot | 54 |---------------| SP+8 55 | D0 Save Slot | 56 |---------------| SP+4 57 | Return Addr | 58 |---------------| SP 59 | | 60 | | 61 62 63 The caller must leave space on the stack (hence an allocation of twelve bytes) 64 in which the callee may store the first two arguments. 65 66 67 ============ 68 RETURN VALUE 69 ============ 70 71 The return value is passed in D0 for an integer (or D0:D1 for a 64-bit value), 72 or A0 for a pointer. 73 74 If the return value is a value larger than 64-bits, or is a structure or an 75 array, then a hidden first argument will be passed to the callee by the caller: 76 this will point to a piece of memory large enough to hold the result of the 77 function. In this case, the callee will return the value in that piece of 78 memory, and no value will be returned in D0 or A0. 79 80 81 =================== 82 REGISTER CLOBBERING 83 =================== 84 85 The values in certain registers may be clobbered by the callee, and other 86 values must be saved: 87 88 Clobber: D0-D1, A0-A1, E0-E3 89 Save: D2-D3, A2-A3, E4-E7, SP 90 91 All other non-supervisor-only registers are clobberable (such as MDR, MCRL, 92 MCRH). 93 94 95 ================= 96 SPECIAL REGISTERS 97 ================= 98 99 Certain ordinary registers may carry special usage for the compiler: 100 101 A3: Frame pointer 102 E2: TLS pointer 103 104 105 ========== 106 KERNEL ABI 107 ========== 108 109 The kernel may use a slightly different ABI internally. 110 111 (*) E2 112 113 If CONFIG_MN10300_CURRENT_IN_E2 is defined, then the current task pointer 114 will be kept in the E2 register, and that register will be marked 115 unavailable for the compiler to use as a scratch register. 116 117 Normally the kernel uses something like: 118 119 MOV SP,An 120 AND 0xFFFFE000,An 121 MOV (An),Rm // Rm holds current 122 MOV (yyy,Rm) // Access current->yyy 123 124 To find the address of current; but since this option permits current to 125 be carried globally in an register, it can use: 126 127 MOV (yyy,E2) // Access current->yyy 128 129 instead. 130 131 132 =============== 133 SYSTEM CALL ABI 134 =============== 135 136 System calls are called with the following convention: 137 138 REGISTER ENTRY EXIT 139 =============== ======================= ======================= 140 D0 Syscall number Return value 141 A0 1st syscall argument Saved 142 D1 2nd syscall argument Saved 143 A3 3rd syscall argument Saved 144 A2 4th syscall argument Saved 145 D3 5th syscall argument Saved 146 D2 6th syscall argument Saved 147 148 All other registers are saved. The layout is a consequence of the way the MOVM 149 instruction stores registers onto the stack.