1*aa2466d2SStefano Stabellini/****************************************************************************** 2*aa2466d2SStefano Stabellini * hypercall.S 3*aa2466d2SStefano Stabellini * 4*aa2466d2SStefano Stabellini * Xen hypercall wrappers 5*aa2466d2SStefano Stabellini * 6*aa2466d2SStefano Stabellini * Stefano Stabellini <stefano.stabellini@eu.citrix.com>, Citrix, 2012 7*aa2466d2SStefano Stabellini * 8*aa2466d2SStefano Stabellini * This program is free software; you can redistribute it and/or 9*aa2466d2SStefano Stabellini * modify it under the terms of the GNU General Public License version 2 10*aa2466d2SStefano Stabellini * as published by the Free Software Foundation; or, when distributed 11*aa2466d2SStefano Stabellini * separately from the Linux kernel or incorporated into other 12*aa2466d2SStefano Stabellini * software packages, subject to the following license: 13*aa2466d2SStefano Stabellini * 14*aa2466d2SStefano Stabellini * Permission is hereby granted, free of charge, to any person obtaining a copy 15*aa2466d2SStefano Stabellini * of this source file (the "Software"), to deal in the Software without 16*aa2466d2SStefano Stabellini * restriction, including without limitation the rights to use, copy, modify, 17*aa2466d2SStefano Stabellini * merge, publish, distribute, sublicense, and/or sell copies of the Software, 18*aa2466d2SStefano Stabellini * and to permit persons to whom the Software is furnished to do so, subject to 19*aa2466d2SStefano Stabellini * the following conditions: 20*aa2466d2SStefano Stabellini * 21*aa2466d2SStefano Stabellini * The above copyright notice and this permission notice shall be included in 22*aa2466d2SStefano Stabellini * all copies or substantial portions of the Software. 23*aa2466d2SStefano Stabellini * 24*aa2466d2SStefano Stabellini * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 25*aa2466d2SStefano Stabellini * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26*aa2466d2SStefano Stabellini * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 27*aa2466d2SStefano Stabellini * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 28*aa2466d2SStefano Stabellini * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 29*aa2466d2SStefano Stabellini * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 30*aa2466d2SStefano Stabellini * IN THE SOFTWARE. 31*aa2466d2SStefano Stabellini */ 32*aa2466d2SStefano Stabellini 33*aa2466d2SStefano Stabellini/* 34*aa2466d2SStefano Stabellini * The Xen hypercall calling convention is very similar to the ARM 35*aa2466d2SStefano Stabellini * procedure calling convention: the first paramter is passed in r0, the 36*aa2466d2SStefano Stabellini * second in r1, the third in r2 and the fourth in r3. Considering that 37*aa2466d2SStefano Stabellini * Xen hypercalls have 5 arguments at most, the fifth paramter is passed 38*aa2466d2SStefano Stabellini * in r4, differently from the procedure calling convention of using the 39*aa2466d2SStefano Stabellini * stack for that case. 40*aa2466d2SStefano Stabellini * 41*aa2466d2SStefano Stabellini * The hypercall number is passed in r12. 42*aa2466d2SStefano Stabellini * 43*aa2466d2SStefano Stabellini * The return value is in r0. 44*aa2466d2SStefano Stabellini * 45*aa2466d2SStefano Stabellini * The hvc ISS is required to be 0xEA1, that is the Xen specific ARM 46*aa2466d2SStefano Stabellini * hypercall tag. 47*aa2466d2SStefano Stabellini */ 48*aa2466d2SStefano Stabellini 49*aa2466d2SStefano Stabellini#include <linux/linkage.h> 50*aa2466d2SStefano Stabellini#include <asm/assembler.h> 51*aa2466d2SStefano Stabellini#include <xen/interface/xen.h> 52*aa2466d2SStefano Stabellini 53*aa2466d2SStefano Stabellini 54*aa2466d2SStefano Stabellini/* HVC 0xEA1 */ 55*aa2466d2SStefano Stabellini#ifdef CONFIG_THUMB2_KERNEL 56*aa2466d2SStefano Stabellini#define xen_hvc .word 0xf7e08ea1 57*aa2466d2SStefano Stabellini#else 58*aa2466d2SStefano Stabellini#define xen_hvc .word 0xe140ea71 59*aa2466d2SStefano Stabellini#endif 60*aa2466d2SStefano Stabellini 61*aa2466d2SStefano Stabellini#define HYPERCALL_SIMPLE(hypercall) \ 62*aa2466d2SStefano StabelliniENTRY(HYPERVISOR_##hypercall) \ 63*aa2466d2SStefano Stabellini mov r12, #__HYPERVISOR_##hypercall; \ 64*aa2466d2SStefano Stabellini xen_hvc; \ 65*aa2466d2SStefano Stabellini mov pc, lr; \ 66*aa2466d2SStefano StabelliniENDPROC(HYPERVISOR_##hypercall) 67*aa2466d2SStefano Stabellini 68*aa2466d2SStefano Stabellini#define HYPERCALL0 HYPERCALL_SIMPLE 69*aa2466d2SStefano Stabellini#define HYPERCALL1 HYPERCALL_SIMPLE 70*aa2466d2SStefano Stabellini#define HYPERCALL2 HYPERCALL_SIMPLE 71*aa2466d2SStefano Stabellini#define HYPERCALL3 HYPERCALL_SIMPLE 72*aa2466d2SStefano Stabellini#define HYPERCALL4 HYPERCALL_SIMPLE 73*aa2466d2SStefano Stabellini 74*aa2466d2SStefano Stabellini#define HYPERCALL5(hypercall) \ 75*aa2466d2SStefano StabelliniENTRY(HYPERVISOR_##hypercall) \ 76*aa2466d2SStefano Stabellini stmdb sp!, {r4} \ 77*aa2466d2SStefano Stabellini ldr r4, [sp, #4] \ 78*aa2466d2SStefano Stabellini mov r12, #__HYPERVISOR_##hypercall; \ 79*aa2466d2SStefano Stabellini xen_hvc \ 80*aa2466d2SStefano Stabellini ldm sp!, {r4} \ 81*aa2466d2SStefano Stabellini mov pc, lr \ 82*aa2466d2SStefano StabelliniENDPROC(HYPERVISOR_##hypercall) 83*aa2466d2SStefano Stabellini 84*aa2466d2SStefano Stabellini .text 85*aa2466d2SStefano Stabellini 86*aa2466d2SStefano StabelliniHYPERCALL2(xen_version); 87*aa2466d2SStefano StabelliniHYPERCALL3(console_io); 88*aa2466d2SStefano StabelliniHYPERCALL3(grant_table_op); 89*aa2466d2SStefano StabelliniHYPERCALL2(sched_op); 90*aa2466d2SStefano StabelliniHYPERCALL2(event_channel_op); 91*aa2466d2SStefano StabelliniHYPERCALL2(hvm_op); 92*aa2466d2SStefano StabelliniHYPERCALL2(memory_op); 93*aa2466d2SStefano StabelliniHYPERCALL2(physdev_op); 94*aa2466d2SStefano Stabellini 95*aa2466d2SStefano StabelliniENTRY(privcmd_call) 96*aa2466d2SStefano Stabellini stmdb sp!, {r4} 97*aa2466d2SStefano Stabellini mov r12, r0 98*aa2466d2SStefano Stabellini mov r0, r1 99*aa2466d2SStefano Stabellini mov r1, r2 100*aa2466d2SStefano Stabellini mov r2, r3 101*aa2466d2SStefano Stabellini ldr r3, [sp, #8] 102*aa2466d2SStefano Stabellini ldr r4, [sp, #4] 103*aa2466d2SStefano Stabellini xen_hvc 104*aa2466d2SStefano Stabellini ldm sp!, {r4} 105*aa2466d2SStefano Stabellini mov pc, lr 106*aa2466d2SStefano StabelliniENDPROC(privcmd_call); 107