2008-04-02 10:54:00 -07:00
/******************************************************************************
* grant_table . c
* x86 specific part
*
* Granting foreign access to our memory reservation .
*
* Copyright ( c ) 2005 - 2006 , Christopher Clark
* Copyright ( c ) 2004 - 2005 , K A Fraser
* Copyright ( c ) 2008 Isaku Yamahata < yamahata at valinux co jp >
* VA Linux Systems Japan . Split out x86 specific part .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation ; or , when distributed
* separately from the Linux kernel or incorporated into other
* software packages , subject to the following license :
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this source file ( the " Software " ) , to deal in the Software without
* restriction , including without limitation the rights to use , copy , modify ,
* merge , publish , distribute , sublicense , and / or sell copies of the Software ,
* and to permit persons to whom the Software is furnished to do so , subject to
* the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING
* FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE .
*/
# include <linux/sched.h>
# include <linux/mm.h>
# include <linux/vmalloc.h>
# include <xen/interface/xen.h>
# include <xen/page.h>
# include <xen/grant_table.h>
# include <asm/pgtable.h>
static int map_pte_fn ( pte_t * pte , struct page * pmd_page ,
unsigned long addr , void * data )
{
unsigned long * * frames = ( unsigned long * * ) data ;
set_pte_at ( & init_mm , addr , pte , mfn_pte ( ( * frames ) [ 0 ] , PAGE_KERNEL ) ) ;
( * frames ) + + ;
return 0 ;
}
static int unmap_pte_fn ( pte_t * pte , struct page * pmd_page ,
unsigned long addr , void * data )
{
set_pte_at ( & init_mm , addr , pte , __pte ( 0 ) ) ;
return 0 ;
}
int arch_gnttab_map_shared ( unsigned long * frames , unsigned long nr_gframes ,
unsigned long max_nr_gframes ,
2011-11-22 09:58:06 +08:00
void * * __shared )
2008-04-02 10:54:00 -07:00
{
int rc ;
2011-11-22 09:58:06 +08:00
void * shared = * __shared ;
2008-04-02 10:54:00 -07:00
if ( shared = = NULL ) {
struct vm_struct * area =
2011-09-29 16:53:29 +01:00
alloc_vm_area ( PAGE_SIZE * max_nr_gframes ) ;
2008-04-02 10:54:00 -07:00
BUG_ON ( area = = NULL ) ;
shared = area - > addr ;
* __shared = shared ;
}
rc = apply_to_page_range ( & init_mm , ( unsigned long ) shared ,
PAGE_SIZE * nr_gframes ,
map_pte_fn , & frames ) ;
return rc ;
}
2011-11-22 09:58:06 +08:00
void arch_gnttab_unmap_shared ( void * shared , unsigned long nr_gframes )
2008-04-02 10:54:00 -07:00
{
apply_to_page_range ( & init_mm , ( unsigned long ) shared ,
PAGE_SIZE * nr_gframes , unmap_pte_fn , NULL ) ;
}