/* * Support routines for Xen hypercalls * * Copyright (C) 2005 Dan Magenheimer * Copyright (C) 2008 Yaozu (Eddie) Dong */ #include #include #include #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)