From: Fabrice Bellard <fabrice@bellard.org>
To: Piotras <piotras@gmail.com>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] page fault during ins
Date: Tue, 14 Dec 2004 22:40:15 +0100 [thread overview]
Message-ID: <41BF5DBF.2050101@bellard.org> (raw)
In-Reply-To: <da63183704121306524ea9ac3d@mail.gmail.com>
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 <sys/io.h>
> #include <sys/mman.h>
> #include <signal.h>
> #include <stdio.h>
> #include <stdint.h>
>
>
> 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
next prev parent reply other threads:[~2004-12-14 21:50 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-12-13 14:52 [Qemu-devel] page fault during ins Piotras
2004-12-14 21:40 ` Fabrice Bellard [this message]
2004-12-14 22:29 ` malc
2004-12-15 8:17 ` Piotras
2004-12-17 0:07 ` Mark Williamson
2004-12-23 8:45 ` Benjamin Herrenschmidt
2004-12-15 8:22 ` Piotras
-- strict thread matches above, loose matches on Subject: below --
2004-12-15 18:36 Juergen Keil
2004-12-15 20:07 ` Piotras
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=41BF5DBF.2050101@bellard.org \
--to=fabrice@bellard.org \
--cc=piotras@gmail.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).