25 #include <sys/types.h> 
   43 #ifdef XENCTRL_HAS_XC_INTERFACE 
   45 #define XC_IF_INVALID (NULL) 
   48 #define XC_IF_INVALID (-1) 
   69     verror(
"memcache already in use!\n");
 
  146     vwarn(
"error while looking up vaddr 0x%"PRIxADDR" (for vaddr" 
  147           " 0x%"PRIxADDR") in memcache: %s (%d); trying full lookup!\n",
 
  148           tvaddr,vaddr,strerror(errno),rc);
 
  170 static void *__xen_vm_mem_builtin_mmap_phys(
struct target *
target,
ADDR paddr,
 
  171                         unsigned long length,
int prot,
 
  173                         unsigned long *plength) {
 
  180     unsigned long int evicted;
 
  186     if ((paddr_offset + length) % ((
ADDR)__PAGE_SIZE))
 
  191     pfn_arr = 
calloc(num,
sizeof(*pfn_arr));
 
  192     lpaddr = paddr & ~(((
ADDR)__PAGE_SIZE) - 1);
 
  193     pfn = lpaddr / ((
ADDR)__PAGE_SIZE);
 
  194     for (i = 0; i < num; ++
i) {
 
  195     pfn_arr[
i] = pfn + 
i;
 
  200     mmap = xc_map_foreign_pages(
xc_handle,xstate->
id,prot,pfn_arr,num);
 
  206            " (page 0x%"PRIxADDR"); aborting!\n",
 
  211              "failed to mmap %d pages at paddr 0x%"PRIxADDR 
  212              " (page 0x%"PRIxADDR"); evicting and trying again!\n",
 
  219         if (evicted < (
unsigned long int)(num * __PAGE_SIZE))
 
  223                            num * __PAGE_SIZE - evicted);
 
  236         *poffset = paddr_offset;
 
  241            "mmap'd %d pages at phys 0x%"PRIxADDR" at 0x%p\n",
 
  257     int lbuf_alen = 0,lbuf_len = 0;
 
  259     short didmmap,savedmmap;
 
  261     unsigned long plength = 0;
 
  269     lvaddr = addr & ~(__PAGE_SIZE - 1);
 
  270     voffset = addr & (__PAGE_SIZE - 1);
 
  286                    &pbase,NULL,(
void **)&mmap,&plength,NULL);
 
  288         vwarn(
"memcache_get_mmap error: v 0x%"PRIxADDR" len %lu: %s (%d); continuing\n",
 
  289           addr,1ul,strerror(errno),rc);
 
  292         didmmap = savedmmap = 0;
 
  295         mmap = __xen_vm_mem_builtin_mmap_phys(target,paddr,mlen,
PROT_READ,
 
  296                           &pbase,NULL,&plength);
 
  313                "something already cached at p 0x%"PRIxADDR" len %lu" 
  314                " for read p 0x%"PRIxADDR"; skipping!\n",
 
  318         vwarn(
"memcache_set_mmap error: p 0x%"PRIxADDR" len %lu (for read" 
  319               " p 0x%"PRIxADDR": %s (%d); continuing\n",
 
  320               pbase,plength,addr,strerror(errno),rc);
 
  338         lbuf_alen = j - coffset + pad;
 
  342         lbuf_alen += j - coffset + pad;
 
  343         lbuf = 
realloc(lbuf,lbuf_alen);
 
  345     memcpy(lbuf + lbuf_len,mmap + coffset,j - coffset);
 
  346     lbuf_len += j - coffset;
 
  348     if (didmmap && !savedmmap)
 
  349         munmap(mmap,plength);
 
  352         lbuf[lbuf_len] = 
