[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] Windows domain boot failure
Hi all, When I tried to boot three windows domains continuously, the Windows domain created first failed to boot. The qemu-dm process was terminated with Segmentation fault. The reproduction procedure is below. # xm create xxx # xm create yyy # xm create zzz Environment : Machine : Tiger4 with 2 phycical CPU (4 CPU core) Dom0 OS : RHEL5 Guest OS : Windows 2003Server EE SP1 Dom0 VCPUs : 1 Windows Domain VCPUs : 1 I am using RHEL5, but there is the same problem in Xen, I think. The cause is seems to be in the IDE emulation code. tools/ioemu/hw/ide.c : (1)The IDE DMA process starts by ide_dma_start(). "bm->ide_if" and "bm->dma_cb" are set here. static void ide_dma_start(IDEState *s, IDEDMAFunc *dma_cb) { BMDMAState *bm = s->bmdma; if(!bm) return; bm->ide_if = s; bm->dma_cb = dma_cb; if (bm->status & BM_STATUS_DMAING) { ide_dma_loop(bm); } } (2)The other thread receives the DMA request and starts memory copy. "bm->dma_cb" and "bm->ide_if" are referred by the thread. dma_thread_loop() : cpu_physical_memory_read(cur_addr, (uint8_t *)&prd, 8); prd.addr = le32_to_cpu(prd.addr); prd.size = le32_to_cpu(prd.size); #ifdef DEBUG_IDE printf("ide: dma: prd: %08x: addr=0x%08x size=0x%08x\n", (int)cur_addr, prd.addr, prd.size); #endif len = prd.size & 0xfffe; if (len == 0) len = 0x10000; while (len > 0) { len1 = bm->dma_cb(bm->ide_if, prd.addr, len); if (len1 == 0) goto the_end; prd.addr += len1; len -= len1; } (3)The ide_dma_start() is called for the next DMA request before the thread has not finished the memory copy for the previous DMA request. When the thread finishes memory copy, "bm->dma_cb" and "bm->ide_if" set to NULL in ide_dma_finish(). static void ide_dma_finish(BMDMAState *bm) { IDEState *s = bm->ide_if; bm->status &= ~BM_STATUS_DMAING; bm->status |= BM_STATUS_INT; bm->dma_cb = NULL; bm->ide_if = NULL; #ifdef DMA_MULTI_THREAD ide_set_irq(s); #endif /* DMA_MULTI_THREAD */ } (4)The qemu-dm process is terminated with Segmentation fault because the "bm->dma_cb" and "bm->ide_if" are set to NULL. I am not sure how to correct this code. And I can not understand why this problem does not occur with linux domain. Any help is appreciated. Thanks, Naoki Takayama _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |