2 * This file is part of the Palacios Virtual Machine Monitor developed
3 * by the V3VEE Project with funding from the United States National
4 * Science Foundation and the Department of Energy.
6 * The V3VEE Project is a joint project between Northwestern University
7 * and the University of New Mexico. You can find out more at
10 * Copyright (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
11 * Copyright (c) 2008, The V3VEE Project <http://www.v3vee.org>
12 * All rights reserved.
14 * Author: Jack Lange <jarusl@cs.northwestern.edu>
16 * This is free software. You are permitted to use,
17 * redistribute, and modify it as specified in the file "V3VEE_LICENSE".
19 #include <palacios/vmm.h>
20 #include <palacios/vmm_symmod.h>
21 #include <palacios/vmm_symbiotic.h>
22 #include <palacios/vm_guest.h>
24 static struct hashtable * master_mod_table = NULL;
27 static uint_t mod_hash_fn(addr_t key) {
28 char * name = (char *)key;
29 return v3_hash_buffer((uchar_t *)name, strlen(name));
32 static int mod_eq_fn(addr_t key1, addr_t key2) {
33 char * name1 = (char *)key1;
34 char * name2 = (char *)key2;
36 return (strcmp(name1, name2) == 0);
41 int V3_init_symmod() {
42 extern struct v3_sym_module __start__v3_modules[];
43 extern struct v3_sym_module __stop__v3_modules[];
44 struct v3_sym_module * tmp_mod = __start__v3_modules;
47 master_mod_table = v3_create_htable(0, mod_hash_fn, mod_eq_fn);
49 while (tmp_mod != __stop__v3_modules) {
51 if (v3_htable_search(master_mod_table, (addr_t)(tmp_mod->name))) {
52 PrintError("Multiple instances of Module (%s)\n", tmp_mod->name);
57 PrintDebug("Registering Symbiotic Module (%s)\n", tmp_mod->name);
59 if (v3_htable_insert(master_mod_table,
60 (addr_t)(tmp_mod->name),
61 (addr_t)(tmp_mod)) == 0) {
62 PrintError("Could not insert module %s to master list\n", tmp_mod->name);
67 tmp_mod = &(__start__v3_modules[++i]);
76 int v3_init_symmod_vm(struct v3_vm_info * info, v3_cfg_tree_t * cfg) {
82 int v3_set_symmod_loader(struct v3_vm_info * vm, struct v3_symmod_loader_ops * ops, void * priv_data) {
83 struct v3_symmod_state * symmod_state = &(vm->sym_vm_state.symmod_state);
85 symmod_state->loader_ops = ops;
86 symmod_state->loader_data = priv_data;
95 int v3_load_sym_module(struct v3_vm_info * vm, char * mod_name) {
96 struct v3_symmod_state * symmod_state = &(vm->sym_vm_state.symmod_state);
97 struct v3_sym_module * mod = (struct v3_sym_module *)v3_htable_search(master_mod_table, (addr_t)mod_name);
100 PrintError("Could not find module %s\n", mod_name);
104 PrintDebug("Loading Module (%s)\n", mod_name);
106 return symmod_state->loader_ops->load_module(vm, mod->name, mod->end_addr - mod->start_addr, symmod_state->loader_data);
112 struct v3_sym_module * v3_get_sym_module(struct v3_vm_info * vm, char * name) {
113 struct v3_sym_module * mod = (struct v3_sym_module *)v3_htable_search(master_mod_table, (addr_t)name);
117 PrintError("Could not find module %s\n", name);