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