^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/lib/callback_srm.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <asm/console.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define HWRPB_CRB_OFFSET 0xc0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #if defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) srm_dispatch:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #if defined(CONFIG_ALPHA_GENERIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ldl $4,alpha_using_srm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) beq $4,nosrm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) ldq $0,hwrpb # gp is set up by CALLBACK macro.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) ldl $25,0($25) # Pick up the wrapper data.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) mov $20,$21 # Shift arguments right.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) mov $19,$20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ldq $1,HWRPB_CRB_OFFSET($0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) mov $18,$19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) mov $17,$18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) mov $16,$17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) addq $0,$1,$2 # CRB address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ldq $27,0($2) # DISPATCH procedure descriptor (VMS call std)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) extwl $25,0,$16 # SRM callback function code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ldq $3,8($27) # call address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) extwl $25,2,$25 # argument information (VMS calling std)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) jmp ($3) # Return directly to caller of wrapper.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .globl srm_fixup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .ent srm_fixup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) srm_fixup:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ldgp $29,0($27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #if defined(CONFIG_ALPHA_GENERIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ldl $4,alpha_using_srm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) beq $4,nosrm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ldq $0,hwrpb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ldq $1,HWRPB_CRB_OFFSET($0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) addq $0,$1,$2 # CRB address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ldq $27,16($2) # VA of FIXUP procedure descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) ldq $3,8($27) # call address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) lda $25,2($31) # two integer arguments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) jmp ($3) # Return directly to caller of srm_fixup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .end srm_fixup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #if defined(CONFIG_ALPHA_GENERIC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) .align 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) nosrm:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) lda $0,-1($31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define CALLBACK(NAME, CODE, ARG_CNT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) .align 4; .globl callback_##NAME; .ent callback_##NAME; callback_##NAME##: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) ldgp $29,0($27); br $25,srm_dispatch; .word CODE, ARG_CNT; .end callback_##NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #else /* defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define CALLBACK(NAME, CODE, ARG_CNT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) .align 3; .globl callback_##NAME; .ent callback_##NAME; callback_##NAME##: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) lda $0,-1($31); ret; .end callback_##NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .align 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) .globl srm_fixup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) .ent srm_fixup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) srm_fixup:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) lda $0,-1($31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) ret
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) .end srm_fixup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #endif /* defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) CALLBACK(puts, CCB_PUTS, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) CALLBACK(open, CCB_OPEN, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) CALLBACK(close, CCB_CLOSE, 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) CALLBACK(read, CCB_READ, 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) CALLBACK(open_console, CCB_OPEN_CONSOLE, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) CALLBACK(close_console, CCB_CLOSE_CONSOLE, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) CALLBACK(getenv, CCB_GET_ENV, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) CALLBACK(setenv, CCB_SET_ENV, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) CALLBACK(getc, CCB_GETC, 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) CALLBACK(reset_term, CCB_RESET_TERM, 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) CALLBACK(term_int, CCB_SET_TERM_INT, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) CALLBACK(term_ctl, CCB_SET_TERM_CTL, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) CALLBACK(process_keycode, CCB_PROCESS_KEYCODE, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) CALLBACK(ioctl, CCB_IOCTL, 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) CALLBACK(write, CCB_WRITE, 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) CALLBACK(reset_env, CCB_RESET_ENV, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) CALLBACK(save_env, CCB_SAVE_ENV, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) CALLBACK(pswitch, CCB_PSWITCH, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) CALLBACK(bios_emul, CCB_BIOS_EMUL, 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) EXPORT_SYMBOL(callback_getenv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) EXPORT_SYMBOL(callback_setenv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) EXPORT_SYMBOL(callback_save_env)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) __alpha_using_srm: # For use by bootpheader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) .long 7 # value is not 1 for link debugging
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) .weak alpha_using_srm; alpha_using_srm = __alpha_using_srm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) __callback_init_done: # For use by bootpheader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .long 7 # value is not 1 for link debugging
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) .weak callback_init_done; callback_init_done = __callback_init_done
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)