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)