Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


added inspection framework
[palacios.git] / palacios / src / palacios / vm_guest.c
index 7a10e66..b8cc549 100644 (file)
@@ -361,6 +361,40 @@ void v3_print_guest_state_all(struct v3_vm_info * vm) {
     V3_Print("\n");    
 }
 
+static void print_real_mode_stack(struct guest_info *info)
+{
+    uint16_t ss;
+    uint16_t sp;
+    addr_t   addr;
+    addr_t   host_addr;
+    int      i;
+
+
+    ss = info->segments.ss.selector & 0xffff;
+    sp = info->vm_regs.rsp & 0xffff;
+    addr = (((uint32_t)ss)<<4) + sp;
+
+   
+    V3_Print("Real Mode Stack starting at 0x%x:0x%x (0x%p):\n",ss,sp,(void*)addr);
+
+    if (info->mem_mode!=PHYSICAL_MEM) {
+       PrintError("Cannot print real mode stack when virtual memory active\n");
+       return;
+    }
+       
+    for (i=0;i<=24;i++,sp+=2) { 
+       // note that it's correct for this to wrap around
+       addr = (((uint32_t)ss)<<4) + sp;
+       if (v3_gpa_to_hva(info,addr,&host_addr)) { 
+           PrintError("Could not translate physical stack address 0x%p\n",(void*)addr);
+           return;
+       }
+       V3_Print("\t0x%.4x\n",*((uint16_t*)host_addr));
+    }
+}
+       
+
+
 
 void v3_print_stack(struct guest_info * info) {
     addr_t linear_addr = 0;
@@ -369,9 +403,16 @@ void v3_print_stack(struct guest_info * info) {
     v3_cpu_mode_t cpu_mode = v3_get_vm_cpu_mode(info);
 
 
+    if (cpu_mode==REAL) { 
+       print_real_mode_stack(info);
+       return;
+    }
+
+    // protected mode, 32 or 64 bit
+
     linear_addr = get_addr_linear(info, info->vm_regs.rsp, &(info->segments.ss));
  
-    V3_Print("Stack  at %p:\n", (void *)linear_addr);
+    V3_Print("Stack at %p:\n", (void *)linear_addr);
    
     if (info->mem_mode == PHYSICAL_MEM) {
        if (v3_gpa_to_hva(info, linear_addr, &host_addr) == -1) {
@@ -391,8 +432,6 @@ void v3_print_stack(struct guest_info * info) {
     for (i = 0; i <= 24; i++) {
        if (cpu_mode == LONG) {
            V3_Print("\t%p\n", (void *)*(addr_t *)(host_addr + (i * 8)));
-       } else if (cpu_mode == REAL) {
-           V3_Print("Don't currently handle 16 bit stacks... \n");
        } else {
            // 32 bit stacks...
            V3_Print("\t%.8x\n", *(uint32_t *)(host_addr + (i * 4)));
@@ -491,6 +530,10 @@ int v3_init_vm(struct v3_vm_info * vm) {
        v3_set_foreground_vm(vm);
     }
 
+#ifdef CONFIG_INSPECTOR
+    v3_init_inspector(vm);
+#endif
+
 #ifdef CONFIG_TELEMETRY
     v3_init_telemetry(vm);
 #endif
@@ -618,6 +661,10 @@ int v3_init_core(struct guest_info * core) {
     v3_cpu_arch_t cpu_type = v3_get_cpu_type(V3_Get_CPU());
     struct v3_vm_info * vm = core->vm_info;
 
+#ifdef CONFIG_INSPECTOR
+    v3_init_inspector_core(core);
+#endif
+
     /*
      * Initialize the subsystem data strutures
      */