From: Zhang, X. <xia...@in...> - 2008-01-31 10:30:14
|
From: Zhang Xiantao <xia...@in...> Date: Tue, 29 Jan 2008 14:32:14 +0800 Subject: [PATCH] kvm/ia64: Add trampoline for guest/host mode switch. trampoline.S is for guest/host mode switch. Signed-off-by: Anthony Xu <ant...@in...> Signed-off-by: Xiantao Zhang <xia...@in...> --- arch/ia64/kvm/trampoline.S | 1040 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1040 insertions(+), 0 deletions(-) create mode 100644 arch/ia64/kvm/trampoline.S diff --git a/arch/ia64/kvm/trampoline.S b/arch/ia64/kvm/trampoline.S new file mode 100644 index 0000000..d3232b5 --- /dev/null +++ b/arch/ia64/kvm/trampoline.S @@ -0,0 +1,1040 @@ +/* Save all processor states + * + * Copyright (c) 2007 Fleming Feng <fle...@in...> + * Copyright (c) 2007 Anthony Xu <ant...@in...> + */ + +#include <asm/asmmacro.h> +#include "asm-offsets.h" + + +#define CTX(name) VMM_CTX_##name##_OFFSET + + /* + * r32: context_t base address + */ +#define SAVE_BRANCH_REGS \ + add r2 =3D CTX(B0),r32; \ + add r3 =3D CTX(B1),r32; \ + mov r16 =3D b0; \ + mov r17 =3D b1; \ + ;; \ + st8 [r2]=3Dr16,16; \ + st8 [r3]=3Dr17,16; \ + ;; \ + mov r16 =3D b2; \ + mov r17 =3D b3; \ + ;; \ + st8 [r2]=3Dr16,16; \ + st8 [r3]=3Dr17,16; \ + ;; \ + mov r16 =3D b4; \ + mov r17 =3D b5; \ + ;; \ + st8 [r2]=3Dr16; \ + st8 [r3]=3Dr17; \ + ;; + + /* + * r33: context_t base address + */ +#define RESTORE_BRANCH_REGS \ + add r2 =3D CTX(B0),r33; \ + add r3 =3D CTX(B1),r33; \ + ;; \ + ld8 r16=3D[r2],16; \ + ld8 r17=3D[r3],16; \ + ;; \ + mov b0 =3D r16; \ + mov b1 =3D r17; \ + ;; \ + ld8 r16=3D[r2],16; \ + ld8 r17=3D[r3],16; \ + ;; \ + mov b2 =3D r16; \ + mov b3 =3D r17; \ + ;; \ + ld8 r16=3D[r2]; \ + ld8 r17=3D[r3]; \ + ;; \ + mov b4=3Dr16; \ + mov b5=3Dr17; \ + ;; + + + /* + * r32: context_t base address + * bsw =3D=3D 1 + * Save all bank1 general registers, r4 ~ r7 + */ +#define SAVE_GENERAL_REGS \ + add r2=3DCTX(R4),r32; \ + add r3=3DCTX(R5),r32; \ + ;; \ +.mem.offset 0,0; \ + st8.spill [r2]=3Dr4,16; \ +.mem.offset 8,0; \ + st8.spill [r3]=3Dr5,16; \ + ;; \ +.mem.offset 0,0; \ + st8.spill [r2]=3Dr6,48; \ +.mem.offset 8,0; \ + st8.spill [r3]=3Dr7,48; \ + ;; \ +.mem.offset 0,0; \ + st8.spill [r2]=3Dr12; \ +.mem.offset 8,0; \ + st8.spill [r3]=3Dr13; \ + ;; + + /* + * r33: context_t base address + * bsw =3D=3D 1 + */ +#define RESTORE_GENERAL_REGS \ + add r2=3DCTX(R4),r33; \ + add r3=3DCTX(R5),r33; \ + ;; \ + ld8.fill r4=3D[r2],16; \ + ld8.fill r5=3D[r3],16; \ + ;; \ + ld8.fill r6=3D[r2],48; \ + ld8.fill r7=3D[r3],48; \ + ;; \ + ld8.fill r12=3D[r2]; \ + ld8.fill r13 =3D[r3]; \ + ;; + + + + + /* + * r32: context_t base address + */ +#define SAVE_KERNEL_REGS \ + add r2 =3D CTX(KR0),r32; \ + add r3 =3D CTX(KR1),r32; \ + mov r16 =3D ar.k0; \ + mov r17 =3D ar.k1; \ + ;; \ + st8 [r2] =3D r16,16; \ + st8 [r3] =3D r17,16; \ + ;; \ + mov r16 =3D ar.k2; \ + mov r17 =3D ar.k3; \ + ;; \ + st8 [r2] =3D r16,16; \ + st8 [r3] =3D r17,16; \ + ;; \ + mov r16 =3D ar.k4; \ + mov r17 =3D ar.k5; \ + ;; \ + st8 [r2] =3D r16,16; \ + st8 [r3] =3D r17,16; \ + ;; \ + mov r16 =3D ar.k6; \ + mov r17 =3D ar.k7; \ + ;; \ + st8 [r2] =3D r16; \ + st8 [r3] =3D r17; \ + ;; + + + + /* + * r33: context_t base address + */ +#define RESTORE_KERNEL_REGS \ + add r2 =3D CTX(KR0),r33; \ + add r3 =3D CTX(KR1),r33; \ + ;; \ + ld8 r16=3D[r2],16; \ + ld8 r17=3D[r3],16; \ + ;; \ + mov ar.k0=3Dr16; \ + mov ar.k1=3Dr17; \ + ;; \ + ld8 r16=3D[r2],16; \ + ld8 r17=3D[r3],16; \ + ;; \ + mov ar.k2=3Dr16; \ + mov ar.k3=3Dr17; \ + ;; \ + ld8 r16=3D[r2],16; \ + ld8 r17=3D[r3],16; \ + ;; \ + mov ar.k4=3Dr16; \ + mov ar.k5=3Dr17; \ + ;; \ + ld8 r16=3D[r2],16; \ + ld8 r17=3D[r3],16; \ + ;; \ + mov ar.k6=3Dr16; \ + mov ar.k7=3Dr17; \ + ;; + + + + /* + * r32: context_t base address + */ +#define SAVE_APP_REGS \ + add r2 =3D CTX(BSPSTORE),r32; \ + mov r16 =3D ar.bspstore; \ + ;; \ + st8 [r2] =3D r16,CTX(RNAT)-CTX(BSPSTORE);\ + mov r16 =3D ar.rnat; \ + ;; \ + st8 [r2] =3D r16,CTX(FCR)-CTX(RNAT); \ + mov r16 =3D ar.fcr; \ + ;; \ + st8 [r2] =3D r16,CTX(EFLAG)-CTX(FCR); \ + mov r16 =3D ar.eflag; \ + ;; \ + st8 [r2] =3D r16,CTX(CFLG)-CTX(EFLAG); \ + mov r16 =3D ar.cflg; \ + ;; \ + st8 [r2] =3D r16,CTX(FSR)-CTX(CFLG); \ + mov r16 =3D ar.fsr; \ + ;; \ + st8 [r2] =3D r16,CTX(FIR)-CTX(FSR); \ + mov r16 =3D ar.fir; \ + ;; \ + st8 [r2] =3D r16,CTX(FDR)-CTX(FIR); \ + mov r16 =3D ar.fdr; \ + ;; \ + st8 [r2] =3D r16,CTX(UNAT)-CTX(FDR); \ + mov r16 =3D ar.unat; \ + ;; \ + st8 [r2] =3D r16,CTX(FPSR)-CTX(UNAT); \ + mov r16 =3D ar.fpsr; \ + ;; \ + st8 [r2] =3D r16,CTX(PFS)-CTX(FPSR); \ + mov r16 =3D ar.pfs; \ + ;; \ + st8 [r2] =3D r16,CTX(LC)-CTX(PFS); \ + mov r16 =3D ar.lc; \ + ;; \ + st8 [r2] =3D r16; \ + ;; + + /* + * r33: context_t base address + */ +#define RESTORE_APP_REGS \ + add r2=3DCTX(BSPSTORE),r33; \ + ;; \ + ld8 r16=3D[r2],CTX(RNAT)-CTX(BSPSTORE); \ + ;; \ + mov ar.bspstore=3Dr16; \ + ld8 r16=3D[r2],CTX(FCR)-CTX(RNAT); \ + ;; \ + mov ar.rnat=3Dr16; \ + ld8 r16=3D[r2],CTX(EFLAG)-CTX(FCR); \ + ;; \ + mov ar.fcr=3Dr16; \ + ld8 r16=3D[r2],CTX(CFLG)-CTX(EFLAG); \ + ;; \ + mov ar.eflag=3Dr16; \ + ld8 r16=3D[r2],CTX(FSR)-CTX(CFLG); \ + ;; \ + mov ar.cflg=3Dr16; \ + ld8 r16=3D[r2],CTX(FIR)-CTX(FSR); \ + ;; \ + mov ar.fsr=3Dr16; \ + ld8 r16=3D[r2],CTX(FDR)-CTX(FIR); \ + ;; \ + mov ar.fir=3Dr16; \ + ld8 r16=3D[r2],CTX(UNAT)-CTX(FDR); \ + ;; \ + mov ar.fdr=3Dr16; \ + ld8 r16=3D[r2],CTX(FPSR)-CTX(UNAT); \ + ;; \ + mov ar.unat=3Dr16; \ + ld8 r16=3D[r2],CTX(PFS)-CTX(FPSR); \ + ;; \ + mov ar.fpsr=3Dr16; \ + ld8 r16=3D[r2],CTX(LC)-CTX(PFS); \ + ;; \ + mov ar.pfs=3Dr16; \ + ld8 r16=3D[r2]; \ + ;; \ + mov ar.lc=3Dr16; \ + ;; + + /* + * r32: context_t base address + */ +#define SAVE_CTL_REGS \ + add r2 =3D CTX(DCR),r32; \ + mov r16 =3D cr.dcr; \ + ;; \ + st8 [r2] =3D r16,CTX(IVA)-CTX(DCR); \ + ;; \ + mov r16 =3D cr.iva; \ + ;; \ + st8 [r2] =3D r16,CTX(PTA)-CTX(IVA); \ + ;; \ + mov r16 =3D cr.pta; \ + ;; \ + st8 [r2] =3D r16 ; \ + ;; + + /* + * r33: context_t base address + */ +#define RESTORE_CTL_REGS \ + add r2 =3D CTX(DCR),r33; \ + ;; \ + ld8 r16 =3D [r2],CTX(IVA)-CTX(DCR); \ + ;; \ + mov cr.dcr =3D r16; \ + dv_serialize_data; \ + ;; \ + ld8 r16 =3D [r2],CTX(PTA)-CTX(IVA); \ + ;; \ + mov cr.iva =3D r16; \ + dv_serialize_data; \ + ;; \ + ld8 r16 =3D [r2]; \ + ;; \ + mov cr.pta =3D r16; \ + dv_serialize_data; \ + ;; + + + /* + * r32: context_t base address + */ +#define SAVE_REGION_REGS \ + add r2=3DCTX(RR0),r32; \ + mov r16=3Drr[r0]; \ + dep.z r18=3D1,61,3; \ + ;; \ + st8 [r2]=3Dr16,8; \ + mov r17=3Drr[r18]; \ + dep.z r18=3D2,61,3; \ + ;; \ + st8 [r2]=3Dr17,8; \ + mov r16=3Drr[r18]; \ + dep.z r18=3D3,61,3; \ + ;; \ + st8 [r2]=3Dr16,8; \ + mov r17=3Drr[r18]; \ + dep.z r18=3D4,61,3; \ + ;; \ + st8 [r2]=3Dr17,8; \ + mov r16=3Drr[r18]; \ + dep.z r18=3D5,61,3; \ + ;; \ + st8 [r2]=3Dr16,8; \ + mov r17=3Drr[r18]; \ + dep.z r18=3D7,61,3; \ + ;; \ + st8 [r2]=3Dr17,16; \ + mov r16=3Drr[r18]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + ;; + + /* + * r33:context_t base address + */ +#define RESTORE_REGION_REGS \ + add r2=3DCTX(RR0),r33;\ + mov r18=3Dr0; \ + ;; \ + ld8 r20=3D[r2],8; \ + ;; /* rr0 */ \ + ld8 r21=3D[r2],8; \ + ;; /* rr1 */ \ + ld8 r22=3D[r2],8; \ + ;; /* rr2 */ \ + ld8 r23=3D[r2],8; \ + ;; /* rr3 */ \ + ld8 r24=3D[r2],8; \ + ;; /* rr4 */ \ + ld8 r25=3D[r2],16; \ + ;; /* rr5 */ \ + ld8 r27=3D[r2]; \ + ;; /* rr7 */ \ + mov rr[r18]=3Dr20; \ + dep.z r18=3D1,61,3; \ + ;; /* rr1 */ \ + mov rr[r18]=3Dr21; \ + dep.z r18=3D2,61,3; \ + ;; /* rr2 */ \ + mov rr[r18]=3Dr22; \ + dep.z r18=3D3,61,3; \ + ;; /* rr3 */ \ + mov rr[r18]=3Dr23; \ + dep.z r18=3D4,61,3; \ + ;; /* rr4 */ \ + mov rr[r18]=3Dr24; \ + dep.z r18=3D5,61,3; \ + ;; /* rr5 */ \ + mov rr[r18]=3Dr25; \ + dep.z r18=3D7,61,3; \ + ;; /* rr7 */ \ + mov rr[r18]=3Dr27; \ + ;; \ + srlz.i; \ + ;; + + + + /* + * r32: context_t base address + * r36~r39:scratch registers + */ +#define SAVE_DEBUG_REGS \ + add r2=3DCTX(IBR0),r32; \ + add r3=3DCTX(DBR0),r32; \ + mov r16=3Dibr[r0]; \ + mov r17=3Ddbr[r0]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + st8 [r3]=3Dr17,8; \ + add r18=3D1,r0; \ + ;; \ + mov r16=3Dibr[r18]; \ + mov r17=3Ddbr[r18]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + st8 [r3]=3Dr17,8; \ + add r18=3D2,r0; \ + ;; \ + mov r16=3Dibr[r18]; \ + mov r17=3Ddbr[r18]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + st8 [r3]=3Dr17,8; \ + add r18=3D2,r0; \ + ;; \ + mov r16=3Dibr[r18]; \ + mov r17=3Ddbr[r18]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + st8 [r3]=3Dr17,8; \ + add r18=3D3,r0; \ + ;; \ + mov r16=3Dibr[r18]; \ + mov r17=3Ddbr[r18]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + st8 [r3]=3Dr17,8; \ + add r18=3D4,r0; \ + ;; \ + mov r16=3Dibr[r18]; \ + mov r17=3Ddbr[r18]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + st8 [r3]=3Dr17,8; \ + add r18=3D5,r0; \ + ;; \ + mov r16=3Dibr[r18]; \ + mov r17=3Ddbr[r18]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + st8 [r3]=3Dr17,8; \ + add r18=3D6,r0; \ + ;; \ + mov r16=3Dibr[r18]; \ + mov r17=3Ddbr[r18]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + st8 [r3]=3Dr17,8; \ + add r18=3D7,r0; \ + ;; \ + mov r16=3Dibr[r18]; \ + mov r17=3Ddbr[r18]; \ + ;; \ + st8 [r2]=3Dr16,8; \ + st8 [r3]=3Dr17,8; \ + ;; + + +/* + * r33: point to context_t structure + * ar.lc are corrupted. + */ +#define RESTORE_DEBUG_REGS \ + add r2=3DCTX(IBR0),r33; \ + add r3=3DCTX(DBR0),r33; \ + mov r16=3D7; \ + mov r17=3Dr0; \ + ;; \ + mov ar.lc =3D r16; \ + ;; \ +1: \ + ld8 r18=3D[r2],8; \ + ld8 r19=3D[r3],8; \ + ;; \ + mov ibr[r17]=3Dr18; \ + mov dbr[r17]=3Dr19; \ + ;; \ + srlz.i; \ + ;; \ + add r17=3D1,r17; \ + br.cloop.sptk 1b; \ + ;; + + + /* + * r32: context_t base address + */ +#define SAVE_FPU_LOW \ + add r2=3DCTX(F2),r32; \ + add r3=3DCTX(F3),r32; \ + ;; \ + stf.spill.nta [r2]=3Df2,32; \ + stf.spill.nta [r3]=3Df3,32; \ + ;; \ + stf.spill.nta [r2]=3Df4,32; \ + stf.spill.nta [r3]=3Df5,32; \ + ;; \ + stf.spill.nta [r2]=3Df6,32; \ + stf.spill.nta [r3]=3Df7,32; \ + ;; \ + stf.spill.nta [r2]=3Df8,32; \ + stf.spill.nta [r3]=3Df9,32; \ + ;; \ + stf.spill.nta [r2]=3Df10,32; \ + stf.spill.nta [r3]=3Df11,32; \ + ;; \ + stf.spill.nta [r2]=3Df12,32; \ + stf.spill.nta [r3]=3Df13,32; \ + ;; \ + stf.spill.nta [r2]=3Df14,32; \ + stf.spill.nta [r3]=3Df15,32; \ + ;; \ + stf.spill.nta [r2]=3Df16,32; \ + stf.spill.nta [r3]=3Df17,32; \ + ;; \ + stf.spill.nta [r2]=3Df18,32; \ + stf.spill.nta [r3]=3Df19,32; \ + ;; \ + stf.spill.nta [r2]=3Df20,32; \ + stf.spill.nta [r3]=3Df21,32; \ + ;; \ + stf.spill.nta [r2]=3Df22,32; \ + stf.spill.nta [r3]=3Df23,32; \ + ;; \ + stf.spill.nta [r2]=3Df24,32; \ + stf.spill.nta [r3]=3Df25,32; \ + ;; \ + stf.spill.nta [r2]=3Df26,32; \ + stf.spill.nta [r3]=3Df27,32; \ + ;; \ + stf.spill.nta [r2]=3Df28,32; \ + stf.spill.nta [r3]=3Df29,32; \ + ;; \ + stf.spill.nta [r2]=3Df30; \ + stf.spill.nta [r3]=3Df31; \ + ;; + + /* + * r32: context_t base address + */ +#define SAVE_FPU_HIGH \ + add r2=3DCTX(F32),r32; \ + add r3=3DCTX(F33),r32; \ + ;; \ + stf.spill.nta [r2]=3Df32,32; \ + stf.spill.nta [r3]=3Df33,32; \ + ;; \ + stf.spill.nta [r2]=3Df34,32; \ + stf.spill.nta [r3]=3Df35,32; \ + ;; \ + stf.spill.nta [r2]=3Df36,32; \ + stf.spill.nta [r3]=3Df37,32; \ + ;; \ + stf.spill.nta [r2]=3Df38,32; \ + stf.spill.nta [r3]=3Df39,32; \ + ;; \ + stf.spill.nta [r2]=3Df40,32; \ + stf.spill.nta [r3]=3Df41,32; \ + ;; \ + stf.spill.nta [r2]=3Df42,32; \ + stf.spill.nta [r3]=3Df43,32; \ + ;; \ + stf.spill.nta [r2]=3Df44,32; \ + stf.spill.nta [r3]=3Df45,32; \ + ;; \ + stf.spill.nta [r2]=3Df46,32; \ + stf.spill.nta [r3]=3Df47,32; \ + ;; \ + stf.spill.nta [r2]=3Df48,32; \ + stf.spill.nta [r3]=3Df49,32; \ + ;; \ + stf.spill.nta [r2]=3Df50,32; \ + stf.spill.nta [r3]=3Df51,32; \ + ;; \ + stf.spill.nta [r2]=3Df52,32; \ + stf.spill.nta [r3]=3Df53,32; \ + ;; \ + stf.spill.nta [r2]=3Df54,32; \ + stf.spill.nta [r3]=3Df55,32; \ + ;; \ + stf.spill.nta [r2]=3Df56,32; \ + stf.spill.nta [r3]=3Df57,32; \ + ;; \ + stf.spill.nta [r2]=3Df58,32; \ + stf.spill.nta [r3]=3Df59,32; \ + ;; \ + stf.spill.nta [r2]=3Df60,32; \ + stf.spill.nta [r3]=3Df61,32; \ + ;; \ + stf.spill.nta [r2]=3Df62,32; \ + stf.spill.nta [r3]=3Df63,32; \ + ;; \ + stf.spill.nta [r2]=3Df64,32; \ + stf.spill.nta [r3]=3Df65,32; \ + ;; \ + stf.spill.nta [r2]=3Df66,32; \ + stf.spill.nta [r3]=3Df67,32; \ + ;; \ + stf.spill.nta [r2]=3Df68,32; \ + stf.spill.nta [r3]=3Df69,32; \ + ;; \ + stf.spill.nta [r2]=3Df70,32; \ + stf.spill.nta [r3]=3Df71,32; \ + ;; \ + stf.spill.nta [r2]=3Df72,32; \ + stf.spill.nta [r3]=3Df73,32; \ + ;; \ + stf.spill.nta [r2]=3Df74,32; \ + stf.spill.nta [r3]=3Df75,32; \ + ;; \ + stf.spill.nta [r2]=3Df76,32; \ + stf.spill.nta [r3]=3Df77,32; \ + ;; \ + stf.spill.nta [r2]=3Df78,32; \ + stf.spill.nta [r3]=3Df79,32; \ + ;; \ + stf.spill.nta [r2]=3Df80,32; \ + stf.spill.nta [r3]=3Df81,32; \ + ;; \ + stf.spill.nta [r2]=3Df82,32; \ + stf.spill.nta [r3]=3Df83,32; \ + ;; \ + stf.spill.nta [r2]=3Df84,32; \ + stf.spill.nta [r3]=3Df85,32; \ + ;; \ + stf.spill.nta [r2]=3Df86,32; \ + stf.spill.nta [r3]=3Df87,32; \ + ;; \ + stf.spill.nta [r2]=3Df88,32; \ + stf.spill.nta [r3]=3Df89,32; \ + ;; \ + stf.spill.nta [r2]=3Df90,32; \ + stf.spill.nta [r3]=3Df91,32; \ + ;; \ + stf.spill.nta [r2]=3Df92,32; \ + stf.spill.nta [r3]=3Df93,32; \ + ;; \ + stf.spill.nta [r2]=3Df94,32; \ + stf.spill.nta [r3]=3Df95,32; \ + ;; \ + stf.spill.nta [r2]=3Df96,32; \ + stf.spill.nta [r3]=3Df97,32; \ + ;; \ + stf.spill.nta [r2]=3Df98,32; \ + stf.spill.nta [r3]=3Df99,32; \ + ;; \ + stf.spill.nta [r2]=3Df100,32; \ + stf.spill.nta [r3]=3Df101,32; \ + ;; \ + stf.spill.nta [r2]=3Df102,32; \ + stf.spill.nta [r3]=3Df103,32; \ + ;; \ + stf.spill.nta [r2]=3Df104,32; \ + stf.spill.nta [r3]=3Df105,32; \ + ;; \ + stf.spill.nta [r2]=3Df106,32; \ + stf.spill.nta [r3]=3Df107,32; \ + ;; \ + stf.spill.nta [r2]=3Df108,32; \ + stf.spill.nta [r3]=3Df109,32; \ + ;; \ + stf.spill.nta [r2]=3Df110,32; \ + stf.spill.nta [r3]=3Df111,32; \ + ;; \ + stf.spill.nta [r2]=3Df112,32; \ + stf.spill.nta [r3]=3Df113,32; \ + ;; \ + stf.spill.nta [r2]=3Df114,32; \ + stf.spill.nta [r3]=3Df115,32; \ + ;; \ + stf.spill.nta [r2]=3Df116,32; \ + stf.spill.nta [r3]=3Df117,32; \ + ;; \ + stf.spill.nta [r2]=3Df118,32; \ + stf.spill.nta [r3]=3Df119,32; \ + ;; \ + stf.spill.nta [r2]=3Df120,32; \ + stf.spill.nta [r3]=3Df121,32; \ + ;; \ + stf.spill.nta [r2]=3Df122,32; \ + stf.spill.nta [r3]=3Df123,32; \ + ;; \ + stf.spill.nta [r2]=3Df124,32; \ + stf.spill.nta [r3]=3Df125,32; \ + ;; \ + stf.spill.nta [r2]=3Df126; \ + stf.spill.nta [r3]=3Df127; \ + ;; + + /* + * r33: point to context_t structure + */ +#define RESTORE_FPU_LOW \ + add r2 =3D CTX(F2), r33; \ + add r3 =3D CTX(F3), r33; \ + ;; \ + ldf.fill.nta f2 =3D [r2], 32; \ + ldf.fill.nta f3 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f4 =3D [r2], 32; \ + ldf.fill.nta f5 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f6 =3D [r2], 32; \ + ldf.fill.nta f7 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f8 =3D [r2], 32; \ + ldf.fill.nta f9 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f10 =3D [r2], 32; \ + ldf.fill.nta f11 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f12 =3D [r2], 32; \ + ldf.fill.nta f13 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f14 =3D [r2], 32; \ + ldf.fill.nta f15 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f16 =3D [r2], 32; \ + ldf.fill.nta f17 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f18 =3D [r2], 32; \ + ldf.fill.nta f19 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f20 =3D [r2], 32; \ + ldf.fill.nta f21 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f22 =3D [r2], 32; \ + ldf.fill.nta f23 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f24 =3D [r2], 32; \ + ldf.fill.nta f25 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f26 =3D [r2], 32; \ + ldf.fill.nta f27 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f28 =3D [r2], 32; \ + ldf.fill.nta f29 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f30 =3D [r2], 32; \ + ldf.fill.nta f31 =3D [r3], 32; \ + ;; + + + + /* + * r33: point to context_t structure + */ +#define RESTORE_FPU_HIGH \ + add r2 =3D CTX(F32), r33; \ + add r3 =3D CTX(F33), r33; \ + ;; \ + ldf.fill.nta f32 =3D [r2], 32; \ + ldf.fill.nta f33 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f34 =3D [r2], 32; \ + ldf.fill.nta f35 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f36 =3D [r2], 32; \ + ldf.fill.nta f37 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f38 =3D [r2], 32; \ + ldf.fill.nta f39 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f40 =3D [r2], 32; \ + ldf.fill.nta f41 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f42 =3D [r2], 32; \ + ldf.fill.nta f43 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f44 =3D [r2], 32; \ + ldf.fill.nta f45 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f46 =3D [r2], 32; \ + ldf.fill.nta f47 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f48 =3D [r2], 32; \ + ldf.fill.nta f49 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f50 =3D [r2], 32; \ + ldf.fill.nta f51 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f52 =3D [r2], 32; \ + ldf.fill.nta f53 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f54 =3D [r2], 32; \ + ldf.fill.nta f55 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f56 =3D [r2], 32; \ + ldf.fill.nta f57 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f58 =3D [r2], 32; \ + ldf.fill.nta f59 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f60 =3D [r2], 32; \ + ldf.fill.nta f61 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f62 =3D [r2], 32; \ + ldf.fill.nta f63 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f64 =3D [r2], 32; \ + ldf.fill.nta f65 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f66 =3D [r2], 32; \ + ldf.fill.nta f67 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f68 =3D [r2], 32; \ + ldf.fill.nta f69 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f70 =3D [r2], 32; \ + ldf.fill.nta f71 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f72 =3D [r2], 32; \ + ldf.fill.nta f73 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f74 =3D [r2], 32; \ + ldf.fill.nta f75 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f76 =3D [r2], 32; \ + ldf.fill.nta f77 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f78 =3D [r2], 32; \ + ldf.fill.nta f79 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f80 =3D [r2], 32; \ + ldf.fill.nta f81 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f82 =3D [r2], 32; \ + ldf.fill.nta f83 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f84 =3D [r2], 32; \ + ldf.fill.nta f85 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f86 =3D [r2], 32; \ + ldf.fill.nta f87 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f88 =3D [r2], 32; \ + ldf.fill.nta f89 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f90 =3D [r2], 32; \ + ldf.fill.nta f91 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f92 =3D [r2], 32; \ + ldf.fill.nta f93 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f94 =3D [r2], 32; \ + ldf.fill.nta f95 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f96 =3D [r2], 32; \ + ldf.fill.nta f97 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f98 =3D [r2], 32; \ + ldf.fill.nta f99 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f100 =3D [r2], 32; \ + ldf.fill.nta f101 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f102 =3D [r2], 32; \ + ldf.fill.nta f103 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f104 =3D [r2], 32; \ + ldf.fill.nta f105 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f106 =3D [r2], 32; \ + ldf.fill.nta f107 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f108 =3D [r2], 32; \ + ldf.fill.nta f109 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f110 =3D [r2], 32; \ + ldf.fill.nta f111 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f112 =3D [r2], 32; \ + ldf.fill.nta f113 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f114 =3D [r2], 32; \ + ldf.fill.nta f115 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f116 =3D [r2], 32; \ + ldf.fill.nta f117 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f118 =3D [r2], 32; \ + ldf.fill.nta f119 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f120 =3D [r2], 32; \ + ldf.fill.nta f121 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f122 =3D [r2], 32; \ + ldf.fill.nta f123 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f124 =3D [r2], 32; \ + ldf.fill.nta f125 =3D [r3], 32; \ + ;; \ + ldf.fill.nta f126 =3D [r2], 32; \ + ldf.fill.nta f127 =3D [r3], 32; \ + ;; + + /* + * r32: context_t base address + */ +#define SAVE_PTK_REGS \ + add r2=3DCTX(PKR0), r32; \ + mov r16=3D7; \ + ;; \ + mov ar.lc=3Dr16; \ + mov r17=3Dr0; \ + ;; \ +1: \ + mov r18=3Dpkr[r17]; \ + ;; \ + srlz.i; \ + ;; \ + st8 [r2]=3Dr18, 8; \ + ;; \ + add r17 =3D1,r17; \ + ;; \ + br.cloop.sptk 1b; \ + ;; + +/* + * r33: point to context_t structure + * ar.lc are corrupted. + */ +#define RESTORE_PTK_REGS \ + add r2=3DCTX(PKR0), r33; \ + mov r16=3D7; \ + ;; \ + mov ar.lc=3Dr16; \ + mov r17=3Dr0; \ + ;; \ +1: \ + ld8 r18=3D[r2], 8; \ + ;; \ + mov pkr[r17]=3Dr18; \ + ;; \ + srlz.i; \ + ;; \ + add r17 =3D1,r17; \ + ;; \ + br.cloop.sptk 1b; \ + ;; + + +/* + * void vmm_trampoline( context_t * from, + * context_t * to) + * + * from: r32 + * to: r33 + * note: interrupt disabled before call this function. + */ +GLOBAL_ENTRY(vmm_trampoline) + mov r16 =3D psr + adds r2 =3D CTX(PSR), r32 + ;; + st8 [r2] =3D r16, 8 // psr + mov r17 =3D pr + ;; + st8 [r2] =3D r17, 8 // pr + mov r18 =3D ar.unat + ;; + st8 [r2] =3D r18 + mov r17 =3D ar.rsc + ;; + adds r2 =3D CTX(RSC),r32 + ;; + st8 [r2]=3D r17 + mov ar.rsc =3D0 + flushrs + ;; + SAVE_GENERAL_REGS + ;; + SAVE_KERNEL_REGS + ;; + SAVE_APP_REGS + ;; + SAVE_BRANCH_REGS + ;; + SAVE_CTL_REGS + ;; + SAVE_REGION_REGS + ;; + //SAVE_DEBUG_REGS + ;; + rsm psr.dfl + ;; + srlz.d + ;; + SAVE_FPU_LOW + ;; + rsm psr.dfh + ;; + srlz.d + ;; + SAVE_FPU_HIGH + ;; + SAVE_PTK_REGS + ;; + RESTORE_PTK_REGS + ;; + RESTORE_FPU_HIGH + ;; + RESTORE_FPU_LOW + ;; + //RESTORE_DEBUG_REGS + ;; + RESTORE_REGION_REGS + ;; + RESTORE_CTL_REGS + ;; + RESTORE_BRANCH_REGS + ;; + RESTORE_APP_REGS + ;; + RESTORE_KERNEL_REGS + ;; + RESTORE_GENERAL_REGS + ;; + adds r2=3DCTX(PSR), r33 + ;; + ld8 r16=3D[r2], 8 // psr + ;; + mov psr.l=3Dr16 + ;; + srlz.d + ;; + ld8 r16=3D[r2], 8 // pr + ;; + mov pr =3Dr16,-1 + ld8 r16=3D[r2] // unat + ;; + mov ar.unat=3Dr16 + ;; + adds r2=3DCTX(RSC),r33 + ;; + ld8 r16 =3D[r2] + ;; + mov ar.rsc =3D r16 + ;; + br.ret.sptk.few b0 +END(vmm_trampoline) + + --=20 1.5.1 |