From: Peter Dinda Date: Thu, 16 Jun 2011 17:56:21 +0000 (-0500) Subject: Merge branch 'devel' of palacios@newskysaw.cs.northwestern.edu:/home/palacios/palacio... X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=commitdiff_plain;h=3de2fb2103ceb8bb1837aa1432a18ff976880dbc;hp=3c56980fa7fe8d42610dbbcf067689cc005a5d6e;p=palacios-OLD.git Merge branch 'devel' of palacios@newskysaw.cs.northwestern.edu:/home/palacios/palacios into devel Conflicts: palacios/src/palacios/svm.c --- diff --git a/palacios/src/devices/atapi.h b/palacios/src/devices/atapi.h index 7d68c90..f32ed8d 100644 --- a/palacios/src/devices/atapi.h +++ b/palacios/src/devices/atapi.h @@ -148,7 +148,7 @@ static int atapi_update_data_buf(struct ide_internal * ide, struct ide_channel * case 0x28: // read(10) case 0xa8: // read(12) - // Update lba address to point to next block + // Update lba address to point to next block drive->current_lba++; // read the next block @@ -170,7 +170,7 @@ static int atapi_read10(struct guest_info * core, uint32_t lba = be_to_le_32(cmd->lba); uint16_t xfer_len = be_to_le_16(cmd->xfer_len); - PrintDebug("READ10: XferLen=%d\n", xfer_len); + PrintDebug("READ10: XferLen=%d ; LBA=%x \n", xfer_len, lba ); /* Check if cd is ready * if not: atapi_cmd_error(... ATAPI_SEN_NOT_RDY, ASC_MEDIA_NOT_PRESENT) diff --git a/palacios/src/devices/generic.c b/palacios/src/devices/generic.c index 8fd525c..9c9b290 100644 --- a/palacios/src/devices/generic.c +++ b/palacios/src/devices/generic.c @@ -565,7 +565,7 @@ static int add_mem_range(struct vm_device * dev, addr_t start, addr_t end, gener return -1; } break; - + case GENERIC_IGNORE: if (v3_hook_full_mem(dev->vm, V3_MEM_CORE_ANY, start, end+1, &generic_read_mem_ignore, @@ -578,10 +578,51 @@ static int add_mem_range(struct vm_device * dev, addr_t start, addr_t end, gener PrintError("generic (%s): huh?\n",state->name); break; } + + return 0; +} + + +#if 1 + +//This is a hack for host device testing and will be removed + +static int osdebug_hcall(struct guest_info *core, uint_t hcall_id, void * priv_data) +{ + struct generic_internal * state = (struct generic_internal *)priv_data; + + int msg_len = core->vm_regs.rcx; + addr_t msg_gpa = core->vm_regs.rbx; + int buf_is_va = core->vm_regs.rdx; + int i; + uint8_t c; + + PrintDebug("generic (%s): handling hypercall (len=%d) as sequence of port writes\n", + state->name, msg_len); + + + for (i=0;iname); + return -1; + } + } else { + if (v3_read_gpa_memory(core, msg_gpa+i, 1, &c) != 1) { + PrintError("generic (%s): Could not read debug message\n",state->name); + return -1; + } + } + if (generic_write_port_print_and_passthrough(core,0xc0c0,&c,1,priv_data)!=1) { + PrintError("generic (%s): write port passthrough failed\n",state->name); + return -1; + } + } return 0; } +#endif /* @@ -759,6 +800,14 @@ static int generic_init(struct v3_vm_info * vm, v3_cfg_tree_t * cfg) { mem_cfg = v3_cfg_next_branch(port_cfg); } + +#if 1 + // hack for os debug testing + if (strcasecmp(state->name,"os debug")==0) { + PrintDebug("generic (%s): adding hypercall for os debug device\n", state->name); + v3_register_hypercall(vm,0xc0c0,osdebug_hcall,state); + } +#endif PrintDebug("generic (%s): initialization complete\n", state->name); diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index 7d7b43c..03a99f5 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -569,6 +569,14 @@ int v3_svm_enter(struct guest_info * info) { // Conditionally yield the CPU if the timeslice has expired v3_yield_cond(info); + { + int ret = v3_handle_svm_exit(info, exit_code, exit_info1, exit_info2); + + if (ret != 0) { + PrintError("Error in SVM exit handler (ret=%d)\n", ret); + PrintError(" last Exit was %d (exit code=0x%llx)\n", v3_last_exit, (uint64_t) exit_code); + return -1; + } if (v3_handle_svm_exit(info, exit_code, exit_info1, exit_info2) != 0) { PrintError("Error in SVM exit handler\n"); PrintError(" last exit was %d\n", v3_last_exit); diff --git a/palacios/src/palacios/svm_wbinvd.c b/palacios/src/palacios/svm_wbinvd.c index c8c11e6..eb8a35f 100644 --- a/palacios/src/palacios/svm_wbinvd.c +++ b/palacios/src/palacios/svm_wbinvd.c @@ -35,7 +35,7 @@ int v3_handle_svm_wbinvd(struct guest_info * info) { v3_raise_exception(info, GPF_EXCEPTION); } else { info->rip += 2; - asm("wbinvd"); + asm volatile ("wbinvd" ::: "memory"); } return 0;