struct palacios_console * cons = priv_data;
int cons_fd = 0;
unsigned long flags;
+ int acquired = 0;
if (cons->open == 0) {
printk("Attempted to connect to unopened console\n");
}
spin_lock_irqsave(&(cons->lock), flags);
+ if (cons->connected == 0) {
+ cons->connected = 1;
+ acquired = 1;
+ }
+ spin_unlock_irqrestore(&(cons->lock), flags);
+
+ if (acquired == 0) {
+ printk("Console already connected\n");
+ return -1;
+ }
cons_fd = anon_inode_getfd("v3-cons", &cons_fops, cons, O_RDWR);
return cons_fd;
}
- cons->connected = 1;
-
v3_deliver_console_event(guest->v3_ctx, NULL);
- spin_unlock_irqrestore(&(cons->lock), flags);
+
printk("Console connected\n");
gcc -static v3_mem.c -o v3_mem
-v3_cons : v3_cons.c v3_ctrl.h
- gcc -static v3_cons.c -o v3_cons -lcurses
+v3_cons : v3_cons.c v3_cons_sc.c v3_ctrl.h
+ gcc v3_cons.c -o v3_cons -lcurses
+ gcc v3_cons_sc.c -o v3_cons_sc -lcurses
v3_stream : v3_stream.c v3_ctrl.h
gcc -static v3_stream.c -o v3_stream
drive->irq_flags.c_d = 0;
channel->status.busy = 0;
- channel->status.data_req = 1;
channel->status.error = 0;
+ if (drive->transfer_length > 0) {
+ channel->status.data_req = 1;
+ }
+
ide_raise_irq(ide, channel);
}
static int atapi_read_chunk(struct ide_internal * ide, struct ide_channel * channel) {
struct ide_drive * drive = get_selected_drive(channel);
- int ret = drive->ops->read(drive->data_buf, drive->current_lba * ATAPI_BLOCK_SIZE, ATAPI_BLOCK_SIZE,
-drive->private_data);
+ int ret = drive->ops->read(drive->data_buf,
+ drive->current_lba * ATAPI_BLOCK_SIZE,
+ ATAPI_BLOCK_SIZE, drive->private_data);
if (ret == -1) {
PrintError("IDE: Error reading CD block (LBA=%p)\n", (void *)(addr_t)(drive->current_lba));
return 0;
}
- if (lba + xfer_len > drive->ops->get_capacity(drive->private_data)) {
+ if ((lba + xfer_len) > (drive->ops->get_capacity(drive->private_data) / ATAPI_BLOCK_SIZE)) {
PrintError("IDE: xfer len exceeded capacity (lba=%d) (xfer_len=%d) (ReadEnd=%d) (capacity=%d)\n",
lba, xfer_len, lba + xfer_len,
(uint32_t)drive->ops->get_capacity(drive->private_data));
return 0;
}
- // PrintDebug("Reading %d blocks from LBA 0x%x\n", xfer_len, lba);
-
+ // PrintDebug("Reading %d blocks from LBA 0x%x\n", xfer_len, lba);
drive->current_lba = lba;
// Update the request length value in the cylinder registers
struct atapi_rd_capacity_resp * resp = (struct atapi_rd_capacity_resp *)(drive->data_buf);
uint32_t capacity = drive->ops->get_capacity(drive->private_data);
- resp->lba = le_to_be_32(capacity);
+ resp->lba = le_to_be_32(capacity / ATAPI_BLOCK_SIZE);
resp->block_len = le_to_be_32(ATAPI_BLOCK_SIZE);
atapi_setup_cmd_resp(ide, channel, sizeof(struct atapi_rd_capacity_resp));
xfer_len = alloc_len;
}
+ V3_Print("ATAPI Get config: xfer_len=%d\b", xfer_len);
+
atapi_setup_cmd_resp(ide, channel, xfer_len);
return 0;
PrintDebug("Reading %d bytes from %p to %p\n", (uint32_t)num_bytes, (uint8_t *)(disk->disk_image + lba), buf);
+ if (lba + num_bytes > disk->capacity) {
+ PrintError("Out of bounds read: lba=%llu, num_bytes=%llu, capacity=%llu\n",
+ lba, num_bytes, disk->capacity);
+ return -1;
+ }
+
return read_all(disk->fd, buf, lba, num_bytes);
}
PrintDebug("Writing %d bytes from %p to %p\n", (uint32_t)num_bytes, buf, (uint8_t *)(disk->disk_image + lba));
+ if (lba + num_bytes > disk->capacity) {
+ PrintError("Out of bounds read: lba=%llu, num_bytes=%llu, capacity=%llu\n",
+ lba, num_bytes, disk->capacity);
+ return -1;
+ }
+
+
return write_all(disk->fd, buf, lba, num_bytes);
}
static uint64_t get_capacity(void * private_data) {
struct disk_state * disk = (struct disk_state *)private_data;
- PrintDebug("Querying RAMDISK capacity %d\n",
+ PrintDebug("Querying FILEDISK capacity %d\n",
(uint32_t)(disk->capacity));
return disk->capacity;
PrintDebug("Attempting to select a non-present drive\n");
channel->error_reg.abort = 1;
channel->status.error = 1;
+ } else {
+ channel->status.busy = 0;
+ channel->status.ready = 1;
+ channel->status.data_req = 0;
+ channel->status.error = 0;
+ channel->status.seek_complete = 1;
+
+ channel->dma_status.active = 0;
+ channel->dma_status.err = 0;
}
break;
return -1;
}
- strncpy(drive->model, model_str, sizeof(drive->model) - 1);
-
+ if (model_str != NULL) {
+ strncpy(drive->model, model_str, sizeof(drive->model) - 1);
+ }
+
if (strcasecmp(type_str, "cdrom") == 0) {
drive->drive_type = BLOCK_CDROM;
PrintDebug("Reading %d bytes from %p to %p\n", (uint32_t)num_bytes, (uint8_t *)(disk->disk_image + lba), buf);
+ if (lba + num_bytes > disk->capacity) {
+ PrintError("read out of bounds: lba=%llu (%p), num_bytes=%llu, capacity=%d (%p)\n",
+ lba, (void *)(addr_t)lba, num_bytes, disk->capacity, (void *)(addr_t)disk->capacity);
+ return -1;
+ }
+
memcpy(buf, (uint8_t *)(disk->disk_image + lba), num_bytes);
return 0;
PrintDebug("Writing %d bytes from %p to %p\n", (uint32_t)num_bytes, buf, (uint8_t *)(disk->disk_image + lba));
+ if (lba + num_bytes > disk->capacity) {
+ PrintError("write out of bounds: lba=%llu (%p), num_bytes=%llu, capacity=%d (%p)\n",
+ lba, (void *)(addr_t)lba, num_bytes, disk->capacity, (void *)(addr_t)disk->capacity);
+ return -1;
+ }
+
+
memcpy((uint8_t *)(disk->disk_image + lba), buf, num_bytes);
return 0;
#include <palacios/vmm_direct_paging.h>
#include <palacios/vmx_io.h>
#include <palacios/vmx_msr.h>
+#include <palacios/vmm_decoder.h>
#include <palacios/vmx_ept.h>
#include <palacios/vmx_assist.h>
v3_yield_cond(info);
if (v3_handle_vmx_exit(info, &exit_info) == -1) {
- PrintError("Error in VMX exit handler\n");
+ PrintError("Error in VMX exit handler (Exit reason=%x)\n", exit_info.exit_reason);
return -1;
}
}
if (v3_vmx_enter(info) == -1) {
+
+ addr_t host_addr;
+ addr_t linear_addr = 0;
+
+ info->vm_info->run_state = VM_ERROR;
+
+ V3_Print("VMX core %u: VMX ERROR!!\n", info->vcpu_id);
+
+ v3_print_guest_state(info);
+
+ V3_Print("VMX core %u\n", info->vcpu_id);
+
+
+
+ linear_addr = get_addr_linear(info, info->rip, &(info->segments.cs));
+
+ if (info->mem_mode == PHYSICAL_MEM) {
+ v3_gpa_to_hva(info, linear_addr, &host_addr);
+ } else if (info->mem_mode == VIRTUAL_MEM) {
+ v3_gva_to_hva(info, linear_addr, &host_addr);
+ }
+
+ V3_Print("VMX core %u: Host Address of rip = 0x%p\n", info->vcpu_id, (void *)host_addr);
+
+ V3_Print("VMX core %u: Instr (15 bytes) at %p:\n", info->vcpu_id, (void *)host_addr);
+ v3_dump_mem((uint8_t *)host_addr, 15);
+
+ v3_print_stack(info);
+
+
v3_print_vmcs();
print_exit_log(info);
return -1;