'\0';
 
  357     return (
unsigned char *)lbuf;
 
  361                         unsigned long length,
 
  362                         unsigned char *buf) {
 
  363     unsigned long plength = 0;
 
  373                &pbase,&poffset,&mmap,&plength,NULL);
 
  377     vwarn(
"memcache_get_mmap error: p 0x%"PRIxADDR" len %lu: %s (%d); continuing\n",
 
  378           paddr,length,strerror(errno),rc);
 
  381     mmap = __xen_vm_mem_builtin_mmap_phys(target,paddr,length,
PROT_READ,
 
  382                       &pbase,&poffset,&plength);
 
  389            "something already cached at p 0x%"PRIxADDR" len %lu" 
  391            pbase,plength,paddr);
 
  394     vwarn(
"memcache_set_mmap error: p 0x%"PRIxADDR" len %lu (for read p" 
  395           " 0x%"PRIxADDR": %s (%d); continuing\n",
 
  396           pbase,plength,paddr,strerror(errno),rc);
 
  405     memcpy(buf,mmap + poffset,length);
 
  411     munmap(mmap,plength);
 
  417                         unsigned long length,
 
  418                         unsigned char *buf) {
 
  419     unsigned long plength = 0;
 
  425     mmap = __xen_vm_mem_builtin_mmap_phys(target,paddr,length,
PROT_WRITE,
 
  426                       &pbase,&poffset,&plength);
 
  430     memcpy(mmap + poffset,buf,length);
 
  435     munmap(mmap,plength);
 
  440 static void *__xen_vm_mem_builtin_mmap_virt(
struct target *target,
 
  442                         unsigned long length,
int prot,
 
  444                         unsigned long *vlength) {
 
  453     unsigned long int evicted;
 
  457     lvaddr = vaddr & ~(__PAGE_SIZE - 1);
 
  458     vaddr_offset = vaddr & (__PAGE_SIZE - 1);
 
  459     num = (vaddr_offset + length) / __PAGE_SIZE;
 
  465     pfn_arr = 
calloc(num,
sizeof(*pfn_arr));
 
  466     for (i = 0; i < num; ++
i) {
 
  479     mmap = xc_map_foreign_pages(
xc_handle,xstate->
id,prot,pfn_arr,num);
 
  485            num,lvaddr,vaddr,pfn_arr[0] * __PAGE_SIZE);
 
  489              "failed to mmap %d pages at vaddr 0x%"PRIxADDR 
  491              " evicting and trying again!\n",
 
  492              num,lvaddr,vaddr,pfn_arr[0] * __PAGE_SIZE);
 
  498         if (evicted < (
unsigned long int)(num * __PAGE_SIZE))
 
  502                            num * __PAGE_SIZE - evicted);
 
  516         *voffset = vaddr_offset;
 
  522            num,vbase,vaddr,mmap);
 
  537     int lbuf_alen = 0,lbuf_len = 0;
 
  539     short didmmap,savedmmap;
 
  541     unsigned long plength = 0;
 
  549     lvaddr = addr & ~(__PAGE_SIZE - 1);
 
  550     voffset = addr & (__PAGE_SIZE - 1);
 
  573                    &pbase,NULL,(
void **)&mmap,&plength,NULL);
 
  575         vwarn(
"memcache_get_mmap error: v 0x%"PRIxADDR" len %lu: %s (%d); continuing\n",
 
  576           addr,1ul,strerror(errno),rc);
 
  579         didmmap = savedmmap = 0;
 
  582         mmap = __xen_vm_mem_builtin_mmap_phys(target,paddr,mlen,
PROT_READ,
 
  583                           &pbase,NULL,&plength);
 
  601                "something already cached at p 0x%"PRIxADDR" len %lu" 
  602                " for read v 0x%"PRIxADDR"; skipping!\n",
 
  606         vwarn(
"memcache_set_mmap error: p 0x%"PRIxADDR" len %lu (for read" 
  607               " v 0x%"PRIxADDR": %s (%d); continuing\n",
 
  608               pbase,plength,addr,strerror(errno),rc);
 
  626         lbuf_alen = j - coffset + pad;
 
  630         lbuf_alen += j - coffset + pad;
 
  631         lbuf = 
realloc(lbuf,lbuf_alen);
 
  633     memcpy(lbuf + lbuf_len,mmap + coffset,j - coffset);
 
  634     lbuf_len += j - coffset;
 
  636     if (didmmap && !savedmmap)
 
  637         munmap(mmap,plength);
 
  640         lbuf[lbuf_len] = 
