^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * arch/alpha/kernel/entry.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Kernel entry-points.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/asm-offsets.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/thread_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/pal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <asm/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/unistd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) .set noat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) .cfi_sections .debug_frame
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) /* Stack offsets. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define SP_OFF 184
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define SWITCH_STACK_SIZE 320
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) .macro CFI_START_OSF_FRAME func
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) .globl \func
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) .type \func,@function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) \func:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) .cfi_startproc simple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .cfi_return_column 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .cfi_def_cfa $sp, 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .cfi_rel_offset 64, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) .cfi_rel_offset $gp, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) .cfi_rel_offset $16, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .cfi_rel_offset $17, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .cfi_rel_offset $18, 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .macro CFI_END_OSF_FRAME func
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .cfi_endproc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .size \func, . - \func
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * This defines the normal kernel pt-regs layout.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * regs 9-15 preserved by C code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * regs 16-18 saved by PAL-code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * regs 29-30 saved and set up by PAL-code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * JRP - Save regs 16-18 in a special area of the stack, so that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * the palcode-provided values are available to the signal handler.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .macro SAVE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) subq $sp, SP_OFF, $sp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .cfi_adjust_cfa_offset SP_OFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) stq $0, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) stq $1, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) stq $2, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) stq $3, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) stq $4, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) stq $28, 144($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) .cfi_rel_offset $0, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) .cfi_rel_offset $1, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) .cfi_rel_offset $2, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) .cfi_rel_offset $3, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) .cfi_rel_offset $4, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .cfi_rel_offset $28, 144
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) lda $2, alpha_mv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) stq $5, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) stq $6, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) stq $7, 56($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) stq $8, 64($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) stq $19, 72($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) stq $20, 80($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) stq $21, 88($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ldq $2, HAE_CACHE($2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) stq $22, 96($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) stq $23, 104($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) stq $24, 112($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) stq $25, 120($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) stq $26, 128($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) stq $27, 136($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) stq $2, 152($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) stq $16, 160($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) stq $17, 168($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) stq $18, 176($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .cfi_rel_offset $5, 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) .cfi_rel_offset $6, 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) .cfi_rel_offset $7, 56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) .cfi_rel_offset $8, 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .cfi_rel_offset $19, 72
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .cfi_rel_offset $20, 80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .cfi_rel_offset $21, 88
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .cfi_rel_offset $22, 96
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .cfi_rel_offset $23, 104
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .cfi_rel_offset $24, 112
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .cfi_rel_offset $25, 120
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .cfi_rel_offset $26, 128
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) .cfi_rel_offset $27, 136
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .macro RESTORE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) lda $19, alpha_mv
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ldq $0, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) ldq $1, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ldq $2, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) ldq $3, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ldq $21, 152($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) ldq $20, HAE_CACHE($19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) ldq $4, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) ldq $5, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ldq $6, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) ldq $7, 56($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) subq $20, $21, $20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) ldq $8, 64($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) beq $20, 99f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) ldq $20, HAE_REG($19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) stq $21, HAE_CACHE($19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) stq $21, 0($20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 99: ldq $19, 72($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) ldq $20, 80($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) ldq $21, 88($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) ldq $22, 96($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) ldq $23, 104($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) ldq $24, 112($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) ldq $25, 120($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) ldq $26, 128($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ldq $27, 136($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) ldq $28, 144($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) addq $sp, SP_OFF, $sp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .cfi_restore $0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) .cfi_restore $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) .cfi_restore $2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) .cfi_restore $3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .cfi_restore $4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .cfi_restore $5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .cfi_restore $6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .cfi_restore $7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .cfi_restore $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) .cfi_restore $19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) .cfi_restore $20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) .cfi_restore $21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .cfi_restore $22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) .cfi_restore $23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .cfi_restore $24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) .cfi_restore $25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .cfi_restore $26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) .cfi_restore $27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) .cfi_restore $28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .cfi_adjust_cfa_offset -SP_OFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) .macro DO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) bsr $1, do_switch_stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .cfi_adjust_cfa_offset SWITCH_STACK_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) .cfi_rel_offset $9, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) .cfi_rel_offset $10, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) .cfi_rel_offset $11, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) .cfi_rel_offset $12, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) .cfi_rel_offset $13, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) .cfi_rel_offset $14, 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) .cfi_rel_offset $15, 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /* We don't really care about the FP registers for debugging. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) .macro UNDO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) bsr $1, undo_switch_stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) .cfi_restore $9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) .cfi_restore $10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) .cfi_restore $11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) .cfi_restore $12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) .cfi_restore $13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) .cfi_restore $14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) .cfi_restore $15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) .cfi_adjust_cfa_offset -SWITCH_STACK_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) * Non-syscall kernel entry points.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) CFI_START_OSF_FRAME entInt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) SAVE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) lda $8, 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) lda $26, ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) bic $sp, $8, $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) mov $sp, $19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) jsr $31, do_entInt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) CFI_END_OSF_FRAME entInt
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) CFI_START_OSF_FRAME entArith
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) SAVE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) lda $8, 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) lda $26, ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) bic $sp, $8, $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) mov $sp, $18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) jsr $31, do_entArith
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) CFI_END_OSF_FRAME entArith
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) CFI_START_OSF_FRAME entMM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) SAVE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) /* save $9 - $15 so the inline exception code can manipulate them. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) subq $sp, 56, $sp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) .cfi_adjust_cfa_offset 56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) stq $9, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) stq $10, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) stq $11, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) stq $12, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) stq $13, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) stq $14, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) stq $15, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) .cfi_rel_offset $9, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) .cfi_rel_offset $10, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) .cfi_rel_offset $11, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .cfi_rel_offset $12, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) .cfi_rel_offset $13, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .cfi_rel_offset $14, 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) .cfi_rel_offset $15, 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) addq $sp, 56, $19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) /* handle the fault */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) lda $8, 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) bic $sp, $8, $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) jsr $26, do_page_fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) /* reload the registers after the exception code played. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) ldq $9, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) ldq $10, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) ldq $11, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) ldq $12, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) ldq $13, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) ldq $14, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) ldq $15, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) addq $sp, 56, $sp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) .cfi_restore $9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) .cfi_restore $10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) .cfi_restore $11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) .cfi_restore $12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) .cfi_restore $13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) .cfi_restore $14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) .cfi_restore $15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) .cfi_adjust_cfa_offset -56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) /* finish up the syscall as normal. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) br ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) CFI_END_OSF_FRAME entMM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) CFI_START_OSF_FRAME entIF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) SAVE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) lda $8, 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) lda $26, ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) bic $sp, $8, $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) mov $sp, $17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) jsr $31, do_entIF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) CFI_END_OSF_FRAME entIF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) CFI_START_OSF_FRAME entUna
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) lda $sp, -256($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) .cfi_adjust_cfa_offset 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) stq $0, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) .cfi_rel_offset $0, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) .cfi_remember_state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) ldq $0, 256($sp) /* get PS */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) stq $1, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) stq $2, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) stq $3, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) and $0, 8, $0 /* user mode? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) stq $4, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) bne $0, entUnaUser /* yup -> do user-level unaligned fault */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) stq $5, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) stq $6, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) stq $7, 56($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) stq $8, 64($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) stq $9, 72($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) stq $10, 80($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) stq $11, 88($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) stq $12, 96($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) stq $13, 104($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) stq $14, 112($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) stq $15, 120($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) /* 16-18 PAL-saved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) stq $19, 152($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) stq $20, 160($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) stq $21, 168($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) stq $22, 176($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) stq $23, 184($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) stq $24, 192($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) stq $25, 200($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) stq $26, 208($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) stq $27, 216($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) stq $28, 224($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) mov $sp, $19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) stq $gp, 232($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) .cfi_rel_offset $1, 1*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) .cfi_rel_offset $2, 2*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) .cfi_rel_offset $3, 3*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) .cfi_rel_offset $4, 4*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) .cfi_rel_offset $5, 5*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) .cfi_rel_offset $6, 6*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) .cfi_rel_offset $7, 7*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) .cfi_rel_offset $8, 8*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) .cfi_rel_offset $9, 9*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) .cfi_rel_offset $10, 10*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) .cfi_rel_offset $11, 11*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) .cfi_rel_offset $12, 12*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) .cfi_rel_offset $13, 13*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) .cfi_rel_offset $14, 14*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) .cfi_rel_offset $15, 15*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) .cfi_rel_offset $19, 19*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) .cfi_rel_offset $20, 20*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) .cfi_rel_offset $21, 21*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) .cfi_rel_offset $22, 22*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) .cfi_rel_offset $23, 23*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) .cfi_rel_offset $24, 24*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) .cfi_rel_offset $25, 25*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) .cfi_rel_offset $26, 26*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) .cfi_rel_offset $27, 27*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) .cfi_rel_offset $28, 28*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) .cfi_rel_offset $29, 29*8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) lda $8, 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) stq $31, 248($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) bic $sp, $8, $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) jsr $26, do_entUna
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) ldq $0, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) ldq $1, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) ldq $2, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) ldq $3, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) ldq $4, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) ldq $5, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) ldq $6, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) ldq $7, 56($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) ldq $8, 64($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) ldq $9, 72($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) ldq $10, 80($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) ldq $11, 88($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) ldq $12, 96($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) ldq $13, 104($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) ldq $14, 112($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) ldq $15, 120($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) /* 16-18 PAL-saved */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) ldq $19, 152($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) ldq $20, 160($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) ldq $21, 168($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) ldq $22, 176($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) ldq $23, 184($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) ldq $24, 192($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) ldq $25, 200($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) ldq $26, 208($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) ldq $27, 216($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) ldq $28, 224($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) ldq $gp, 232($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) lda $sp, 256($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) .cfi_restore $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) .cfi_restore $2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) .cfi_restore $3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) .cfi_restore $4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) .cfi_restore $5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) .cfi_restore $6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) .cfi_restore $7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) .cfi_restore $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) .cfi_restore $9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) .cfi_restore $10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) .cfi_restore $11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) .cfi_restore $12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) .cfi_restore $13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) .cfi_restore $14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) .cfi_restore $15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) .cfi_restore $19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) .cfi_restore $20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) .cfi_restore $21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) .cfi_restore $22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) .cfi_restore $23
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) .cfi_restore $24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) .cfi_restore $25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) .cfi_restore $26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) .cfi_restore $27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) .cfi_restore $28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) .cfi_restore $29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) .cfi_adjust_cfa_offset -256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) call_pal PAL_rti
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) entUnaUser:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) .cfi_restore_state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) ldq $0, 0($sp) /* restore original $0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) lda $sp, 256($sp) /* pop entUna's stack frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) .cfi_restore $0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) .cfi_adjust_cfa_offset -256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) SAVE_ALL /* setup normal kernel stack */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) lda $sp, -56($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) .cfi_adjust_cfa_offset 56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) stq $9, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) stq $10, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) stq $11, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) stq $12, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) stq $13, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) stq $14, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) stq $15, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) .cfi_rel_offset $9, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) .cfi_rel_offset $10, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) .cfi_rel_offset $11, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) .cfi_rel_offset $12, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) .cfi_rel_offset $13, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) .cfi_rel_offset $14, 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) .cfi_rel_offset $15, 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) lda $8, 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) addq $sp, 56, $19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) bic $sp, $8, $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) jsr $26, do_entUnaUser
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) ldq $9, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) ldq $10, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) ldq $11, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) ldq $12, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) ldq $13, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) ldq $14, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) ldq $15, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) lda $sp, 56($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) .cfi_restore $9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) .cfi_restore $10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) .cfi_restore $11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) .cfi_restore $12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) .cfi_restore $13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) .cfi_restore $14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) .cfi_restore $15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) .cfi_adjust_cfa_offset -56
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) br ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) CFI_END_OSF_FRAME entUna
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) CFI_START_OSF_FRAME entDbg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) SAVE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) lda $8, 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) lda $26, ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) bic $sp, $8, $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) mov $sp, $16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) jsr $31, do_entDbg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) CFI_END_OSF_FRAME entDbg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) * The system call entry point is special. Most importantly, it looks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) * like a function call to userspace as far as clobbered registers. We
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) * do preserve the argument registers (for syscall restarts) and $26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) * (for leaf syscall functions).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) * So much for theory. We don't take advantage of this yet.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) * Note that a0-a2 are not saved by PALcode as with the other entry points.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) .globl entSys
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) .type entSys, @function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) .cfi_startproc simple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) .cfi_return_column 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) .cfi_def_cfa $sp, 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) .cfi_rel_offset 64, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) .cfi_rel_offset $gp, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) entSys:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) SAVE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) lda $8, 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) bic $sp, $8, $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) lda $4, NR_SYSCALLS($31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) stq $16, SP_OFF+24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) lda $5, sys_call_table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) lda $27, sys_ni_syscall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) cmpult $0, $4, $4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) ldl $3, TI_FLAGS($8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) stq $17, SP_OFF+32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) s8addq $0, $5, $5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) stq $18, SP_OFF+40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) .cfi_rel_offset $16, SP_OFF+24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) .cfi_rel_offset $17, SP_OFF+32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) .cfi_rel_offset $18, SP_OFF+40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) #ifdef CONFIG_AUDITSYSCALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) lda $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) and $3, $6, $3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) bne $3, strace
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) beq $4, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) ldq $27, 0($5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 1: jsr $26, ($27), sys_ni_syscall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) ldgp $gp, 0($26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) blt $0, $syscall_error /* the call failed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) stq $0, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) stq $31, 72($sp) /* a3=0 => no error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) .globl ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) ret_from_sys_call:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) cmovne $26, 0, $18 /* $18 = 0 => non-restartable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) ldq $0, SP_OFF($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) and $0, 8, $0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) beq $0, ret_to_kernel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) ret_to_user:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) /* Make sure need_resched and sigpending don't change between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) sampling and the rti. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) lda $16, 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) call_pal PAL_swpipl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) ldl $17, TI_FLAGS($8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) and $17, _TIF_WORK_MASK, $2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) bne $2, work_pending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) restore_all:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) .cfi_remember_state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) RESTORE_ALL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) call_pal PAL_rti
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) ret_to_kernel:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) .cfi_restore_state
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) lda $16, 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) call_pal PAL_swpipl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) br restore_all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) .align 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) $syscall_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) * Some system calls (e.g., ptrace) can return arbitrary
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) * values which might normally be mistaken as error numbers.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) * Those functions must zero $0 (v0) directly in the stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) * frame to indicate that a negative return value wasn't an
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) * error number..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) ldq $18, 0($sp) /* old syscall nr (zero if success) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) beq $18, $ret_success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) ldq $19, 72($sp) /* .. and this a3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) subq $31, $0, $0 /* with error in v0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) addq $31, 1, $1 /* set a3 for errno return */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) stq $0, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) mov $31, $26 /* tell "ret_from_sys_call" we can restart */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) stq $1, 72($sp) /* a3 for return */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) br ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) $ret_success:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) stq $0, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) stq $31, 72($sp) /* a3=0 => no error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) br ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) * Do all cleanup when returning from all interrupts and system calls.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) * Arguments:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) * $8: current.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) * $17: TI_FLAGS.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) * $18: The old syscall number, or zero if this is not a return
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) * from a syscall that errored and is possibly restartable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) * $19: The old a3 value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) .type work_pending, @function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) work_pending:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) and $17, _TIF_NOTIFY_RESUME | _TIF_SIGPENDING, $2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) bne $2, $work_notifysig
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) $work_resched:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) * We can get here only if we returned from syscall without SIGPENDING
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) * or got through work_notifysig already. Either case means no syscall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) * restarts for us, so let $18 and $19 burn.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) jsr $26, schedule
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) mov 0, $18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) br ret_to_user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) $work_notifysig:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) mov $sp, $16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) DO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) jsr $26, do_work_pending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) UNDO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) br restore_all
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) * PTRACE syscall handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) .type strace, @function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) strace:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) /* set up signal stack, call syscall_trace */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) DO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) jsr $26, syscall_trace_enter /* returns the syscall number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) UNDO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) /* get the arguments back.. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) ldq $16, SP_OFF+24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) ldq $17, SP_OFF+32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) ldq $18, SP_OFF+40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) ldq $19, 72($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) ldq $20, 80($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) ldq $21, 88($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) /* get the system call pointer.. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) lda $1, NR_SYSCALLS($31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) lda $2, sys_call_table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) lda $27, sys_ni_syscall
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) cmpult $0, $1, $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) s8addq $0, $2, $2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) beq $1, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) ldq $27, 0($2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) 1: jsr $26, ($27), sys_gettimeofday
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) ret_from_straced:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) ldgp $gp, 0($26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) /* check return.. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) blt $0, $strace_error /* the call failed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) stq $31, 72($sp) /* a3=0 => no error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) $strace_success:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) stq $0, 0($sp) /* save return value */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) DO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) jsr $26, syscall_trace_leave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) UNDO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) br $31, ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) .align 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) $strace_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) ldq $18, 0($sp) /* old syscall nr (zero if success) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) beq $18, $strace_success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) ldq $19, 72($sp) /* .. and this a3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) subq $31, $0, $0 /* with error in v0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) addq $31, 1, $1 /* set a3 for errno return */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) stq $0, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) stq $1, 72($sp) /* a3 for return */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) DO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) mov $18, $9 /* save old syscall number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) mov $19, $10 /* save old a3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) jsr $26, syscall_trace_leave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) mov $9, $18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) mov $10, $19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) UNDO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) mov $31, $26 /* tell "ret_from_sys_call" we can restart */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) br ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) CFI_END_OSF_FRAME entSys
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) * Save and restore the switch stack -- aka the balance of the user context.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) .type do_switch_stack, @function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) .cfi_startproc simple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) .cfi_return_column 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) .cfi_def_cfa $sp, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) .cfi_register 64, $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) do_switch_stack:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) lda $sp, -SWITCH_STACK_SIZE($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) .cfi_adjust_cfa_offset SWITCH_STACK_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) stq $9, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) stq $10, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) stq $11, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) stq $12, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) stq $13, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) stq $14, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) stq $15, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) stq $26, 56($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) stt $f0, 64($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) stt $f1, 72($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) stt $f2, 80($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) stt $f3, 88($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) stt $f4, 96($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) stt $f5, 104($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) stt $f6, 112($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) stt $f7, 120($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) stt $f8, 128($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) stt $f9, 136($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) stt $f10, 144($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) stt $f11, 152($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) stt $f12, 160($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) stt $f13, 168($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) stt $f14, 176($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) stt $f15, 184($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) stt $f16, 192($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) stt $f17, 200($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) stt $f18, 208($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) stt $f19, 216($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) stt $f20, 224($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) stt $f21, 232($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) stt $f22, 240($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) stt $f23, 248($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) stt $f24, 256($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) stt $f25, 264($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) stt $f26, 272($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) stt $f27, 280($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) mf_fpcr $f0 # get fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) stt $f28, 288($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) stt $f29, 296($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) stt $f30, 304($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) stt $f0, 312($sp) # save fpcr in slot of $f31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) ldt $f0, 64($sp) # dont let "do_switch_stack" change fp state.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) ret $31, ($1), 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) .cfi_endproc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) .size do_switch_stack, .-do_switch_stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) .type undo_switch_stack, @function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) .cfi_startproc simple
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) .cfi_def_cfa $sp, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) .cfi_register 64, $1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) undo_switch_stack:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) ldq $9, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) ldq $10, 8($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) ldq $11, 16($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) ldq $12, 24($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) ldq $13, 32($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) ldq $14, 40($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) ldq $15, 48($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) ldq $26, 56($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) ldt $f30, 312($sp) # get saved fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) ldt $f0, 64($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) ldt $f1, 72($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) ldt $f2, 80($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) ldt $f3, 88($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) mt_fpcr $f30 # install saved fpcr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) ldt $f4, 96($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) ldt $f5, 104($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) ldt $f6, 112($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) ldt $f7, 120($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) ldt $f8, 128($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) ldt $f9, 136($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) ldt $f10, 144($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) ldt $f11, 152($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) ldt $f12, 160($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) ldt $f13, 168($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) ldt $f14, 176($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) ldt $f15, 184($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) ldt $f16, 192($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) ldt $f17, 200($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) ldt $f18, 208($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) ldt $f19, 216($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) ldt $f20, 224($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) ldt $f21, 232($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) ldt $f22, 240($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) ldt $f23, 248($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) ldt $f24, 256($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) ldt $f25, 264($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) ldt $f26, 272($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) ldt $f27, 280($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) ldt $f28, 288($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) ldt $f29, 296($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) ldt $f30, 304($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) lda $sp, SWITCH_STACK_SIZE($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) ret $31, ($1), 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) .cfi_endproc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) .size undo_switch_stack, .-undo_switch_stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) * The meat of the context switch code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) .globl alpha_switch_to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) .type alpha_switch_to, @function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) .cfi_startproc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) alpha_switch_to:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) DO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) call_pal PAL_swpctx
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) lda $8, 0x3fff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) UNDO_SWITCH_STACK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) bic $sp, $8, $8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) mov $17, $0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) ret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) .cfi_endproc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) .size alpha_switch_to, .-alpha_switch_to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) * New processes begin life here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) .globl ret_from_fork
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) .ent ret_from_fork
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) ret_from_fork:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) lda $26, ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) mov $17, $16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) jmp $31, schedule_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) .end ret_from_fork
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) * ... and new kernel threads - here
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) .globl ret_from_kernel_thread
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) .ent ret_from_kernel_thread
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) ret_from_kernel_thread:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) mov $17, $16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) jsr $26, schedule_tail
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) mov $9, $27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) mov $10, $16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) jsr $26, ($9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) br $31, ret_to_user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) .end ret_from_kernel_thread
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) * Special system calls. Most of these are special in that they either
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) * have to play switch_stack games.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) .macro fork_like name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) .globl alpha_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) .ent alpha_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) alpha_\name:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) .prologue 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) bsr $1, do_switch_stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) jsr $26, sys_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) ldq $26, 56($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) lda $sp, SWITCH_STACK_SIZE($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) ret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) .end alpha_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) fork_like fork
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) fork_like vfork
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) fork_like clone
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) .macro sigreturn_like name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) .globl sys_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) .ent sys_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) sys_\name:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) .prologue 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) lda $9, ret_from_straced
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) cmpult $26, $9, $9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) lda $sp, -SWITCH_STACK_SIZE($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) jsr $26, do_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) bne $9, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) jsr $26, syscall_trace_leave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) 1: br $1, undo_switch_stack
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) br ret_from_sys_call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) .end sys_\name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) sigreturn_like sigreturn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) sigreturn_like rt_sigreturn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) .globl alpha_syscall_zero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) .ent alpha_syscall_zero
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) alpha_syscall_zero:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) .prologue 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) /* Special because it needs to do something opposite to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) force_successful_syscall_return(). We use the saved
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) syscall number for that, zero meaning "not an error".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) That works nicely, but for real syscall 0 we need to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) make sure that this logics doesn't get confused.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) Store a non-zero there - -ENOSYS we need in register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) for our return value will do just fine.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) lda $0, -ENOSYS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) unop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) stq $0, 0($sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) ret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) .end alpha_syscall_zero