|
|
|
|
|
|
|
|
|
|
xen-devel
[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
|
<Prev in Thread] |
Current Thread |
[Next in Thread> |
- [Xen-devel] Windows domain boot failure,
Naoki Takayama <=
|
|
|
|
|