'\0';
 
  645     return (
unsigned char *)lbuf;
 
  660                        unsigned long length,
 
  661                        unsigned char *buf) {
 
  663     unsigned long vlength = 0;
 
  672                &vbase,&voffset,&mmap,&vlength,NULL);
 
  676     vwarn(
"memcache_get_mmap error: v 0x%"PRIxADDR" len %lu: %s (%d); continuing\n",
 
  677           addr,length,strerror(errno),rc);
 
  680     mmap = __xen_vm_mem_builtin_mmap_virt(target,tid,pgd,addr,length,
PROT_READ,
 
  681                       &vbase,&voffset,&vlength);
 
  688            "something already cached at v 0x%"PRIxADDR" len %lu" 
  693     vwarn(
"memcache_set_mmap error: p 0x%"PRIxADDR" len %lu (for read" 
  694           " v 0x%"PRIxADDR": %s (%d); continuing\n",
 
  695           vbase,vlength,addr,strerror(errno),rc);
 
  704     memcpy(buf,mmap + voffset,length);
 
  710     munmap(mmap,vlength);
 
  722                        unsigned long length,
 
  723                        unsigned char *buf) {
 
  725     unsigned long vlength = 0;
 
  730     mmap = __xen_vm_mem_builtin_mmap_virt(target,tid,pgd,addr,length,
PROT_WRITE,
 
  731                       &vbase,&voffset,&vlength);
 
  735     memcpy(mmap + voffset,buf,length);
 
  740     munmap(mmap,vlength);
 
int memcache_get_mmap(struct memcache *memcache, ADDR tag, ADDR pa, unsigned long int pa_len, memcache_flags_t flags, ADDR *pa_start, OFFSET *pa_offset, void **mem, unsigned long int *mem_len, void **tag_priv)
int target_arch_x86_v2p(struct target *target, ADDR pgd, ADDR virt, arch_x86_v2p_flags_t flags, ADDR *phys)
#define vwarnopt(level, area, flags, format,...)
unsigned char * xen_vm_mem_builtin_read_tid(struct target *target, tid_t tid, ADDR pgd, ADDR addr, unsigned long length, unsigned char *buf)
int memcache_set_mmap(struct memcache *memcache, ADDR tag, ADDR pa, memcache_flags_t flags, void *mem, unsigned long int mem_len)
static uint64_t unsigned int i
int xen_vm_mem_builtin_handle_pause(struct target *target)
int(* init)(struct target *target)
int xen_vm_mem_builtin_handle_exception_ours(struct target *target)
struct malloc_state * mstate
int xen_vm_mem_builtin_addr_v2p(struct target *target, tid_t tid, ADDR pgd, ADDR vaddr, ADDR *paddr)
#define verror(format,...)
#define vwarn(format,...)
unsigned int clear_mem_caches_each_exception
struct xen_vm_mem_ops xen_vm_mem_ops_builtin
int xen_vm_mem_builtin_fini(struct target *target)
unsigned long xen_vm_mem_builtin_write_tid(struct target *target, tid_t tid, ADDR pgd, ADDR addr, unsigned long length, unsigned char *buf)
int xen_vm_mem_builtin_attach(struct target *target)
int memcache_get_v2p(struct memcache *memcache, ADDR tag, ADDR va, ADDR *pa, void **tag_priv)
int memcache_set_v2p(struct memcache *memcache, ADDR tag, ADDR va, ADDR pa)
void * mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)
struct memcache * memcache
unsigned long int memcache_lru_evict_mmap(struct memcache *memcache, ADDR tag, memcache_flags_t flags, unsigned long int mem_len)
void memcache_destroy(struct memcache *memcache)
unsigned char * xen_vm_mem_builtin_read_phys_str(struct target *target, ADDR addr)
#define vdebug(devel, areas, flags, format,...)
int memcache_invalidate_all(struct memcache *memcache)
void * realloc(void *ptr, size_t size)
unsigned char * xen_vm_mem_builtin_read_phys(struct target *target, ADDR paddr, unsigned long length, unsigned char *buf)
int xen_vm_mem_builtin_init(struct target *target)
void * calloc(size_t nmemb, size_t size)
unsigned long int memcache_mmap_size
struct memcache * memcache_create(unsigned long int max_v2p, unsigned long int max_mmap_size, memcache_tag_priv_dtor pdtor)
void memcache_inc_ticks(struct memcache *memcache, unsigned int new_ticks)
struct target_spec * spec
void * malloc(size_t size)
unsigned char * xen_vm_mem_builtin_read_v_str(struct target *target, tid_t tid, ADDR pgd, ADDR addr)
int xen_vm_mem_builtin_handle_exception_any(struct target *target)
unsigned long xen_vm_mem_builtin_write_phys(struct target *target, ADDR paddr, unsigned long length, unsigned char *buf)