Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
   1/* Save all processor states
   2 *
   3 * Copyright (c) 2007 Fleming Feng <fleming.feng@intel.com>
   4 * Copyright (c) 2007 Anthony Xu   <anthony.xu@intel.com>
   5 */
   6
   7#include <asm/asmmacro.h>
   8#include "asm-offsets.h"
   9
  10
  11#define CTX(name)    VMM_CTX_##name##_OFFSET
  12
  13	/*
  14	 *	r32:		context_t base address
  15	 */
  16#define	SAVE_BRANCH_REGS			\
  17	add	r2 = CTX(B0),r32;		\
  18	add	r3 = CTX(B1),r32;		\
  19	mov	r16 = b0;			\
  20	mov	r17 = b1;			\
  21	;;					\
  22	st8	[r2]=r16,16;			\
  23	st8	[r3]=r17,16;			\
  24	;;					\
  25	mov	r16 = b2;			\
  26	mov	r17 = b3;			\
  27	;;					\
  28	st8	[r2]=r16,16;			\
  29	st8	[r3]=r17,16;			\
  30	;;					\
  31	mov	r16 = b4;			\
  32	mov	r17 = b5;			\
  33	;;					\
  34	st8	[r2]=r16;   			\
  35	st8	[r3]=r17;   			\
  36	;;
  37
  38	/*
  39	 *	r33:		context_t base address
  40	 */
  41#define	RESTORE_BRANCH_REGS			\
  42	add	r2 = CTX(B0),r33;		\
  43	add	r3 = CTX(B1),r33;		\
  44	;;					\
  45	ld8	r16=[r2],16;			\
  46	ld8	r17=[r3],16;			\
  47	;;					\
  48	mov	b0 = r16;			\
  49	mov	b1 = r17;			\
  50	;;					\
  51	ld8	r16=[r2],16;			\
  52	ld8	r17=[r3],16;			\
  53	;;					\
  54	mov	b2 = r16;			\
  55	mov	b3 = r17;			\
  56	;;					\
  57	ld8	r16=[r2];   			\
  58	ld8	r17=[r3];   			\
  59	;;					\
  60	mov	b4=r16;				\
  61	mov	b5=r17;				\
  62	;;
  63
  64
  65	/*
  66	 *	r32: context_t base address
  67	 *	bsw == 1
  68	 *	Save all bank1 general registers, r4 ~ r7
  69	 */
  70#define	SAVE_GENERAL_REGS			\
  71	add	r2=CTX(R4),r32;			\
  72	add	r3=CTX(R5),r32;			\
  73	;;					\
  74.mem.offset 0,0;        			\
  75	st8.spill	[r2]=r4,16;		\
  76.mem.offset 8,0;        			\
  77	st8.spill	[r3]=r5,16;		\
  78	;;					\
  79.mem.offset 0,0;        			\
  80	st8.spill	[r2]=r6,48;		\
  81.mem.offset 8,0;        			\
  82	st8.spill	[r3]=r7,48;		\
  83	;;                          		\
  84.mem.offset 0,0;        			\
  85    st8.spill    [r2]=r12;			\
  86.mem.offset 8,0;				\
  87    st8.spill    [r3]=r13;			\
  88    ;;
  89
  90	/*
  91	 *	r33: context_t base address
  92	 *	bsw == 1
  93	 */
  94#define	RESTORE_GENERAL_REGS			\
  95	add	r2=CTX(R4),r33;			\
  96	add	r3=CTX(R5),r33;			\
  97	;;					\
  98	ld8.fill	r4=[r2],16;		\
  99	ld8.fill	r5=[r3],16;		\
 100	;;					\
 101	ld8.fill	r6=[r2],48;		\
 102	ld8.fill	r7=[r3],48;		\
 103	;;					\
 104	ld8.fill    r12=[r2];			\
 105	ld8.fill    r13 =[r3];			\
 106	;;
 107
 108
 109
 110
 111	/*
 112	 *	r32:		context_t base address
 113	 */
 114#define	SAVE_KERNEL_REGS			\
 115	add	r2 = CTX(KR0),r32;		\
 116	add	r3 = CTX(KR1),r32;		\
 117	mov	r16 = ar.k0;			\
 118	mov	r17 = ar.k1;			\
 119	;;		        		\
 120	st8	[r2] = r16,16;			\
 121	st8	[r3] = r17,16;			\
 122	;;		        		\
 123	mov	r16 = ar.k2;			\
 124	mov	r17 = ar.k3;			\
 125	;;		        		\
 126	st8	[r2] = r16,16;			\
 127	st8	[r3] = r17,16;			\
 128	;;					\
 129	mov	r16 = ar.k4;			\
 130	mov	r17 = ar.k5;			\
 131	;;				    	\
 132	st8	[r2] = r16,16;			\
 133	st8	[r3] = r17,16;			\
 134	;;					\
 135	mov	r16 = ar.k6;			\
 136	mov	r17 = ar.k7;			\
 137	;;		    			\
 138	st8	[r2] = r16;     		\
 139	st8	[r3] = r17;			\
 140	;;
 141
 142
 143
 144	/*
 145	 *	r33:		context_t base address
 146	 */
 147#define	RESTORE_KERNEL_REGS			\
 148	add	r2 = CTX(KR0),r33;		\
 149	add	r3 = CTX(KR1),r33;		\
 150	;;		    			\
 151	ld8	r16=[r2],16;     		\
 152	ld8	r17=[r3],16;			\
 153	;;					\
 154	mov	ar.k0=r16;  			\
 155	mov	ar.k1=r17;	    		\
 156	;;		        		\
 157	ld8	r16=[r2],16;			\
 158	ld8	r17=[r3],16;			\
 159	;;		        		\
 160	mov	ar.k2=r16;   			\
 161	mov	ar.k3=r17;	    		\
 162	;;		        		\
 163	ld8	r16=[r2],16;			\
 164	ld8	r17=[r3],16;			\
 165	;;					\
 166	mov	ar.k4=r16;			\
 167	mov	ar.k5=r17;	    		\
 168	;;				    	\
 169	ld8	r16=[r2],16;			\
 170	ld8	r17=[r3],16;			\
 171	;;					\
 172	mov	ar.k6=r16;  			\
 173	mov	ar.k7=r17;	    		\
 174	;;
 175
 176
 177
 178	/*
 179	 *	r32:		context_t base address
 180	 */
 181#define	SAVE_APP_REGS				\
 182	add  r2 = CTX(BSPSTORE),r32;		\
 183	mov  r16 = ar.bspstore;			\
 184	;;					\
 185	st8  [r2] = r16,CTX(RNAT)-CTX(BSPSTORE);\
 186	mov  r16 = ar.rnat;			\
 187	;;					\
 188	st8  [r2] = r16,CTX(FCR)-CTX(RNAT);	\
 189	mov  r16 = ar.fcr;			\
 190	;;					\
 191	st8  [r2] = r16,CTX(EFLAG)-CTX(FCR);	\
 192	mov  r16 = ar.eflag;			\
 193	;;					\
 194	st8  [r2] = r16,CTX(CFLG)-CTX(EFLAG);	\
 195	mov  r16 = ar.cflg;			\
 196	;;					\
 197	st8  [r2] = r16,CTX(FSR)-CTX(CFLG);	\
 198	mov  r16 = ar.fsr;			\
 199	;;					\
 200	st8  [r2] = r16,CTX(FIR)-CTX(FSR);	\
 201	mov  r16 = ar.fir;			\
 202	;;					\
 203	st8  [r2] = r16,CTX(FDR)-CTX(FIR);	\
 204	mov  r16 = ar.fdr;			\
 205	;;					\
 206	st8  [r2] = r16,CTX(UNAT)-CTX(FDR);	\
 207	mov  r16 = ar.unat;			\
 208	;;					\
 209	st8  [r2] = r16,CTX(FPSR)-CTX(UNAT);	\
 210	mov  r16 = ar.fpsr;			\
 211	;;					\
 212	st8  [r2] = r16,CTX(PFS)-CTX(FPSR);	\
 213	mov  r16 = ar.pfs;			\
 214	;;					\
 215	st8  [r2] = r16,CTX(LC)-CTX(PFS);	\
 216	mov  r16 = ar.lc;			\
 217	;;					\
 218	st8  [r2] = r16;			\
 219	;;
 220
 221	/*
 222	 *	r33:		context_t base address
 223	 */
 224#define	RESTORE_APP_REGS			\
 225	add  r2=CTX(BSPSTORE),r33;		\
 226	;;					\
 227	ld8  r16=[r2],CTX(RNAT)-CTX(BSPSTORE);	\
 228	;;					\
 229	mov  ar.bspstore=r16;			\
 230	ld8  r16=[r2],CTX(FCR)-CTX(RNAT);	\
 231	;;					\
 232	mov  ar.rnat=r16;			\
 233	ld8  r16=[r2],CTX(EFLAG)-CTX(FCR);	\
 234	;;					\
 235	mov  ar.fcr=r16;			\
 236	ld8  r16=[r2],CTX(CFLG)-CTX(EFLAG);	\
 237	;;					\
 238	mov  ar.eflag=r16;			\
 239	ld8  r16=[r2],CTX(FSR)-CTX(CFLG);	\
 240	;;					\
 241	mov  ar.cflg=r16;			\
 242	ld8  r16=[r2],CTX(FIR)-CTX(FSR);	\
 243	;;					\
 244	mov  ar.fsr=r16;			\
 245	ld8  r16=[r2],CTX(FDR)-CTX(FIR);	\
 246	;;					\
 247	mov  ar.fir=r16;			\
 248	ld8  r16=[r2],CTX(UNAT)-CTX(FDR);	\
 249	;;					\
 250	mov  ar.fdr=r16;			\
 251	ld8  r16=[r2],CTX(FPSR)-CTX(UNAT);	\
 252	;;					\
 253	mov  ar.unat=r16;			\
 254	ld8  r16=[r2],CTX(PFS)-CTX(FPSR);	\
 255	;;					\
 256	mov  ar.fpsr=r16;			\
 257	ld8  r16=[r2],CTX(LC)-CTX(PFS);		\
 258	;;					\
 259	mov  ar.pfs=r16;			\
 260	ld8  r16=[r2];				\
 261	;;					\
 262	mov  ar.lc=r16;				\
 263	;;
 264
 265	/*
 266	 *	r32:		context_t base address
 267	 */
 268#define	SAVE_CTL_REGS				\
 269	add	r2 = CTX(DCR),r32;		\
 270	mov	r16 = cr.dcr;			\
 271	;;					\
 272	st8	[r2] = r16,CTX(IVA)-CTX(DCR);	\
 273	;;                          		\
 274	mov	r16 = cr.iva;			\
 275	;;					\
 276	st8	[r2] = r16,CTX(PTA)-CTX(IVA);	\
 277	;;					\
 278	mov r16 = cr.pta;			\
 279	;;					\
 280	st8 [r2] = r16 ;			\
 281	;;
 282
 283	/*
 284	 *	r33:		context_t base address
 285	 */
 286#define	RESTORE_CTL_REGS				\
 287	add	r2 = CTX(DCR),r33;	        	\
 288	;;						\
 289	ld8	r16 = [r2],CTX(IVA)-CTX(DCR);		\
 290	;;                      			\
 291	mov	cr.dcr = r16;				\
 292	dv_serialize_data;				\
 293	;;						\
 294	ld8	r16 = [r2],CTX(PTA)-CTX(IVA);		\
 295	;;						\
 296	mov	cr.iva = r16;				\
 297	dv_serialize_data;				\
 298	;;						\
 299	ld8 r16 = [r2];					\
 300	;;						\
 301	mov cr.pta = r16;				\
 302	dv_serialize_data;				\
 303	;;
 304
 305
 306	/*
 307	 *	r32:		context_t base address
 308	 */
 309#define	SAVE_REGION_REGS			\
 310	add	r2=CTX(RR0),r32;		\
 311	mov	r16=rr[r0];			\
 312	dep.z	r18=1,61,3;			\
 313	;;					\
 314	st8	[r2]=r16,8;			\
 315	mov	r17=rr[r18];			\
 316	dep.z	r18=2,61,3;			\
 317	;;					\
 318	st8	[r2]=r17,8;			\
 319	mov	r16=rr[r18];			\
 320	dep.z	r18=3,61,3;			\
 321	;;					\
 322	st8	[r2]=r16,8;			\
 323	mov	r17=rr[r18];			\
 324	dep.z	r18=4,61,3;			\
 325	;;					\
 326	st8	[r2]=r17,8;			\
 327	mov	r16=rr[r18];			\
 328	dep.z	r18=5,61,3;			\
 329	;;					\
 330	st8	[r2]=r16,8;			\
 331	mov	r17=rr[r18];			\
 332	dep.z	r18=7,61,3;			\
 333	;;					\
 334	st8	[r2]=r17,16;			\
 335	mov	r16=rr[r18];			\
 336	;;					\
 337	st8	[r2]=r16,8;			\
 338	;;
 339
 340	/*
 341	 *	r33:context_t base address
 342	 */
 343#define	RESTORE_REGION_REGS	\
 344	add	r2=CTX(RR0),r33;\
 345	mov r18=r0;		\
 346	;;			\
 347	ld8	r20=[r2],8;	\
 348	;;	/* rr0 */	\
 349	ld8	r21=[r2],8;	\
 350	;;	/* rr1 */	\
 351	ld8	r22=[r2],8;	\
 352	;;	/* rr2 */	\
 353	ld8	r23=[r2],8;	\
 354	;;	/* rr3 */	\
 355	ld8	r24=[r2],8;	\
 356	;;	/* rr4 */	\
 357	ld8	r25=[r2],16;	\
 358	;;	/* rr5 */	\
 359	ld8	r27=[r2];	\
 360	;;	/* rr7 */	\
 361	mov rr[r18]=r20;	\
 362	dep.z	r18=1,61,3;	\
 363	;;  /* rr1 */		\
 364	mov rr[r18]=r21;	\
 365	dep.z	r18=2,61,3;	\
 366	;;  /* rr2 */		\
 367	mov rr[r18]=r22;	\
 368	dep.z	r18=3,61,3;	\
 369	;;  /* rr3 */		\
 370	mov rr[r18]=r23;	\
 371	dep.z	r18=4,61,3;	\
 372	;;  /* rr4 */		\
 373	mov rr[r18]=r24;	\
 374	dep.z	r18=5,61,3;	\
 375	;;  /* rr5 */		\
 376	mov rr[r18]=r25;	\
 377	dep.z	r18=7,61,3;	\
 378	;;  /* rr7 */		\
 379	mov rr[r18]=r27;	\
 380	;;			\
 381	srlz.i;			\
 382	;;
 383
 384
 385
 386	/*
 387	 *	r32:	context_t base address
 388	 *	r36~r39:scratch registers
 389	 */
 390#define	SAVE_DEBUG_REGS				\
 391	add	r2=CTX(IBR0),r32;		\
 392	add	r3=CTX(DBR0),r32;		\
 393	mov	r16=ibr[r0];			\
 394	mov	r17=dbr[r0];			\
 395	;;					\
 396	st8	[r2]=r16,8; 			\
 397	st8	[r3]=r17,8;	    		\
 398	add	r18=1,r0;		    	\
 399	;;					\
 400	mov	r16=ibr[r18];			\
 401	mov	r17=dbr[r18];			\
 402	;;					\
 403	st8	[r2]=r16,8;		    	\
 404	st8	[r3]=r17,8;			\
 405	add	r18=2,r0;			\
 406	;;					\
 407	mov	r16=ibr[r18];			\
 408	mov	r17=dbr[r18];			\
 409	;;					\
 410	st8	[r2]=r16,8;		    	\
 411	st8	[r3]=r17,8;			\
 412	add	r18=2,r0;			\
 413	;;					\
 414	mov	r16=ibr[r18];			\
 415	mov	r17=dbr[r18];			\
 416	;;					\
 417	st8	[r2]=r16,8;		    	\
 418	st8	[r3]=r17,8;			\
 419	add	r18=3,r0;			\
 420	;;					\
 421	mov	r16=ibr[r18];			\
 422	mov	r17=dbr[r18];			\
 423	;;					\
 424	st8	[r2]=r16,8;		    	\
 425	st8	[r3]=r17,8;			\
 426	add	r18=4,r0;			\
 427	;;					\
 428	mov	r16=ibr[r18];			\
 429	mov	r17=dbr[r18];			\
 430	;;					\
 431	st8	[r2]=r16,8;		    	\
 432	st8	[r3]=r17,8;			\
 433	add	r18=5,r0;			\
 434	;;					\
 435	mov	r16=ibr[r18];			\
 436	mov	r17=dbr[r18];			\
 437	;;					\
 438	st8	[r2]=r16,8;		    	\
 439	st8	[r3]=r17,8;			\
 440	add	r18=6,r0;			\
 441	;;					\
 442	mov	r16=ibr[r18];			\
 443	mov	r17=dbr[r18];			\
 444	;;					\
 445	st8	[r2]=r16,8;		    	\
 446	st8	[r3]=r17,8;			\
 447	add	r18=7,r0;			\
 448	;;					\
 449	mov	r16=ibr[r18];			\
 450	mov	r17=dbr[r18];			\
 451	;;					\
 452	st8	[r2]=r16,8;		    	\
 453	st8	[r3]=r17,8;			\
 454	;;
 455
 456
 457/*
 458 *      r33:    point to context_t structure
 459 *      ar.lc are corrupted.
 460 */
 461#define RESTORE_DEBUG_REGS			\
 462	add	r2=CTX(IBR0),r33;		\
 463	add	r3=CTX(DBR0),r33;		\
 464	mov r16=7;    				\
 465	mov r17=r0;				\
 466	;;                    			\
 467	mov ar.lc = r16;			\
 468	;; 					\
 4691:						\
 470	ld8 r18=[r2],8;		    		\
 471	ld8 r19=[r3],8;				\
 472	;;					\
 473	mov ibr[r17]=r18;			\
 474	mov dbr[r17]=r19;			\
 475	;;   					\
 476	srlz.i;					\
 477	;; 					\
 478	add r17=1,r17;				\
 479	br.cloop.sptk 1b;			\
 480	;;
 481
 482
 483	/*
 484	 *	r32:		context_t base address
 485	 */
 486#define	SAVE_FPU_LOW				\
 487	add	r2=CTX(F2),r32;			\
 488	add	r3=CTX(F3),r32;			\
 489	;;					\
 490	stf.spill.nta	[r2]=f2,32;		\
 491	stf.spill.nta	[r3]=f3,32;		\
 492	;;					\
 493	stf.spill.nta	[r2]=f4,32;		\
 494	stf.spill.nta	[r3]=f5,32;		\
 495	;;					\
 496	stf.spill.nta	[r2]=f6,32;		\
 497	stf.spill.nta	[r3]=f7,32;		\
 498	;;					\
 499	stf.spill.nta	[r2]=f8,32;		\
 500	stf.spill.nta	[r3]=f9,32;		\
 501	;;					\
 502	stf.spill.nta	[r2]=f10,32;		\
 503	stf.spill.nta	[r3]=f11,32;		\
 504	;;					\
 505	stf.spill.nta	[r2]=f12,32;		\
 506	stf.spill.nta	[r3]=f13,32;		\
 507	;;					\
 508	stf.spill.nta	[r2]=f14,32;		\
 509	stf.spill.nta	[r3]=f15,32;		\
 510	;;					\
 511	stf.spill.nta	[r2]=f16,32;		\
 512	stf.spill.nta	[r3]=f17,32;		\
 513	;;					\
 514	stf.spill.nta	[r2]=f18,32;		\
 515	stf.spill.nta	[r3]=f19,32;		\
 516	;;					\
 517	stf.spill.nta	[r2]=f20,32;		\
 518	stf.spill.nta	[r3]=f21,32;		\
 519	;;					\
 520	stf.spill.nta	[r2]=f22,32;		\
 521	stf.spill.nta	[r3]=f23,32;		\
 522	;;					\
 523	stf.spill.nta	[r2]=f24,32;		\
 524	stf.spill.nta	[r3]=f25,32;		\
 525	;;					\
 526	stf.spill.nta	[r2]=f26,32;		\
 527	stf.spill.nta	[r3]=f27,32;		\
 528	;;					\
 529	stf.spill.nta	[r2]=f28,32;		\
 530	stf.spill.nta	[r3]=f29,32;		\
 531	;;					\
 532	stf.spill.nta	[r2]=f30;		\
 533	stf.spill.nta	[r3]=f31;		\
 534	;;
 535
 536	/*
 537	 *	r32:		context_t base address
 538	 */
 539#define	SAVE_FPU_HIGH				\
 540	add	r2=CTX(F32),r32;		\
 541	add	r3=CTX(F33),r32;		\
 542	;;					\
 543	stf.spill.nta	[r2]=f32,32;		\
 544	stf.spill.nta	[r3]=f33,32;		\
 545	;;					\
 546	stf.spill.nta	[r2]=f34,32;		\
 547	stf.spill.nta	[r3]=f35,32;		\
 548	;;					\
 549	stf.spill.nta	[r2]=f36,32;		\
 550	stf.spill.nta	[r3]=f37,32;		\
 551	;;					\
 552	stf.spill.nta	[r2]=f38,32;		\
 553	stf.spill.nta	[r3]=f39,32;		\
 554	;;					\
 555	stf.spill.nta	[r2]=f40,32;		\
 556	stf.spill.nta	[r3]=f41,32;		\
 557	;;					\
 558	stf.spill.nta	[r2]=f42,32;		\
 559	stf.spill.nta	[r3]=f43,32;		\
 560	;;					\
 561	stf.spill.nta	[r2]=f44,32;		\
 562	stf.spill.nta	[r3]=f45,32;		\
 563	;;					\
 564	stf.spill.nta	[r2]=f46,32;		\
 565	stf.spill.nta	[r3]=f47,32;		\
 566	;;					\
 567	stf.spill.nta	[r2]=f48,32;		\
 568	stf.spill.nta	[r3]=f49,32;		\
 569	;;					\
 570	stf.spill.nta	[r2]=f50,32;		\
 571	stf.spill.nta	[r3]=f51,32;		\
 572	;;					\
 573	stf.spill.nta	[r2]=f52,32;		\
 574	stf.spill.nta	[r3]=f53,32;		\
 575	;;					\
 576	stf.spill.nta	[r2]=f54,32;		\
 577	stf.spill.nta	[r3]=f55,32;		\
 578	;;					\
 579	stf.spill.nta	[r2]=f56,32;		\
 580	stf.spill.nta	[r3]=f57,32;		\
 581	;;					\
 582	stf.spill.nta	[r2]=f58,32;		\
 583	stf.spill.nta	[r3]=f59,32;		\
 584	;;					\
 585	stf.spill.nta	[r2]=f60,32;		\
 586	stf.spill.nta	[r3]=f61,32;		\
 587	;;					\
 588	stf.spill.nta	[r2]=f62,32;		\
 589	stf.spill.nta	[r3]=f63,32;		\
 590	;;					\
 591	stf.spill.nta	[r2]=f64,32;		\
 592	stf.spill.nta	[r3]=f65,32;		\
 593	;;					\
 594	stf.spill.nta	[r2]=f66,32;		\
 595	stf.spill.nta	[r3]=f67,32;		\
 596	;;					\
 597	stf.spill.nta	[r2]=f68,32;		\
 598	stf.spill.nta	[r3]=f69,32;		\
 599	;;					\
 600	stf.spill.nta	[r2]=f70,32;		\
 601	stf.spill.nta	[r3]=f71,32;		\
 602	;;					\
 603	stf.spill.nta	[r2]=f72,32;		\
 604	stf.spill.nta	[r3]=f73,32;		\
 605	;;					\
 606	stf.spill.nta	[r2]=f74,32;		\
 607	stf.spill.nta	[r3]=f75,32;		\
 608	;;					\
 609	stf.spill.nta	[r2]=f76,32;		\
 610	stf.spill.nta	[r3]=f77,32;		\
 611	;;					\
 612	stf.spill.nta	[r2]=f78,32;		\
 613	stf.spill.nta	[r3]=f79,32;		\
 614	;;					\
 615	stf.spill.nta	[r2]=f80,32;		\
 616	stf.spill.nta	[r3]=f81,32;		\
 617	;;					\
 618	stf.spill.nta	[r2]=f82,32;		\
 619	stf.spill.nta	[r3]=f83,32;		\
 620	;;					\
 621	stf.spill.nta	[r2]=f84,32;		\
 622	stf.spill.nta	[r3]=f85,32;		\
 623	;;					\
 624	stf.spill.nta	[r2]=f86,32;		\
 625	stf.spill.nta	[r3]=f87,32;		\
 626	;;					\
 627	stf.spill.nta	[r2]=f88,32;		\
 628	stf.spill.nta	[r3]=f89,32;		\
 629	;;					\
 630	stf.spill.nta	[r2]=f90,32;		\
 631	stf.spill.nta	[r3]=f91,32;		\
 632	;;					\
 633	stf.spill.nta	[r2]=f92,32;		\
 634	stf.spill.nta	[r3]=f93,32;		\
 635	;;					\
 636	stf.spill.nta	[r2]=f94,32;		\
 637	stf.spill.nta	[r3]=f95,32;		\
 638	;;					\
 639	stf.spill.nta	[r2]=f96,32;		\
 640	stf.spill.nta	[r3]=f97,32;		\
 641	;;					\
 642	stf.spill.nta	[r2]=f98,32;		\
 643	stf.spill.nta	[r3]=f99,32;		\
 644	;;					\
 645	stf.spill.nta	[r2]=f100,32;		\
 646	stf.spill.nta	[r3]=f101,32;		\
 647	;;					\
 648	stf.spill.nta	[r2]=f102,32;		\
 649	stf.spill.nta	[r3]=f103,32;		\
 650	;;					\
 651	stf.spill.nta	[r2]=f104,32;		\
 652	stf.spill.nta	[r3]=f105,32;		\
 653	;;					\
 654	stf.spill.nta	[r2]=f106,32;		\
 655	stf.spill.nta	[r3]=f107,32;		\
 656	;;					\
 657	stf.spill.nta	[r2]=f108,32;		\
 658	stf.spill.nta	[r3]=f109,32;		\
 659	;;					\
 660	stf.spill.nta	[r2]=f110,32;		\
 661	stf.spill.nta	[r3]=f111,32;		\
 662	;;					\
 663	stf.spill.nta	[r2]=f112,32;		\
 664	stf.spill.nta	[r3]=f113,32;		\
 665	;;					\
 666	stf.spill.nta	[r2]=f114,32;		\
 667	stf.spill.nta	[r3]=f115,32;		\
 668	;;					\
 669	stf.spill.nta	[r2]=f116,32;		\
 670	stf.spill.nta	[r3]=f117,32;		\
 671	;;					\
 672	stf.spill.nta	[r2]=f118,32;		\
 673	stf.spill.nta	[r3]=f119,32;		\
 674	;;					\
 675	stf.spill.nta	[r2]=f120,32;		\
 676	stf.spill.nta	[r3]=f121,32;		\
 677	;;					\
 678	stf.spill.nta	[r2]=f122,32;		\
 679	stf.spill.nta	[r3]=f123,32;		\
 680	;;					\
 681	stf.spill.nta	[r2]=f124,32;		\
 682	stf.spill.nta	[r3]=f125,32;		\
 683	;;					\
 684	stf.spill.nta	[r2]=f126;		\
 685	stf.spill.nta	[r3]=f127;		\
 686	;;
 687
 688     /*
 689      *      r33:    point to context_t structure
 690      */
 691#define	RESTORE_FPU_LOW				\
 692    add     r2 = CTX(F2), r33;			\
 693    add     r3 = CTX(F3), r33;			\
 694    ;;						\
 695    ldf.fill.nta f2 = [r2], 32;			\
 696    ldf.fill.nta f3 = [r3], 32;			\
 697    ;;						\
 698    ldf.fill.nta f4 = [r2], 32;			\
 699    ldf.fill.nta f5 = [r3], 32;			\
 700    ;;						\
 701    ldf.fill.nta f6 = [r2], 32;			\
 702    ldf.fill.nta f7 = [r3], 32;			\
 703    ;;						\
 704    ldf.fill.nta f8 = [r2], 32;			\
 705    ldf.fill.nta f9 = [r3], 32;			\
 706    ;;						\
 707    ldf.fill.nta f10 = [r2], 32;		\
 708    ldf.fill.nta f11 = [r3], 32;		\
 709    ;;						\
 710    ldf.fill.nta f12 = [r2], 32;		\
 711    ldf.fill.nta f13 = [r3], 32;		\
 712    ;;						\
 713    ldf.fill.nta f14 = [r2], 32;		\
 714    ldf.fill.nta f15 = [r3], 32;		\
 715    ;;						\
 716    ldf.fill.nta f16 = [r2], 32;		\
 717    ldf.fill.nta f17 = [r3], 32;		\
 718    ;;						\
 719    ldf.fill.nta f18 = [r2], 32;		\
 720    ldf.fill.nta f19 = [r3], 32;		\
 721    ;;						\
 722    ldf.fill.nta f20 = [r2], 32;		\
 723    ldf.fill.nta f21 = [r3], 32;		\
 724    ;;						\
 725    ldf.fill.nta f22 = [r2], 32;		\
 726    ldf.fill.nta f23 = [r3], 32;		\
 727    ;;						\
 728    ldf.fill.nta f24 = [r2], 32;		\
 729    ldf.fill.nta f25 = [r3], 32;		\
 730    ;;						\
 731    ldf.fill.nta f26 = [r2], 32;		\
 732    ldf.fill.nta f27 = [r3], 32;		\
 733	;;					\
 734    ldf.fill.nta f28 = [r2], 32;		\
 735    ldf.fill.nta f29 = [r3], 32;		\
 736    ;;						\
 737    ldf.fill.nta f30 = [r2], 32;		\
 738    ldf.fill.nta f31 = [r3], 32;		\
 739    ;;
 740
 741
 742
 743    /*
 744     *      r33:    point to context_t structure
 745     */
 746#define	RESTORE_FPU_HIGH			\
 747    add     r2 = CTX(F32), r33;			\
 748    add     r3 = CTX(F33), r33;			\
 749    ;;						\
 750    ldf.fill.nta f32 = [r2], 32;		\
 751    ldf.fill.nta f33 = [r3], 32;		\
 752    ;;						\
 753    ldf.fill.nta f34 = [r2], 32;		\
 754    ldf.fill.nta f35 = [r3], 32;		\
 755    ;;						\
 756    ldf.fill.nta f36 = [r2], 32;		\
 757    ldf.fill.nta f37 = [r3], 32;		\
 758    ;;						\
 759    ldf.fill.nta f38 = [r2], 32;		\
 760    ldf.fill.nta f39 = [r3], 32;		\
 761    ;;						\
 762    ldf.fill.nta f40 = [r2], 32;		\
 763    ldf.fill.nta f41 = [r3], 32;		\
 764    ;;						\
 765    ldf.fill.nta f42 = [r2], 32;		\
 766    ldf.fill.nta f43 = [r3], 32;		\
 767    ;;						\
 768    ldf.fill.nta f44 = [r2], 32;		\
 769    ldf.fill.nta f45 = [r3], 32;		\
 770    ;;						\
 771    ldf.fill.nta f46 = [r2], 32;		\
 772    ldf.fill.nta f47 = [r3], 32;		\
 773    ;;						\
 774    ldf.fill.nta f48 = [r2], 32;		\
 775    ldf.fill.nta f49 = [r3], 32;		\
 776    ;;						\
 777    ldf.fill.nta f50 = [r2], 32;		\
 778    ldf.fill.nta f51 = [r3], 32;		\
 779    ;;						\
 780    ldf.fill.nta f52 = [r2], 32;		\
 781    ldf.fill.nta f53 = [r3], 32;		\
 782    ;;						\
 783    ldf.fill.nta f54 = [r2], 32;		\
 784    ldf.fill.nta f55 = [r3], 32;		\
 785    ;;						\
 786    ldf.fill.nta f56 = [r2], 32;		\
 787    ldf.fill.nta f57 = [r3], 32;   		\
 788    ;;						\
 789    ldf.fill.nta f58 = [r2], 32;		\
 790    ldf.fill.nta f59 = [r3], 32;		\
 791    ;;						\
 792    ldf.fill.nta f60 = [r2], 32;		\
 793    ldf.fill.nta f61 = [r3], 32;		\
 794    ;;						\
 795    ldf.fill.nta f62 = [r2], 32;		\
 796    ldf.fill.nta f63 = [r3], 32;		\
 797    ;;						\
 798    ldf.fill.nta f64 = [r2], 32;		\
 799    ldf.fill.nta f65 = [r3], 32;		\
 800    ;;						\
 801    ldf.fill.nta f66 = [r2], 32;		\
 802    ldf.fill.nta f67 = [r3], 32;		\
 803    ;;						\
 804    ldf.fill.nta f68 = [r2], 32;		\
 805    ldf.fill.nta f69 = [r3], 32;		\
 806    ;;						\
 807    ldf.fill.nta f70 = [r2], 32;		\
 808    ldf.fill.nta f71 = [r3], 32;		\
 809    ;;						\
 810    ldf.fill.nta f72 = [r2], 32;		\
 811    ldf.fill.nta f73 = [r3], 32;		\
 812    ;;						\
 813    ldf.fill.nta f74 = [r2], 32;		\
 814    ldf.fill.nta f75 = [r3], 32;		\
 815    ;;						\
 816    ldf.fill.nta f76 = [r2], 32;		\
 817    ldf.fill.nta f77 = [r3], 32;		\
 818    ;;						\
 819    ldf.fill.nta f78 = [r2], 32;		\
 820    ldf.fill.nta f79 = [r3], 32;		\
 821    ;;						\
 822    ldf.fill.nta f80 = [r2], 32;		\
 823    ldf.fill.nta f81 = [r3], 32;		\
 824    ;;						\
 825    ldf.fill.nta f82 = [r2], 32;		\
 826    ldf.fill.nta f83 = [r3], 32;		\
 827    ;;						\
 828    ldf.fill.nta f84 = [r2], 32;		\
 829    ldf.fill.nta f85 = [r3], 32;		\
 830    ;;						\
 831    ldf.fill.nta f86 = [r2], 32;		\
 832    ldf.fill.nta f87 = [r3], 32;		\
 833    ;;						\
 834    ldf.fill.nta f88 = [r2], 32;		\
 835    ldf.fill.nta f89 = [r3], 32;		\
 836    ;;						\
 837    ldf.fill.nta f90 = [r2], 32;		\
 838    ldf.fill.nta f91 = [r3], 32;		\
 839    ;;						\
 840    ldf.fill.nta f92 = [r2], 32;		\
 841    ldf.fill.nta f93 = [r3], 32;		\
 842    ;;						\
 843    ldf.fill.nta f94 = [r2], 32;		\
 844    ldf.fill.nta f95 = [r3], 32;		\
 845    ;;						\
 846    ldf.fill.nta f96 = [r2], 32;		\
 847    ldf.fill.nta f97 = [r3], 32;		\
 848    ;;						\
 849    ldf.fill.nta f98 = [r2], 32;		\
 850    ldf.fill.nta f99 = [r3], 32;		\
 851    ;;						\
 852    ldf.fill.nta f100 = [r2], 32;		\
 853    ldf.fill.nta f101 = [r3], 32;		\
 854    ;;						\
 855    ldf.fill.nta f102 = [r2], 32;		\
 856    ldf.fill.nta f103 = [r3], 32;		\
 857    ;;						\
 858    ldf.fill.nta f104 = [r2], 32;		\
 859    ldf.fill.nta f105 = [r3], 32;		\
 860    ;;						\
 861    ldf.fill.nta f106 = [r2], 32;		\
 862    ldf.fill.nta f107 = [r3], 32;		\
 863    ;;						\
 864    ldf.fill.nta f108 = [r2], 32;		\
 865    ldf.fill.nta f109 = [r3], 32;   		\
 866    ;;						\
 867    ldf.fill.nta f110 = [r2], 32;		\
 868    ldf.fill.nta f111 = [r3], 32;		\
 869    ;;						\
 870    ldf.fill.nta f112 = [r2], 32;		\
 871    ldf.fill.nta f113 = [r3], 32;		\
 872    ;;						\
 873    ldf.fill.nta f114 = [r2], 32;		\
 874    ldf.fill.nta f115 = [r3], 32;		\
 875    ;;						\
 876    ldf.fill.nta f116 = [r2], 32;		\
 877    ldf.fill.nta f117 = [r3], 32;		\
 878    ;;						\
 879    ldf.fill.nta f118 = [r2], 32;		\
 880    ldf.fill.nta f119 = [r3], 32;		\
 881    ;;						\
 882    ldf.fill.nta f120 = [r2], 32;		\
 883    ldf.fill.nta f121 = [r3], 32;		\
 884    ;;						\
 885    ldf.fill.nta f122 = [r2], 32;		\
 886    ldf.fill.nta f123 = [r3], 32;		\
 887    ;;						\
 888    ldf.fill.nta f124 = [r2], 32;		\
 889    ldf.fill.nta f125 = [r3], 32;		\
 890    ;;						\
 891    ldf.fill.nta f126 = [r2], 32;		\
 892    ldf.fill.nta f127 = [r3], 32;		\
 893    ;;
 894
 895	/*
 896	 *	r32:		context_t base address
 897	 */
 898#define	SAVE_PTK_REGS				\
 899    add r2=CTX(PKR0), r32;			\
 900    mov r16=7;    				\
 901    ;;                         			\
 902    mov ar.lc=r16;  				\
 903    mov r17=r0;					\
 904    ;;						\
 9051:						\
 906    mov r18=pkr[r17];				\
 907    ;;                     			\
 908    srlz.i;					\
 909    ;; 						\
 910    st8 [r2]=r18, 8;				\
 911    ;;    					\
 912    add r17 =1,r17;				\
 913    ;;                     			\
 914    br.cloop.sptk 1b;				\
 915    ;;
 916
 917/*
 918 *      r33:    point to context_t structure
 919 *      ar.lc are corrupted.
 920 */
 921#define RESTORE_PTK_REGS	    		\
 922    add r2=CTX(PKR0), r33;			\
 923    mov r16=7;    				\
 924    ;;                         			\
 925    mov ar.lc=r16;  				\
 926    mov r17=r0;					\
 927    ;;						\
 9281: 						\
 929    ld8 r18=[r2], 8;				\
 930    ;;						\
 931    mov pkr[r17]=r18;				\
 932    ;;    					\
 933    srlz.i;					\
 934    ;; 						\
 935    add r17 =1,r17;				\
 936    ;;                     			\
 937    br.cloop.sptk 1b;				\
 938    ;;
 939
 940
 941/*
 942 * void vmm_trampoline( context_t * from,
 943 *			context_t * to)
 944 *
 945 * 	from:	r32
 946 *	to:	r33
 947 *  note: interrupt disabled before call this function.
 948 */
 949GLOBAL_ENTRY(vmm_trampoline)
 950    mov r16 = psr
 951    adds r2 = CTX(PSR), r32
 952    ;;
 953    st8 [r2] = r16, 8       // psr
 954    mov r17 = pr
 955    ;;
 956    st8 [r2] = r17, 8       // pr
 957    mov r18 = ar.unat
 958    ;;
 959    st8 [r2] = r18
 960    mov r17 = ar.rsc
 961    ;;
 962    adds r2 = CTX(RSC),r32
 963    ;;
 964    st8 [r2]= r17
 965    mov ar.rsc =0
 966    flushrs
 967    ;;
 968    SAVE_GENERAL_REGS
 969    ;;
 970    SAVE_KERNEL_REGS
 971    ;;
 972    SAVE_APP_REGS
 973    ;;
 974    SAVE_BRANCH_REGS
 975    ;;
 976    SAVE_CTL_REGS
 977    ;;
 978    SAVE_REGION_REGS
 979    ;;
 980    //SAVE_DEBUG_REGS
 981    ;;
 982    rsm  psr.dfl
 983    ;;
 984    srlz.d
 985    ;;
 986    SAVE_FPU_LOW
 987    ;;
 988    rsm  psr.dfh
 989    ;;
 990    srlz.d
 991    ;;
 992    SAVE_FPU_HIGH
 993    ;;
 994    SAVE_PTK_REGS
 995    ;;
 996    RESTORE_PTK_REGS
 997    ;;
 998    RESTORE_FPU_HIGH
 999    ;;
1000    RESTORE_FPU_LOW
1001    ;;
1002    //RESTORE_DEBUG_REGS
1003    ;;
1004    RESTORE_REGION_REGS
1005    ;;
1006    RESTORE_CTL_REGS
1007    ;;
1008    RESTORE_BRANCH_REGS
1009    ;;
1010    RESTORE_APP_REGS
1011    ;;
1012    RESTORE_KERNEL_REGS
1013    ;;
1014    RESTORE_GENERAL_REGS
1015    ;;
1016    adds r2=CTX(PSR), r33
1017    ;;
1018    ld8 r16=[r2], 8       // psr
1019    ;;
1020    mov psr.l=r16
1021    ;;
1022    srlz.d
1023    ;;
1024    ld8 r16=[r2], 8       // pr
1025    ;;
1026    mov pr =r16,-1
1027    ld8 r16=[r2]       // unat
1028    ;;
1029    mov ar.unat=r16
1030    ;;
1031    adds r2=CTX(RSC),r33
1032    ;;
1033    ld8 r16 =[r2]
1034    ;;
1035    mov ar.rsc = r16
1036    ;;
1037    br.ret.sptk.few b0
1038END(vmm_trampoline)