11da177e4SLinus Torvalds/* 21da177e4SLinus Torvalds * arch/alpha/lib/callback_srm.S 31da177e4SLinus Torvalds */ 41da177e4SLinus Torvalds 51da177e4SLinus Torvalds#include <linux/config.h> 61da177e4SLinus Torvalds#include <asm/console.h> 71da177e4SLinus Torvalds 81da177e4SLinus Torvalds.text 91da177e4SLinus Torvalds#define HWRPB_CRB_OFFSET 0xc0 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds#if defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) 121da177e4SLinus Torvalds.align 4 131da177e4SLinus Torvaldssrm_dispatch: 141da177e4SLinus Torvalds#if defined(CONFIG_ALPHA_GENERIC) 151da177e4SLinus Torvalds ldl $4,alpha_using_srm 161da177e4SLinus Torvalds beq $4,nosrm 171da177e4SLinus Torvalds#endif 181da177e4SLinus Torvalds ldq $0,hwrpb # gp is set up by CALLBACK macro. 191da177e4SLinus Torvalds ldl $25,0($25) # Pick up the wrapper data. 201da177e4SLinus Torvalds mov $20,$21 # Shift arguments right. 211da177e4SLinus Torvalds mov $19,$20 221da177e4SLinus Torvalds ldq $1,HWRPB_CRB_OFFSET($0) 231da177e4SLinus Torvalds mov $18,$19 241da177e4SLinus Torvalds mov $17,$18 251da177e4SLinus Torvalds mov $16,$17 261da177e4SLinus Torvalds addq $0,$1,$2 # CRB address 271da177e4SLinus Torvalds ldq $27,0($2) # DISPATCH procedure descriptor (VMS call std) 281da177e4SLinus Torvalds extwl $25,0,$16 # SRM callback function code 291da177e4SLinus Torvalds ldq $3,8($27) # call address 301da177e4SLinus Torvalds extwl $25,2,$25 # argument information (VMS calling std) 311da177e4SLinus Torvalds jmp ($3) # Return directly to caller of wrapper. 321da177e4SLinus Torvalds 331da177e4SLinus Torvalds.align 4 341da177e4SLinus Torvalds.globl srm_fixup 351da177e4SLinus Torvalds.ent srm_fixup 361da177e4SLinus Torvaldssrm_fixup: 371da177e4SLinus Torvalds ldgp $29,0($27) 381da177e4SLinus Torvalds#if defined(CONFIG_ALPHA_GENERIC) 391da177e4SLinus Torvalds ldl $4,alpha_using_srm 401da177e4SLinus Torvalds beq $4,nosrm 411da177e4SLinus Torvalds#endif 421da177e4SLinus Torvalds ldq $0,hwrpb 431da177e4SLinus Torvalds ldq $1,HWRPB_CRB_OFFSET($0) 441da177e4SLinus Torvalds addq $0,$1,$2 # CRB address 451da177e4SLinus Torvalds ldq $27,16($2) # VA of FIXUP procedure descriptor 461da177e4SLinus Torvalds ldq $3,8($27) # call address 471da177e4SLinus Torvalds lda $25,2($31) # two integer arguments 481da177e4SLinus Torvalds jmp ($3) # Return directly to caller of srm_fixup. 491da177e4SLinus Torvalds.end srm_fixup 501da177e4SLinus Torvalds 511da177e4SLinus Torvalds#if defined(CONFIG_ALPHA_GENERIC) 521da177e4SLinus Torvalds.align 3 531da177e4SLinus Torvaldsnosrm: 541da177e4SLinus Torvalds lda $0,-1($31) 551da177e4SLinus Torvalds ret 561da177e4SLinus Torvalds#endif 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds#define CALLBACK(NAME, CODE, ARG_CNT) \ 591da177e4SLinus Torvalds.align 4; .globl callback_##NAME; .ent callback_##NAME; callback_##NAME##: \ 601da177e4SLinus Torvaldsldgp $29,0($27); br $25,srm_dispatch; .word CODE, ARG_CNT; .end callback_##NAME 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds#else /* defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) */ 631da177e4SLinus Torvalds 641da177e4SLinus Torvalds#define CALLBACK(NAME, CODE, ARG_CNT) \ 651da177e4SLinus Torvalds.align 3; .globl callback_##NAME; .ent callback_##NAME; callback_##NAME##: \ 661da177e4SLinus Torvaldslda $0,-1($31); ret; .end callback_##NAME 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds.align 3 691da177e4SLinus Torvalds.globl srm_fixup 701da177e4SLinus Torvalds.ent srm_fixup 711da177e4SLinus Torvaldssrm_fixup: 721da177e4SLinus Torvalds lda $0,-1($31) 731da177e4SLinus Torvalds ret 741da177e4SLinus Torvalds.end srm_fixup 751da177e4SLinus Torvalds#endif /* defined(CONFIG_ALPHA_SRM) || defined(CONFIG_ALPHA_GENERIC) */ 761da177e4SLinus Torvalds 771da177e4SLinus TorvaldsCALLBACK(puts, CCB_PUTS, 4) 781da177e4SLinus TorvaldsCALLBACK(open, CCB_OPEN, 3) 791da177e4SLinus TorvaldsCALLBACK(close, CCB_CLOSE, 2) 801da177e4SLinus TorvaldsCALLBACK(read, CCB_READ, 5) 811da177e4SLinus TorvaldsCALLBACK(open_console, CCB_OPEN_CONSOLE, 1) 821da177e4SLinus TorvaldsCALLBACK(close_console, CCB_CLOSE_CONSOLE, 1) 831da177e4SLinus TorvaldsCALLBACK(getenv, CCB_GET_ENV, 4) 841da177e4SLinus TorvaldsCALLBACK(setenv, CCB_SET_ENV, 4) 851da177e4SLinus TorvaldsCALLBACK(getc, CCB_GETC, 2) 861da177e4SLinus TorvaldsCALLBACK(reset_term, CCB_RESET_TERM, 2) 871da177e4SLinus TorvaldsCALLBACK(term_int, CCB_SET_TERM_INT, 3) 881da177e4SLinus TorvaldsCALLBACK(term_ctl, CCB_SET_TERM_CTL, 3) 891da177e4SLinus TorvaldsCALLBACK(process_keycode, CCB_PROCESS_KEYCODE, 3) 901da177e4SLinus TorvaldsCALLBACK(ioctl, CCB_IOCTL, 6) 911da177e4SLinus TorvaldsCALLBACK(write, CCB_WRITE, 5) 921da177e4SLinus TorvaldsCALLBACK(reset_env, CCB_RESET_ENV, 4) 931da177e4SLinus TorvaldsCALLBACK(save_env, CCB_SAVE_ENV, 1) 941da177e4SLinus TorvaldsCALLBACK(pswitch, CCB_PSWITCH, 3) 951da177e4SLinus TorvaldsCALLBACK(bios_emul, CCB_BIOS_EMUL, 5) 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds.data 981da177e4SLinus Torvalds__alpha_using_srm: # For use by bootpheader 991da177e4SLinus Torvalds .long 7 # value is not 1 for link debugging 1001da177e4SLinus Torvalds .weak alpha_using_srm; alpha_using_srm = __alpha_using_srm 1011da177e4SLinus Torvalds__callback_init_done: # For use by bootpheader 1021da177e4SLinus Torvalds .long 7 # value is not 1 for link debugging 1031da177e4SLinus Torvalds .weak callback_init_done; callback_init_done = __callback_init_done 1041da177e4SLinus Torvalds 105