94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Support routines for Xen hypercalls
 | |
|  *
 | |
|  * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@hp.com>
 | |
|  * Copyright (C) 2008 Yaozu (Eddie) Dong <eddie.dong@intel.com>
 | |
|  */
 | |
| 
 | |
| #include <asm/asmmacro.h>
 | |
| #include <asm/intrinsics.h>
 | |
| #include <asm/xen/privop.h>
 | |
| 
 | |
| #ifdef __INTEL_COMPILER
 | |
| /*
 | |
|  * Hypercalls without parameter.
 | |
|  */
 | |
| #define __HCALL0(name,hcall)		\
 | |
| 	GLOBAL_ENTRY(name);		\
 | |
| 	break	hcall;			\
 | |
| 	br.ret.sptk.many rp;		\
 | |
| 	END(name)
 | |
| 
 | |
| /*
 | |
|  * Hypercalls with 1 parameter.
 | |
|  */
 | |
| #define __HCALL1(name,hcall)		\
 | |
| 	GLOBAL_ENTRY(name);		\
 | |
| 	mov r8=r32;			\
 | |
| 	break	hcall;			\
 | |
| 	br.ret.sptk.many rp;		\
 | |
| 	END(name)
 | |
| 
 | |
| /*
 | |
|  * Hypercalls with 2 parameters.
 | |
|  */
 | |
| #define __HCALL2(name,hcall)		\
 | |
| 	GLOBAL_ENTRY(name);		\
 | |
| 	mov r8=r32;			\
 | |
| 	mov r9=r33;			\
 | |
| 	break	hcall;			\
 | |
| 	br.ret.sptk.many rp;		\
 | |
| 	END(name)
 | |
| 
 | |
| __HCALL0(xen_get_psr, HYPERPRIVOP_GET_PSR)
 | |
| __HCALL0(xen_get_ivr, HYPERPRIVOP_GET_IVR)
 | |
| __HCALL0(xen_get_tpr, HYPERPRIVOP_GET_TPR)
 | |
| __HCALL0(xen_hyper_ssm_i, HYPERPRIVOP_SSM_I)
 | |
| 
 | |
| __HCALL1(xen_set_tpr, HYPERPRIVOP_SET_TPR)
 | |
| __HCALL1(xen_eoi, HYPERPRIVOP_EOI)
 | |
| __HCALL1(xen_thash, HYPERPRIVOP_THASH)
 | |
| __HCALL1(xen_set_itm, HYPERPRIVOP_SET_ITM)
 | |
| __HCALL1(xen_get_rr, HYPERPRIVOP_GET_RR)
 | |
| __HCALL1(xen_fc, HYPERPRIVOP_FC)
 | |
| __HCALL1(xen_get_cpuid, HYPERPRIVOP_GET_CPUID)
 | |
| __HCALL1(xen_get_pmd, HYPERPRIVOP_GET_PMD)
 | |
| 
 | |
| __HCALL2(xen_ptcga, HYPERPRIVOP_PTC_GA)
 | |
| __HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR)
 | |
| __HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR)
 | |
| 
 | |
| #ifdef CONFIG_IA32_SUPPORT
 | |
| __HCALL0(xen_get_eflag, HYPERPRIVOP_GET_EFLAG)
 | |
| __HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG)	// refer SDM vol1 3.1.8
 | |
| #endif /* CONFIG_IA32_SUPPORT */
 | |
| 
 | |
| GLOBAL_ENTRY(xen_set_rr0_to_rr4)
 | |
| 	mov r8=r32
 | |
| 	mov r9=r33
 | |
| 	mov r10=r34
 | |
| 	mov r11=r35
 | |
| 	mov r14=r36
 | |
| 	XEN_HYPER_SET_RR0_TO_RR4
 | |
| 	br.ret.sptk.many rp
 | |
| 	;;
 | |
| END(xen_set_rr0_to_rr4)
 | |
| #endif
 | |
| 
 | |
| GLOBAL_ENTRY(xen_send_ipi)
 | |
| 	mov r14=r32
 | |
| 	mov r15=r33
 | |
| 	mov r2=0x400
 | |
| 	break 0x1000
 | |
| 	;;
 | |
| 	br.ret.sptk.many rp
 | |
| 	;;
 | |
| END(xen_send_ipi)
 | |
| 
 | |
| GLOBAL_ENTRY(__hypercall)
 | |
| 	mov r2=r37
 | |
| 	break 0x1000
 | |
| 	br.ret.sptk.many b0
 | |
| 	;;
 | |
| END(__hypercall)
 |