-# Makefile for GeekOS kernel, userspace, and tools
+# Top level Makefile for V3Vee
#
# Northwestern University
# (c) 2008, Jack Lange <jarusl@cs.northwestern.edu>
# (c) 2008, Lei Xia <xiaxlei@gmail.com>
# (c) 2008, The V3VEE Project <http://www.v3vee.org>
#
-# Based on GeekOS Makefile:
-# Copyright (c) 2004,2005 David H. Hovemeyer <daveho@cs.umd.edu>
-# $Revision: 1.71 $
-
-
-# This is free software. You are permitted to use,
-# redistribute, and modify it as specified in the file "COPYING".
-
-# Required software to build GeekOS:
+# Required software to build V3Vee:
# - GNU Make (http://www.gnu.org/software/make)
-# - gcc 2.95.2 generating code for target (i386/ELF) and host platforms
# - nasm (http://nasm.sourceforge.net)
# - Perl5, AWK (any version), egrep
#
-# Cygwin (http://cygwin.com) may be used to build GeekOS.
-# Make sure that gcc, binutils, nasm, and perl are installed.
-# NOTES:
-# - This makefile has been written carefully to work correctly
-# with the -j (parallel make) option. I regularly use "make -j 2"
-# to speed the build process on 2 processor systems.
-# ----------------------------------------------------------------------
-# Configuration -
-# Various options specifying how GeekOS should be built,
-# what source files to build, which user programs to build,
-# etc. This is generally the only section of the makefile
-# that will need to be modified.
-# ----------------------------------------------------------------------
+
PROJECT_ROOT := ..
PALACIOS_BUILD_DIR := $(PROJECT_ROOT)/palacios/build
GEEKOS_BUILD_DIR := $(PROJECT_ROOT)/geekos/build
endif
+ifeq ($(PROFILE_VMM),1)
+ GEEKOS_FLAGS:= $(GEEKOS_FLAGS) PROFILE_VMM=1
+endif
+
+
# ----------------------------------------------------------------------
# Targets -
# Specifies files to be built
cp $(PALACIOS_BUILD_DIR)/libv3vee.a $(GEEKOS_BUILD_DIR)/palacios/
cp $(PALACIOS_BUILD_DIR)/../lib/xed/libxed.a $(GEEKOS_BUILD_DIR)/palacios/
cp $(PALACIOS_BUILD_DIR)/vm_kernel $(GEEKOS_BUILD_DIR)/palacios/
- (cd $(GEEKOS_BUILD_DIR) && make)
+ (cd $(GEEKOS_BUILD_DIR) && make $(GEEKOS_FLAGS))
geekos-full: palacios-full32
cp $(PALACIOS_BUILD_DIR)/libv3vee.a $(GEEKOS_BUILD_DIR)/palacios/
cp $(PALACIOS_BUILD_DIR)/../lib/xed/libxed.a $(GEEKOS_BUILD_DIR)/palacios/
cp $(PALACIOS_BUILD_DIR)/vm_kernel $(GEEKOS_BUILD_DIR)/palacios/
- (cd $(GEEKOS_BUILD_DIR) && make clean && make)
+ (cd $(GEEKOS_BUILD_DIR) && make clean && make $(GEEKOS_FLAGS))
world: geekos-full palacios-full64
info->profiler.start_time = 0;
info->profiler.end_time = 0;
+ info->profiler.guest_pf_cnt = 0;
info->profiler.root.rb_node = NULL;
}
insert_event(info, evt);
}
- evt->handler_time += time;
+
+
+ evt->handler_time = (evt->handler_time * .99) + (time * .01);
+
+
evt->exit_count++;
info->profiler.total_exits++;
struct exit_event * evt = NULL;
struct rb_node * node = v3_rb_first(&(info->profiler.root));
+ PrintDebug("GUEST_PF: %u\n", info->profiler.guest_pf_cnt);
+
do {
evt = rb_entry(node, struct exit_event, tree_node);
const char * code_str = vmexit_code_to_str(evt->exit_code);
static void inject_guest_pf(struct guest_info * info, addr_t fault_addr, pf_error_t error_code) {
+ if (info->enable_profiler) {
+ info->profiler.guest_pf_cnt++;
+ }
+
info->ctrl_regs.cr2 = fault_addr;
v3_raise_exception_with_error(info, PF_EXCEPTION, *(uint_t *)&error_code);
}
shadow_pde->pt_base_addr = PAGE_BASE_ADDR((addr_t)V3_PAddr(shadow_pt));
if (guest_pde->large_page == 0) {
+ pte32_t * guest_pt = NULL;
shadow_pde->writable = guest_pde->writable;
+
+ if (guest_pa_to_host_va(info, BASE_TO_PAGE_ADDR(guest_pde->pt_base_addr), (addr_t*)&guest_pt) == -1) {
+ // Machine check the guest
+ PrintDebug("Invalid Guest PTE Address: 0x%p\n", (void *)BASE_TO_PAGE_ADDR(guest_pde->pt_base_addr));
+ v3_raise_exception(info, MC_EXCEPTION);
+ return 0;
+ }
+
+ if (handle_shadow_pte32_fault(info, fault_addr, error_code, shadow_pt, guest_pt) == -1) {
+ PrintError("Error handling Page fault caused by PTE\n");
+ return -1;
+ }
} else {
// ?? What if guest pde is dirty a this point?
((pde32_4MB_t *)guest_pde)->dirty = 0;
if (guest_pde->large_page == 0) {
pte32_t * guest_pt = NULL;
+
if (guest_pa_to_host_va(info, BASE_TO_PAGE_ADDR(guest_pde->pt_base_addr), (addr_t*)&guest_pt) == -1) {
// Machine check the guest
PrintDebug("Invalid Guest PTE Address: 0x%p\n", (void *)BASE_TO_PAGE_ADDR(guest_pde->pt_base_addr));