xref: /freebsd/sys/xen/gnttab.h (revision 126780243806a6b6cf345b9b548f68010e921aec)
130d1eefeSKip Macy /******************************************************************************
230d1eefeSKip Macy  * gnttab.h
330d1eefeSKip Macy  *
430d1eefeSKip Macy  * Two sets of functionality:
530d1eefeSKip Macy  * 1. Granting foreign access to our memory reservation.
630d1eefeSKip Macy  * 2. Accessing others' memory reservations via grant references.
730d1eefeSKip Macy  * (i.e., mechanisms for both sender and recipient of grant references)
830d1eefeSKip Macy  *
930d1eefeSKip Macy  * Copyright (c) 2004-2005, K A Fraser
1030d1eefeSKip Macy  * Copyright (c) 2005, Christopher Clark
1130d1eefeSKip Macy  *
1230d1eefeSKip Macy  * This program is free software; you can redistribute it and/or
1330d1eefeSKip Macy  * modify it under the terms of the GNU General Public License version 2
1430d1eefeSKip Macy  * as published by the Free Software Foundation; or, when distributed
1530d1eefeSKip Macy  * separately from the Linux kernel or incorporated into other
1630d1eefeSKip Macy  * software packages, subject to the following license:
1730d1eefeSKip Macy  *
1830d1eefeSKip Macy  * Permission is hereby granted, free of charge, to any person obtaining a copy
1930d1eefeSKip Macy  * of this source file (the "Software"), to deal in the Software without
2030d1eefeSKip Macy  * restriction, including without limitation the rights to use, copy, modify,
2130d1eefeSKip Macy  * merge, publish, distribute, sublicense, and/or sell copies of the Software,
2230d1eefeSKip Macy  * and to permit persons to whom the Software is furnished to do so, subject to
2330d1eefeSKip Macy  * the following conditions:
2430d1eefeSKip Macy  *
2530d1eefeSKip Macy  * The above copyright notice and this permission notice shall be included in
2630d1eefeSKip Macy  * all copies or substantial portions of the Software.
2730d1eefeSKip Macy  *
2830d1eefeSKip Macy  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
2930d1eefeSKip Macy  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3030d1eefeSKip Macy  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3130d1eefeSKip Macy  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3230d1eefeSKip Macy  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3330d1eefeSKip Macy  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
3430d1eefeSKip Macy  * IN THE SOFTWARE.
3530d1eefeSKip Macy  */
3630d1eefeSKip Macy 
3730d1eefeSKip Macy #ifndef __ASM_GNTTAB_H__
3830d1eefeSKip Macy 
3912678024SDoug Rabson #include <xen/interface/grant_table.h>
4012678024SDoug Rabson 
413a6d1fcfSKip Macy #include <xen/hypervisor.h>
4230d1eefeSKip Macy #include <xen/interface/grant_table.h>
4330d1eefeSKip Macy #include <machine/xen/xen-os.h>
4412678024SDoug Rabson #include <xen/features.h>
4530d1eefeSKip Macy 
4630d1eefeSKip Macy struct gnttab_free_callback {
4730d1eefeSKip Macy 	struct gnttab_free_callback *next;
4830d1eefeSKip Macy 	void (*fn)(void *);
4930d1eefeSKip Macy 	void *arg;
5030d1eefeSKip Macy 	uint16_t count;
5130d1eefeSKip Macy };
5230d1eefeSKip Macy 
5323dc5621SKip Macy int gnttab_init(void);
5423dc5621SKip Macy 
5512678024SDoug Rabson /*
5612678024SDoug Rabson  * Allocate a grant table reference and return it in *result. Returns
5712678024SDoug Rabson  * zero on success or errno on error.
5812678024SDoug Rabson  */
5930d1eefeSKip Macy int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
603a6d1fcfSKip Macy     int flags, grant_ref_t *result);
6130d1eefeSKip Macy 
6230d1eefeSKip Macy /*
6330d1eefeSKip Macy  * End access through the given grant reference, iff the grant entry is no
6430d1eefeSKip Macy  * longer in use.  Return 1 if the grant entry was freed, 0 if it is still in
6530d1eefeSKip Macy  * use.
6630d1eefeSKip Macy  */
67a972cc52SKip Macy int gnttab_end_foreign_access_ref(grant_ref_t ref);
6830d1eefeSKip Macy 
6930d1eefeSKip Macy /*
7030d1eefeSKip Macy  * Eventually end access through the given grant reference, and once that
7130d1eefeSKip Macy  * access has been ended, free the given page too.  Access will be ended
7230d1eefeSKip Macy  * immediately iff the grant entry is not in use, otherwise it will happen
7330d1eefeSKip Macy  * some time later.  page may be 0, in which case no freeing will occur.
7430d1eefeSKip Macy  */
75920ba15bSKip Macy void gnttab_end_foreign_access(grant_ref_t ref, void *page);
7630d1eefeSKip Macy 
7712678024SDoug Rabson int gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn, grant_ref_t *result);
7830d1eefeSKip Macy 
7930d1eefeSKip Macy unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref);
8030d1eefeSKip Macy unsigned long gnttab_end_foreign_transfer(grant_ref_t ref);
8130d1eefeSKip Macy 
8230d1eefeSKip Macy int gnttab_query_foreign_access(grant_ref_t ref);
8330d1eefeSKip Macy 
8430d1eefeSKip Macy /*
8530d1eefeSKip Macy  * operations on reserved batches of grant references
8630d1eefeSKip Macy  */
8730d1eefeSKip Macy int gnttab_alloc_grant_references(uint16_t count, grant_ref_t *pprivate_head);
8830d1eefeSKip Macy 
8930d1eefeSKip Macy void gnttab_free_grant_reference(grant_ref_t ref);
9030d1eefeSKip Macy 
9130d1eefeSKip Macy void gnttab_free_grant_references(grant_ref_t head);
9230d1eefeSKip Macy 
9330d1eefeSKip Macy int gnttab_empty_grant_references(const grant_ref_t *pprivate_head);
9430d1eefeSKip Macy 
9530d1eefeSKip Macy int gnttab_claim_grant_reference(grant_ref_t *pprivate_head);
9630d1eefeSKip Macy 
9730d1eefeSKip Macy void gnttab_release_grant_reference(grant_ref_t *private_head,
9830d1eefeSKip Macy 				    grant_ref_t release);
9930d1eefeSKip Macy 
10030d1eefeSKip Macy void gnttab_request_free_callback(struct gnttab_free_callback *callback,
10130d1eefeSKip Macy 				  void (*fn)(void *), void *arg, uint16_t count);
10230d1eefeSKip Macy void gnttab_cancel_free_callback(struct gnttab_free_callback *callback);
10330d1eefeSKip Macy 
10430d1eefeSKip Macy void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
105a972cc52SKip Macy 				     unsigned long frame, int flags);
10630d1eefeSKip Macy 
10730d1eefeSKip Macy void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
10830d1eefeSKip Macy 				       unsigned long pfn);
10930d1eefeSKip Macy 
11030d1eefeSKip Macy int gnttab_suspend(void);
11130d1eefeSKip Macy int gnttab_resume(void);
11230d1eefeSKip Macy 
11312678024SDoug Rabson #if 0
11412678024SDoug Rabson 
11512678024SDoug Rabson #include <xen/features.h>
11612678024SDoug Rabson 
11730d1eefeSKip Macy static inline void
11830d1eefeSKip Macy gnttab_set_map_op(struct gnttab_map_grant_ref *map, vm_paddr_t addr,
11930d1eefeSKip Macy 		  uint32_t flags, grant_ref_t ref, domid_t domid)
12030d1eefeSKip Macy {
12130d1eefeSKip Macy 	if (flags & GNTMAP_contains_pte)
12230d1eefeSKip Macy 		map->host_addr = addr;
12330d1eefeSKip Macy 	else if (xen_feature(XENFEAT_auto_translated_physmap))
12430d1eefeSKip Macy 		map->host_addr = vtophys(addr);
12530d1eefeSKip Macy 	else
12630d1eefeSKip Macy 		map->host_addr = addr;
12730d1eefeSKip Macy 
12830d1eefeSKip Macy 	map->flags = flags;
12930d1eefeSKip Macy 	map->ref = ref;
13030d1eefeSKip Macy 	map->dom = domid;
13130d1eefeSKip Macy }
13230d1eefeSKip Macy 
13330d1eefeSKip Macy static inline void
13430d1eefeSKip Macy gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, vm_paddr_t addr,
13530d1eefeSKip Macy 		    uint32_t flags, grant_handle_t handle)
13630d1eefeSKip Macy {
13730d1eefeSKip Macy 	if (flags & GNTMAP_contains_pte)
13830d1eefeSKip Macy 		unmap->host_addr = addr;
13930d1eefeSKip Macy 	else if (xen_feature(XENFEAT_auto_translated_physmap))
14030d1eefeSKip Macy 		unmap->host_addr = vtophys(addr);
14130d1eefeSKip Macy 	else
14230d1eefeSKip Macy 		unmap->host_addr = addr;
14330d1eefeSKip Macy 
14430d1eefeSKip Macy 	unmap->handle = handle;
14530d1eefeSKip Macy 	unmap->dev_bus_addr = 0;
14630d1eefeSKip Macy }
14730d1eefeSKip Macy 
148a972cc52SKip Macy static inline void
149920ba15bSKip Macy gnttab_set_replace_op(struct gnttab_unmap_and_replace *unmap, vm_paddr_t addr,
150920ba15bSKip Macy 		      vm_paddr_t new_addr, grant_handle_t handle)
151a972cc52SKip Macy {
152a972cc52SKip Macy 	if (xen_feature(XENFEAT_auto_translated_physmap)) {
153920ba15bSKip Macy 		unmap->host_addr = vtophys(addr);
154920ba15bSKip Macy 		unmap->new_addr = vtophys(new_addr);
155a972cc52SKip Macy 	} else {
156a972cc52SKip Macy 		unmap->host_addr = addr;
157a972cc52SKip Macy 		unmap->new_addr = new_addr;
158a972cc52SKip Macy 	}
159a972cc52SKip Macy 
160a972cc52SKip Macy 	unmap->handle = handle;
161a972cc52SKip Macy }
16212678024SDoug Rabson #endif
163a972cc52SKip Macy 
16430d1eefeSKip Macy #endif /* __ASM_GNTTAB_H__ */
165