Linux Audio

Check our new training course

Loading...
v4.17
  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	ret 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	ret 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);
 92HYPERCALL1(platform_op_raw);
 93HYPERCALL2(multicall);
 94HYPERCALL2(vm_assist);
 95HYPERCALL3(dm_op);
 96
 97ENTRY(privcmd_call)
 98	stmdb sp!, {r4}
 99	mov r12, r0
100	mov r0, r1
101	mov r1, r2
102	mov r2, r3
103	ldr r3, [sp, #8]
104	/*
105	 * Privcmd calls are issued by the userspace. We need to allow the
106	 * kernel to access the userspace memory before issuing the hypercall.
107	 */
108	uaccess_enable r4
109
110	/* r4 is loaded now as we use it as scratch register before */
111	ldr r4, [sp, #4]
112	__HVC(XEN_IMM)
113
114	/*
115	 * Disable userspace access from kernel. This is fine to do it
116	 * unconditionally as no set_fs(KERNEL_DS)/set_fs(get_ds()) is
117	 * called before.
118	 */
119	uaccess_disable r4
120
121	ldm sp!, {r4}
122	ret lr
123ENDPROC(privcmd_call);
v6.2
  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	ret 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	ret 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(platform_op_raw);
 92HYPERCALL2(multicall);
 93HYPERCALL2(vm_assist);
 94HYPERCALL3(dm_op);
 95
 96ENTRY(privcmd_call)
 97	stmdb sp!, {r4}
 98	mov r12, r0
 99	mov r0, r1
100	mov r1, r2
101	mov r2, r3
102	ldr r3, [sp, #8]
103	/*
104	 * Privcmd calls are issued by the userspace. We need to allow the
105	 * kernel to access the userspace memory before issuing the hypercall.
106	 */
107	uaccess_enable r4
108
109	/* r4 is loaded now as we use it as scratch register before */
110	ldr r4, [sp, #4]
111	__HVC(XEN_IMM)
112
113	/*
114	 * Disable userspace access from kernel. This is fine to do it
115	 * unconditionally as no set_fs(KERNEL_DS) is called before.
 
116	 */
117	uaccess_disable r4
118
119	ldm sp!, {r4}
120	ret lr
121ENDPROC(privcmd_call);