From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.33) id 1CeKYv-0006gQ-9N for qemu-devel@nongnu.org; Tue, 14 Dec 2004 16:50:29 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.33) id 1CeKYt-0006g3-UN for qemu-devel@nongnu.org; Tue, 14 Dec 2004 16:50:28 -0500 Received: from [129.104.30.34] (helo=mx1.polytechnique.org) by monty-python.gnu.org with esmtp (Exim 4.34) id 1CeKOg-0000f4-SK for qemu-devel@nongnu.org; Tue, 14 Dec 2004 16:39:55 -0500 Message-ID: <41BF5DBF.2050101@bellard.org> Date: Tue, 14 Dec 2004 22:40:15 +0100 From: Fabrice Bellard MIME-Version: 1.0 Subject: Re: [Qemu-devel] page fault during ins References: In-Reply-To: Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Piotras , qemu-devel@nongnu.org Very interesting remark. If it explains a bug in one OS (for example the win 2000 disk full issue !), then it will become high priority. Another issue could be problems with 'movsw': the CPU could verify that it can write before doing the read to avoid restarting problems when talking to memory mapped devices... Fabrice. Piotras wrote: > Hi! > > The current implementation of ins (Input from Port to String) is > not-restartable. If page fault occurs during write, the port read > is redone and for some devices this may give unexpected results. > > This is different from what real CPU does. From my tests with > Pentium II it seems that the CPU first makes sure that data can > be written, and then issue IO read. I'm attaching my test program > -- it may do harm to your system, so be very careful. The test > assumes that there is a CDROM connected as master to second > IDE controller (hdc). > > > Regards, > > Piotrek > > > ------------------------------------------------------------------------ > > #include > #include > #include > #include > #include > > > uint16_t *data; > > void segv() > { > printf("SEGV\n"); > data = mmap(data, 4096, PROT_READ | PROT_WRITE, > MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); > if (data == MAP_FAILED) { > exit(1); > } > } > > int main() > { > int i; > unsigned char v; > > data = mmap(0, 4096, PROT_NONE, > MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > if (data == MAP_FAILED) { > exit(1); > } > signal(SIGSEGV, segv); > > iopl(3); > > do { > v = inb(0x0177); > } while ((v & 0xc0) != 0x40); > outb(0x00, 0x0176); > outb(0xa1, 0x0177); > do { > v = inb(0x0177); > } while ((v & 0x08) != 0x08); > insw(0x0170, data, 256); > for(i = 0; i < 256; ++ i) { > printf("%04x%c", data[i], (i % 8 != 7)? ' ': '\n'); > } > } > > > ------------------------------------------------------------------------ > > _______________________________________________ > Qemu-devel mailing list > Qemu-devel@nongnu.org > http://lists.nongnu.org/mailman/listinfo/qemu-devel