X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fiface-code-inject.c;h=34c3e6ae292f190e55f9a1885dc648d5692876cb;hb=d22c11cec4e8c3390bfe6bf16ed07f5d073f0d4a;hp=ff633261a73e7964002f669649ae8648dabcb81f;hpb=5aa80b40b7bd2ab3e2de1f9cb6851cdec6963f79;p=palacios.git diff --git a/linux_module/iface-code-inject.c b/linux_module/iface-code-inject.c index ff63326..34c3e6a 100644 --- a/linux_module/iface-code-inject.c +++ b/linux_module/iface-code-inject.c @@ -7,7 +7,6 @@ #include #include -#include #include @@ -43,8 +42,8 @@ static void free_inject_data (void) { for(i = 0; i < MAX_INJ; i++) { if (top_map[i]) { - kfree(top_map[i]->elf_data); - kfree(top_map[i]); + palacios_free(top_map[i]->elf_data); + palacios_free(top_map[i]); } } } @@ -55,16 +54,17 @@ static int vm_tophalf_inject (struct v3_guest * guest, unsigned int cmd, unsigne struct top_half_data top_arg; struct top_half_data * top; - top = kmalloc(sizeof(struct top_half_data), GFP_KERNEL); - if (IS_ERR(top)) { - printk("Palacios Error: could not allocate space for top half data\n"); + top = palacios_alloc(sizeof(struct top_half_data)); + if (!top) { + ERROR("Palacios Error: could not allocate space for top half data\n"); return -EFAULT; } memset(top, 0, sizeof(struct top_half_data)); - printk("Palacios: Loading ELF data...\n"); + INFO("Palacios: Loading ELF data...\n"); if (copy_from_user(&top_arg, (void __user *)arg, sizeof(struct top_half_data))) { - printk("palacios: error copying ELF from userspace\n"); + ERROR("palacios: error copying ELF from userspace\n"); + palacios_free(top); return -EFAULT; } @@ -74,36 +74,46 @@ static int vm_tophalf_inject (struct v3_guest * guest, unsigned int cmd, unsigne /* we have a binary name */ if (top_arg.is_exec_hooked) { - strcpy(top->bin_file, top_arg.bin_file); + strncpy(top->bin_file, top_arg.bin_file,256); + top->bin_file[255] = 0; top->is_exec_hooked = 1; - printk("top->bin_file is %s\n", top->bin_file); + DEBUG("top->bin_file is %s\n", top->bin_file); } - printk("Palacios: Allocating %lu B of kernel memory for ELF binary data...\n", top->elf_size); - top->elf_data = kmalloc(top->elf_size, GFP_KERNEL); - if (IS_ERR(top->elf_data)) { - printk("Palacios Error: could not allocate space for binary image\n"); + DEBUG("Palacios: Allocating %lu B of kernel memory for ELF binary data...\n", top->elf_size); + top->elf_data = palacios_alloc(top->elf_size); + if (!(top->elf_data)) { + ERROR("Palacios Error: could not allocate space for binary image\n"); + palacios_free(top); return -EFAULT; } memset(top->elf_data, 0, top->elf_size); - printk("Palacios: Copying ELF image into kernel module...\n"); + INFO("Palacios: Copying ELF image into kernel module...\n"); if (copy_from_user(top->elf_data, (void __user *)top_arg.elf_data, top->elf_size)) { - printk("Palacios: Error loading elf data\n"); + ERROR("Palacios: Error loading elf data\n"); + palacios_free(top->elf_data); + palacios_free(top); return -EFAULT; } - if (register_top(top) < 0) + if (register_top(top) < 0) { + ERROR("Cannot register top half\n"); + palacios_free(top->elf_data); + palacios_free(top); return -1; - - printk("Palacios: setting up inject code...\n"); + } + + INFO("Palacios: setting up inject code...\n"); if (v3_insert_code_inject(guest->v3_ctx, top->elf_data, top->elf_size, top->bin_file, top->is_dyn, top->is_exec_hooked, top->func_offset) < 0) { - printk("Palacios Error: error setting up inject code\n"); + ERROR("Palacios Error: error setting up inject code\n"); + palacios_free(top->elf_data); + palacios_free(top); return -1; } - printk("Palacios: injection registration complete\n"); + INFO("Palacios: injection registration complete\n"); return 0; } @@ -126,6 +136,7 @@ static int guest_init_code_inject (struct v3_guest * guest, void ** vm_data) { static int guest_deinit_code_inject (struct v3_guest * guest, void * vm_data) { free_inject_data(); + remove_guest_ctrl(guest, V3_VM_TOPHALF_INJECT); return 0; }