125981136fb13bcacf5f475f3e0ec750341e1e671Christopher Ferris/* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR MIT) */
230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/******************************************************************************
330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * privcmd.h
430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Interface to /proc/xen/privcmd.
630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Copyright (c) 2003-2005, K A Fraser
830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * This program is free software; you can redistribute it and/or
1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * modify it under the terms of the GNU General Public License version 2
1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * as published by the Free Software Foundation; or, when distributed
1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * separately from the Linux kernel or incorporated into other
1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * software packages, subject to the following license:
1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Permission is hereby granted, free of charge, to any person obtaining a copy
1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * of this source file (the "Software"), to deal in the Software without
1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * restriction, including without limitation the rights to use, copy, modify,
1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * merge, publish, distribute, sublicense, and/or sell copies of the Software,
1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and to permit persons to whom the Software is furnished to do so, subject to
2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * the following conditions:
2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The above copyright notice and this permission notice shall be included in
2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * all copies or substantial portions of the Software.
2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * IN THE SOFTWARE.
3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef __LINUX_PUBLIC_PRIVCMD_H__
3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define __LINUX_PUBLIC_PRIVCMD_H__
3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/types.h>
3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <linux/compiler.h>
3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#include <xen/interface/xen.h>
4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4130692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct privcmd_hypercall {
4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u64 op;
4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u64 arg[5];
4430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4630692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct privcmd_mmap_entry {
4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u64 va;
4812e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris	/*
4912e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris	 * This should be a GFN. It's not possible to change the name because
5012e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris	 * it's exposed to the user-space.
5112e1f28cce28271eb109a5bae818a804f0c3bb27Christopher Ferris	 */
5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u64 mfn;
5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u64 npages;
5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
5630692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct privcmd_mmap {
5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int num;
5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	domid_t dom; /* target domain */
5930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	struct privcmd_mmap_entry __user *entry;
6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
6130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
6230692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct privcmd_mmapbatch {
6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int num;     /* number of pages to populate */
6430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	domid_t dom; /* target domain */
6530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u64 addr;  /* virtual address */
6630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	xen_pfn_t __user *arr; /* array of mfns - or'd with
6730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng				  PRIVCMD_MMAPBATCH_*_ERROR on err */
6830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
6930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define PRIVCMD_MMAPBATCH_MFN_ERROR     0xf0000000U
7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define PRIVCMD_MMAPBATCH_PAGED_ERROR   0x80000000U
7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7330692c65c4174412c90e79489e98ab85c1a7412fBen Chengstruct privcmd_mmapbatch_v2 {
7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	unsigned int num; /* number of pages to populate */
7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	domid_t dom;      /* target domain */
7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	__u64 addr;       /* virtual address */
7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	const xen_pfn_t __user *arr; /* array of mfns */
7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	int __user *err;  /* array of error codes */
7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng};
8030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
810543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferrisstruct privcmd_dm_op_buf {
820543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	void __user *uptr;
830543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	size_t size;
840543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris};
850543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris
860543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferrisstruct privcmd_dm_op {
870543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	domid_t dom;
880543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	__u16 num;
890543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	const struct privcmd_dm_op_buf __user *ubufs;
900543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris};
910543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris
9230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
9330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * @cmd: IOCTL_PRIVCMD_HYPERCALL
9430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * @arg: &privcmd_hypercall_t
9530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Return: Value returned from execution of the specified hypercall.
9630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng *
9730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * @cmd: IOCTL_PRIVCMD_MMAPBATCH_V2
9830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * @arg: &struct privcmd_mmapbatch_v2
9930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Return: 0 on success (i.e., arg->err contains valid error codes for
10030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * each frame).  On an error other than a failed frame remap, -1 is
10130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * returned and errno is set to EINVAL, EFAULT etc.  As an exception,
10230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * if the operation was otherwise successful but any frame failed with
10330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * -ENOENT, then -1 is returned and errno is set to ENOENT.
10430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
10530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define IOCTL_PRIVCMD_HYPERCALL					\
10630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	_IOC(_IOC_NONE, 'P', 0, sizeof(struct privcmd_hypercall))
10730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define IOCTL_PRIVCMD_MMAP					\
10830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	_IOC(_IOC_NONE, 'P', 2, sizeof(struct privcmd_mmap))
10930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define IOCTL_PRIVCMD_MMAPBATCH					\
11030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	_IOC(_IOC_NONE, 'P', 3, sizeof(struct privcmd_mmapbatch))
11130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define IOCTL_PRIVCMD_MMAPBATCH_V2				\
11230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	_IOC(_IOC_NONE, 'P', 4, sizeof(struct privcmd_mmapbatch_v2))
1130543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris#define IOCTL_PRIVCMD_DM_OP					\
1140543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	_IOC(_IOC_NONE, 'P', 5, sizeof(struct privcmd_dm_op))
1150543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris#define IOCTL_PRIVCMD_RESTRICT					\
1160543f743b6f5bc5c0652568c763e6dfb9ddce647Christopher Ferris	_IOC(_IOC_NONE, 'P', 6, sizeof(domid_t))
11730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
11830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
119