Linux Audio

Check our new training course

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