From: Jack Lange Date: Wed, 4 Mar 2009 00:38:54 +0000 (-0600) Subject: fixed a number of bugs due to the update X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=e63caa4c57933b3b38f498fea015785f8869c5ef fixed a number of bugs due to the update --- diff --git a/palacios/build/Makefile b/palacios/build/Makefile index 0d114cd..bf527cd 100644 --- a/palacios/build/Makefile +++ b/palacios/build/Makefile @@ -320,9 +320,11 @@ DEVICES_OBJS := \ devices/os_debug.o \ devices/apic.o \ devices/io_apic.o \ - devices/vnic.o \ devices/vpci.o \ + +# devices/vnic.o \ + $(DEVICES_OBJS) :: EXTRA_CFLAGS = \ $(JRLDEBUG) \ diff --git a/palacios/include/palacios/vmm.h b/palacios/include/palacios/vmm.h index c209185..d5f8fea 100644 --- a/palacios/include/palacios/vmm.h +++ b/palacios/include/palacios/vmm.h @@ -24,7 +24,7 @@ #include #include #include -#include + #ifdef __V3VEE__ @@ -194,23 +194,6 @@ } while(0) \ -#define V3_REGISTER_PKT_DELIVERY(x) ({ \ - int ret = 0; \ - extern struct v3_os_hooks * os_hooks; \ - if ((os_hooks) && (os_hooks)->register_pkt_delivery) { \ - ret = (os_hooks)->register_pkt_delivery(x); \ - } \ - ret; \ - }) - -#define V3_SEND_PKT(x, y) ({ \ - int ret = 0; \ - extern struct v3_os_hooks * os_hooks; \ - if ((os_hooks) && (os_hooks)->ne2k_send_packet) { \ - ret = (os_hooks)->ne2k_send_packet(x, y); \ - } \ - ret; \ - }) #define VMM_INVALID_CPU 0 @@ -260,9 +243,7 @@ struct v3_os_hooks { void (*yield_cpu)(void); - //function by network card driver - int (*register_pkt_delivery)(int (*rcvd_fn)(uchar_t *packet, uint_t size)); - int (*ne2k_send_packet)(uchar_t *packet, uint_t size); + }; diff --git a/palacios/src/devices/vnic.c b/palacios/src/devices/vnic.c index dfaaf74..49bbd8b 100644 --- a/palacios/src/devices/vnic.c +++ b/palacios/src/devices/vnic.c @@ -21,6 +21,9 @@ * Virtual NE2K Network Card */ + + + #include #include #include @@ -94,44 +97,101 @@ struct vm_device *current_vnic; +static int vnic_mem_write(struct nic_context * nic_state, + uint32_t addr, + void * src, uint_t length) { + + PrintDebug("wmem addr: %x val: %x\n", addr, val); + + if ((addr < NE2K_PMEM_START) || (addr > NE2K_MEM_SIZE)) -/* - * Host/Network byte conversion functions - * TODO: These are not compiler safe - * TODO: consistent names would be nice... - */ + switch (length) { + case 1: { + uchar_t val = *(uchar_t *)src; + + } + case 2: + case 4: + } -static inline uint16_t cpu2le16(uint16_t val) { - uint16_t p = 0; - uchar_t * p1 = (uchar_t *)&p; +} - p1[0] = val; - p1[1] = val >> 8; - return p; +static void vnic_mem_writeb(struct nic_context * nic_state, + uint32_t addr, + uint32_t val) { + uchar_t tmp = (uchar_t) (val & 0x000000ff); + + if ( (addr < 32) || + ((addr >= NE2K_PMEM_START && addr) < NE2K_MEM_SIZE) ) { + nic_state->mem[addr] = tmp; + } + + PrintDebug("wmem addr: %x val: %x\n", addr, val); } +static void vnic_mem_writew(struct nic_context * nic_state, + uint32_t addr, + uint32_t val) { -static inline uint32_t cpu2le32(uint32_t val) { - uint32_t p = 0; - uchar_t * p1 = (uchar_t *)&p; + addr &= ~1; //XXX: check exact behaviour if not even - p1[0] = val; - p1[1] = val >> 8; - p1[2] = val >> 16; - p1[3] = val >> 24; + if ( (addr < 32) || + ((addr >= NE2K_PMEM_START && addr) < NE2K_MEM_SIZE)) { + *(ushort_t *)(nic_state->mem + addr) = cpu2le16(val); + } - return p; + PrintDebug("wmem addr: %x val: %x\n", addr, val); } -static inline uint16_t le16_to_cpu(const uint16_t * p) { - const uchar_t * p1 = (const uchar_t *)p; - return p1[0] | (p1[1] << 8); +static void vnic_mem_writel(struct nic_context * nic_state, + uint32_t addr, + uint32_t val) { + addr &= ~1; // XXX: check exact behaviour if not even + + if ( (addr < 32) || + ( (addr >= NE2K_PMEM_START) && (addr < NE2K_MEM_SIZE) ) ) { + *(uint32_t *)(nic_state->mem + addr) = cpu2le32(val); + } + + PrintDebug("wmem addr: %x val: %x\n", addr, val); +} + +static uchar_t vnic_mem_readb(struct nic_context * nic_state, uint32_t addr) { + PrintDebug("rmem addr: %x\n", addr); + + if ( (addr < 32) || + ( (addr >= NE2K_PMEM_START) && (addr < NE2K_MEM_SIZE)) ) { + return nic_state->mem[addr]; + } else { + return 0xff; + } +} + +static ushort_t vnic_mem_readw(struct nic_context * nic_state, uint32_t addr) { + PrintDebug("rmem addr: %x\n", addr); + + addr &= ~1; //XXX: check exact behaviour if not even + + if ( (addr < 32) || + ( (addr >= NE2K_PMEM_START) && (addr < NE2K_MEM_SIZE))) { + return (ushort_t)le16_to_cpu((ushort_t *)(nic_state->mem + addr)); + } else { + return 0xffff; + } } -static inline uint32_t le32_to_cpu(const uint32_t *p) { - const uchar_t * p1 = (const uchar_t *)p; - return p1[0] | (p1[1] << 8) | (p1[2] << 16) | (p1[3] << 24); +static uint32_t vnic_mem_readl(struct nic_context * nic_state, uint32_t addr) { + PrintDebug("rmem addr: %x\n", addr); + + addr &= ~1; //XXX: check exact behaviour if not even + + if ( (addr < 32) || + ( (addr >= NE2K_PMEM_START && addr < NE2K_MEM_SIZE))) { + return (uint32_t)le32_to_cpu((uint32_t *)(nic_state->mem + addr)); + } else { + return 0xffffffff; + } } @@ -744,81 +804,6 @@ static int vnic_ioport_read(ushort_t port, void * dst, uint_t length, struct vm_ -static void vnic_mem_writeb(struct nic_context * nic_state, - uint32_t addr, - uint32_t val) { - uchar_t tmp = (uchar_t) (val & 0x000000ff); - - if ( (addr < 32) || - ((addr >= NE2K_PMEM_START && addr) < NE2K_MEM_SIZE) ) { - nic_state->mem[addr] = tmp; - } - - PrintDebug("wmem addr: %x val: %x\n", addr, val); -} - -static void vnic_mem_writew(struct nic_context * nic_state, - uint32_t addr, - uint32_t val) { - - addr &= ~1; //XXX: check exact behaviour if not even - - if ( (addr < 32) || - ((addr >= NE2K_PMEM_START && addr) < NE2K_MEM_SIZE)) { - *(ushort_t *)(nic_state->mem + addr) = cpu2le16(val); - } - - PrintDebug("wmem addr: %x val: %x\n", addr, val); -} - -static void vnic_mem_writel(struct nic_context * nic_state, - uint32_t addr, - uint32_t val) { - addr &= ~1; // XXX: check exact behaviour if not even - - if ( (addr < 32) || - ( (addr >= NE2K_PMEM_START) && (addr < NE2K_MEM_SIZE) ) ) { - *(uint32_t *)(nic_state->mem + addr) = cpu2le32(val); - } - - PrintDebug("wmem addr: %x val: %x\n", addr, val); -} - -static uchar_t vnic_mem_readb(struct nic_context * nic_state, uint32_t addr) { - PrintDebug("rmem addr: %x\n", addr); - - if ( (addr < 32) || - ( (addr >= NE2K_PMEM_START) && (addr < NE2K_MEM_SIZE)) ) { - return nic_state->mem[addr]; - } else { - return 0xff; - } -} - -static ushort_t vnic_mem_readw(struct nic_context * nic_state, uint32_t addr) { - PrintDebug("rmem addr: %x\n", addr); - - addr &= ~1; //XXX: check exact behaviour if not even - if ( (addr < 32) || - ( (addr >= NE2K_PMEM_START) && (addr < NE2K_MEM_SIZE))) { - return (ushort_t)le16_to_cpu((ushort_t *)(nic_state->mem + addr)); - } else { - return 0xffff; - } -} - -static uint32_t vnic_mem_readl(struct nic_context * nic_state, uint32_t addr) { - PrintDebug("rmem addr: %x\n", addr); - - addr &= ~1; //XXX: check exact behaviour if not even - - if ( (addr < 32) || - ( (addr >= NE2K_PMEM_START && addr < NE2K_MEM_SIZE))) { - return (uint32_t)le32_to_cpu((uint32_t *)(nic_state->mem + addr)); - } else { - return 0xffffffff; - } -} static void vnic_dma_update(struct vm_device * dev, int len) { struct nic_context *nic_state = (struct nic_context *)dev->private_data; diff --git a/palacios/src/palacios/svm.c b/palacios/src/palacios/svm.c index fed5fae..377fc44 100644 --- a/palacios/src/palacios/svm.c +++ b/palacios/src/palacios/svm.c @@ -279,7 +279,7 @@ static void Init_VMCB_BIOS(vmcb_t * vmcb, struct guest_info *vm_info) { PrintDebug("NP_Enable at 0x%p\n", (void *)&(ctrl_area->NP_ENABLE)); // Set the Nested Page Table pointer - vm_info->direct_map_pt = ((addr_t)create_passthrough_pts_32(vm_info) & ~0xfff); + vm_info->direct_map_pt = ((addr_t)v3_create_direct_passthrough_pts(vm_info) & ~0xfff); ctrl_area->N_CR3 = vm_info->direct_map_pt; // ctrl_area->N_CR3 = Get_CR3(); diff --git a/palacios/src/palacios/vmm_config.c b/palacios/src/palacios/vmm_config.c index f5ca663..cab9d9e 100644 --- a/palacios/src/palacios/vmm_config.c +++ b/palacios/src/palacios/vmm_config.c @@ -266,7 +266,7 @@ static int setup_devices(struct guest_info * info, struct v3_vm_config * config_ if (use_ramdisk) { PrintDebug("Creating Ramdisk\n"); ramdisk = v3_create_ramdisk(); - cdrom = v3_create_cdrom(ramdisk, config_ptr->ramdisk, config_ptr->ramdisk_size); + cdrom = v3_create_cdrom(ramdisk, config_ptr->ramdisk, config_ptr->ramdisk_size); } diff --git a/palacios/src/palacios/vmm_ctrl_regs.c b/palacios/src/palacios/vmm_ctrl_regs.c index 8966ee7..e36b2fe 100644 --- a/palacios/src/palacios/vmm_ctrl_regs.c +++ b/palacios/src/palacios/vmm_ctrl_regs.c @@ -23,7 +23,7 @@ #include #include #include - +#include #ifndef DEBUG_CTRL_REGS #undef PrintDebug @@ -473,7 +473,7 @@ int v3_handle_cr4_write(struct guest_info * info) { delete_page_tables_32((pde32_t *)V3_VAddr((void *)(info->direct_map_pt))); // create 32 bit PAE direct map page table - info->direct_map_pt = (addr_t)V3_PAddr(create_passthrough_pts_32PAE(info)); + info->direct_map_pt = (addr_t)V3_PAddr((void *)v3_create_direct_passthrough_pts(info)); // reset cr3 to new page tables info->ctrl_regs.cr3 = *(addr_t*)&(info->direct_map_pt);