X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=palacios%2Fsrc%2Fpalacios%2Fvm_guest_mem.c;h=d05bd397a8f25f38a0ade5c2ee56a5ba540aa63a;hb=e3b62e7befa086a4fb320890952f54667ee46329;hp=810be79b589829909d7371193eb4fbd874f45433;hpb=88b5b2e56e64f1d7f93d6fd225afa8d572387f9c;p=palacios.git diff --git a/palacios/src/palacios/vm_guest_mem.c b/palacios/src/palacios/vm_guest_mem.c index 810be79..d05bd39 100644 --- a/palacios/src/palacios/vm_guest_mem.c +++ b/palacios/src/palacios/vm_guest_mem.c @@ -396,6 +396,41 @@ int v3_read_gpa_memory(struct guest_info * guest_info, addr_t gpa, int count, uc } +/* This clones v3_read_gva_memory + * We write only as far as page translations are available + */ +int v3_write_gva_memory(struct guest_info * guest_info, addr_t gva, int count, uchar_t * src) { + addr_t cursor = gva; + int bytes_written = 0; + + + + while (count > 0) { + int dist_to_pg_edge = (PAGE_ADDR(cursor) + PAGE_SIZE) - cursor; + int bytes_to_copy = (dist_to_pg_edge > count) ? count : dist_to_pg_edge; + addr_t host_addr = 0; + + + if (v3_gva_to_hva(guest_info, cursor, &host_addr) != 0) { + PrintDebug("Invalid GVA(%p)->HVA lookup\n", (void *)cursor); + return bytes_written; + } + + + + memcpy((void*)host_addr, + src + bytes_written, + bytes_to_copy); + + bytes_written += bytes_to_copy; + count -= bytes_to_copy; + cursor += bytes_to_copy; + } + + return bytes_written; +} + + /* This is a straight address conversion + copy,