diff --git a/sys/ia64/ia64/pal.S b/sys/ia64/ia64/pal.S index 78cac0d6b083..4c5abe5bc79e 100644 --- a/sys/ia64/ia64/pal.S +++ b/sys/ia64/ia64/pal.S @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000 Doug Rabson + * Copyright (c) 2000-2001 Doug Rabson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,7 +28,23 @@ #include -BSS(ia64_pal_entry, 8) + .data + .global ia64_pal_entry +ia64_pal_entry: .quad ia64_call_pal_stub + .text + +/* + * Stub for running in simulation. + */ +ENTRY(ia64_call_pal_stub, 0) + + mov r8=-3 + tbit.nz p6,p7=r28,8 // static or stacked? + ;; +(p6) br.ret.sptk.few rp +(p7) br.cond.sptk.few rp + +END(ia64_call_pal_stub) /* * struct ia64_pal_result ia64_call_pal_static(u_int64_t proc, @@ -75,6 +91,60 @@ psrsave = loc4 END(ia64_call_pal_static) +#ifdef _KERNEL + +/* + * struct ia64_pal_result ia64_call_pal_static_physical(u_int64_t proc, + * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) + */ +ENTRY(ia64_call_pal_static_physical, 4) + + .regstk 4,5,0,0 +palret = loc0 +entry = loc1 +rpsave = loc2 +pfssave = loc3 +psrsave = loc4 + + alloc pfssave=ar.pfs,4,5,0,0 + ;; + mov rpsave=rp + + movl entry=@gprel(ia64_pal_entry) +1: mov palret=ip // for return address + ;; + add entry=entry,gp + mov r28=in0 // procedure number + ;; + ld8 entry=[entry] // read entry point + mov r29=in1 // copy arguments + mov r30=in2 + mov r31=in3 + ;; + dep entry=0,entry,61,3 // physical address + dep palret=0,palret,61,3 // physical address + br.call.sptk.many rp=ia64_physical_mode + mov psrsave=ret0 + ;; + mov b6=entry + add palret=2f-1b,palret // calculate return address + ;; + mov b0=palret + br.cond.sptk b6 // call into firmware + ;; +2: mov r14=psrsave + ;; + br.call.sptk.many rp=ia64_change_mode + ;; + mov rp=rpsave + mov ar.pfs=pfssave + ;; + br.ret.sptk rp + +END(ia64_call_pal_static_physical) + +#endif + /* * struct ia64_pal_result ia64_call_pal_stacked(u_int64_t proc, * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) @@ -107,7 +177,7 @@ psrsave = loc3 rsm psr.i // disable interrupts ;; br.call.sptk.many rp=b6 // call into firmware -2: mov psr.l=psrsave + mov psr.l=psrsave mov rp=rpsave mov ar.pfs=pfssave ;; @@ -115,3 +185,52 @@ psrsave = loc3 br.ret.sptk rp END(ia64_call_pal_stacked) + +#ifdef _KERNEL + +/* + * struct ia64_pal_result ia64_call_pal_stacked_physical(u_int64_t proc, + * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) + */ +ENTRY(ia64_call_pal_stacked_physical, 4) + + .regstk 4,4,4,0 +entry = loc0 +rpsave = loc1 +pfssave = loc2 +psrsave = loc3 + + alloc pfssave=ar.pfs,4,4,4,0 + ;; + mov rpsave=rp + movl entry=@gprel(ia64_pal_entry) + ;; + add entry=entry,gp + mov r28=in0 // procedure number + mov out0=in0 + ;; + ld8 entry=[entry] // read entry point + mov out1=in1 // copy arguments + mov out2=in2 + mov out3=in3 + ;; + dep entry=0,entry,61,3 // physical address + br.call.sptk.many rp=ia64_physical_mode + mov psrsave=ret0 + ;; + mov b6=entry + ;; + br.call.sptk.many rp=b6 // call into firmware + ;; + mov r14=psrsave + ;; + br.call.sptk.many rp=ia64_change_mode + ;; + mov rp=rpsave + mov ar.pfs=pfssave + ;; + br.ret.sptk rp + +END(ia64_call_pal_stacked_physical) + +#endif diff --git a/sys/ia64/ia64/pal.s b/sys/ia64/ia64/pal.s index 78cac0d6b083..4c5abe5bc79e 100644 --- a/sys/ia64/ia64/pal.s +++ b/sys/ia64/ia64/pal.s @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2000 Doug Rabson + * Copyright (c) 2000-2001 Doug Rabson * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -28,7 +28,23 @@ #include -BSS(ia64_pal_entry, 8) + .data + .global ia64_pal_entry +ia64_pal_entry: .quad ia64_call_pal_stub + .text + +/* + * Stub for running in simulation. + */ +ENTRY(ia64_call_pal_stub, 0) + + mov r8=-3 + tbit.nz p6,p7=r28,8 // static or stacked? + ;; +(p6) br.ret.sptk.few rp +(p7) br.cond.sptk.few rp + +END(ia64_call_pal_stub) /* * struct ia64_pal_result ia64_call_pal_static(u_int64_t proc, @@ -75,6 +91,60 @@ psrsave = loc4 END(ia64_call_pal_static) +#ifdef _KERNEL + +/* + * struct ia64_pal_result ia64_call_pal_static_physical(u_int64_t proc, + * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) + */ +ENTRY(ia64_call_pal_static_physical, 4) + + .regstk 4,5,0,0 +palret = loc0 +entry = loc1 +rpsave = loc2 +pfssave = loc3 +psrsave = loc4 + + alloc pfssave=ar.pfs,4,5,0,0 + ;; + mov rpsave=rp + + movl entry=@gprel(ia64_pal_entry) +1: mov palret=ip // for return address + ;; + add entry=entry,gp + mov r28=in0 // procedure number + ;; + ld8 entry=[entry] // read entry point + mov r29=in1 // copy arguments + mov r30=in2 + mov r31=in3 + ;; + dep entry=0,entry,61,3 // physical address + dep palret=0,palret,61,3 // physical address + br.call.sptk.many rp=ia64_physical_mode + mov psrsave=ret0 + ;; + mov b6=entry + add palret=2f-1b,palret // calculate return address + ;; + mov b0=palret + br.cond.sptk b6 // call into firmware + ;; +2: mov r14=psrsave + ;; + br.call.sptk.many rp=ia64_change_mode + ;; + mov rp=rpsave + mov ar.pfs=pfssave + ;; + br.ret.sptk rp + +END(ia64_call_pal_static_physical) + +#endif + /* * struct ia64_pal_result ia64_call_pal_stacked(u_int64_t proc, * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) @@ -107,7 +177,7 @@ psrsave = loc3 rsm psr.i // disable interrupts ;; br.call.sptk.many rp=b6 // call into firmware -2: mov psr.l=psrsave + mov psr.l=psrsave mov rp=rpsave mov ar.pfs=pfssave ;; @@ -115,3 +185,52 @@ psrsave = loc3 br.ret.sptk rp END(ia64_call_pal_stacked) + +#ifdef _KERNEL + +/* + * struct ia64_pal_result ia64_call_pal_stacked_physical(u_int64_t proc, + * u_int64_t arg1, u_int64_t arg2, u_int64_t arg3) + */ +ENTRY(ia64_call_pal_stacked_physical, 4) + + .regstk 4,4,4,0 +entry = loc0 +rpsave = loc1 +pfssave = loc2 +psrsave = loc3 + + alloc pfssave=ar.pfs,4,4,4,0 + ;; + mov rpsave=rp + movl entry=@gprel(ia64_pal_entry) + ;; + add entry=entry,gp + mov r28=in0 // procedure number + mov out0=in0 + ;; + ld8 entry=[entry] // read entry point + mov out1=in1 // copy arguments + mov out2=in2 + mov out3=in3 + ;; + dep entry=0,entry,61,3 // physical address + br.call.sptk.many rp=ia64_physical_mode + mov psrsave=ret0 + ;; + mov b6=entry + ;; + br.call.sptk.many rp=b6 // call into firmware + ;; + mov r14=psrsave + ;; + br.call.sptk.many rp=ia64_change_mode + ;; + mov rp=rpsave + mov ar.pfs=pfssave + ;; + br.ret.sptk rp + +END(ia64_call_pal_stacked_physical) + +#endif