All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ефимов Василий" <real@ispras.ru>
To: Paolo Bonzini <pbonzini@redhat.com>, qemu-devel@nongnu.org
Cc: Kirill Batuzov <batuzovk@ispras.ru>,
	"Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 3/3] PAM: make PAM emulation closer to documentation
Date: Fri, 17 Jul 2015 12:50:55 +0300	[thread overview]
Message-ID: <55A8CFFF.30101@ispras.ru> (raw)
In-Reply-To: <55A7EF57.4080306@redhat.com>

16.07.2015 20:52, Paolo Bonzini пишет:
>
>
> On 16/07/2015 16:41, Ефимов Василий wrote:
>> The main problem is rendering memory tree to FlatView.
>
> I don't believe it's necessary to render a memory tree to the FlatView.
>   You can use existing AddressSpaces.
>
>>> +    /* Read from RAM and write to PCI */
>>> +    memory_region_init_io(&pam->region[1], OBJECT(dev), &pam_ops, pam,
>>> +            "pam-r-ram-w-pci", size);
>>>
>>> This can be done with memory_region_set_readonly on the RAM region.  You
>>> need to set mr->ops in order to point to pam_ops; for a first proof of
>>> concept you can just set the field directly.
>> The idea is to read directly from system RAM region and to write
>> to PCI using I/O (because I do not see another way to emulate
>> access type driven redirection with existent API). If we create RAM
>> and make it read only then new useless RAM block will be created.
>
> Don't create RAM; modify the existing one.
>
>> It is useless because of ram_addr of new region will be set to
>> one within system RAM block. Hence, cleaner way is to create I/O region.
>
> You can use the existing RAM region and modify its properties (i.e.
> toggle mr->readonly) after setting special mr->ops.  The special mr->ops
> will be used for writes when mr->readonly = true.
The existing RAMs are ether whole pc.ram or pc.rom and pc.bios beyond
PCI. So, I think we have not invade them. Also, we only need the small 
subrange to be read only. Moreover, if -pflash is used then there is
ROM device instead of pc.bios with its own mr->ops.

You have suggested to create AddressSpace for PCI below. It is flexible
solution which is transparent for existing regions. I suggests to create
AddressSpace for RAM subtree too.  I think, both AS have to be PAM
implementation private for complete transparency for another QEMU parts.

I will try it in next patch version.
>
>>> Writes to the PCI memory space can use the PCI address space, with
>>> address_space_st*.
>> There is no PCI AddressSpace (only MemoryRegion). But
>> address_space_st* requires AddressSpace as argument.
>
> Then create one with address_space_init.
>
> However, can the guest see the difference between "real" mode 1 and the
> "fake" mode 1 that QEMU implements?  Perhaps mode 1 can be left as is.
Yes, guest can.
If -pfalsh is used then BIOS becomes a programmable ROM device. Then
guest can switch to mode 1 and copy data by reading and writing it
at same location. After that guest can switch to mode 0 (or 3) and
copy data to some another place. Then it switches to mode 3 (or 0) and
compares the data.

I just check it with SeaBIOS and original PAM adding code listed below
to fw/shadow.c: __make_bios_writable_intel.

     dprintf(1, "PAM mode 1 test begin\n");
     unsigned *m = (unsigned *) BUILD_ROM_START;

     pci_config_writeb(bdf, pam0 + 1, 0x33);
     *m = 0xdeafbeef;

     pci_config_writeb(bdf, pam0 + 1, 0x11);
     volatile unsigned t = *m;
     *m = t;

     pci_config_writeb(bdf, pam0 + 1, 0x33);
     t = *m;

     pci_config_writeb(bdf, pam0 + 1, 0x00);
     unsigned t2 = *m;

     dprintf(1, "t = 0x%x, t2 = 0x%x\n", t, t2);

     dprintf(1, "PAM mode 1 test end\n");

The output is:

PAM mode 1 test begin
t = 0xdeafbeef, t2 = 0x0
PAM mode 1 test end

With new PAM the output is:

PAM mode 1 test begin
t = 0xdeafbeef, t2 = 0xdeafbeef
PAM mode 1 test end

Note BUILD_ROM_START is 0xc0000 which is pc.rom with write permission
according to info mtree output. The -pflash is not needed.

>
>>> +    /* Read from PCI and write to RAM */
>>> +    memory_region_init_io(&pam->region[2], OBJECT(dev), &pam_ops, pam,
>>> +            "pam-r-pci-w-ram", size);
>>>
>>> Here you cannot run code from ROM, so it can be a pure MMIO region.
>>> Reads can use address_space_ld*, while writes can use
>>> memory_region_get_ram_ptr.
>>
>> Even in this mode it is possible for code to be executed from ROM. This
>> can happen when particular PCI address is within ROM device connected
>> to PCI bus.
>
> If it's just for pc.rom and isa-bios, introduce a new function
> pam_create_pci_region that creates pc.rom with
> memory_region_init_rom_device.  The mr->ops can write to RAM (mode 2) or
> discard the write (mode 0).
>
> They you can make pc.rom 256K instead of 128K, and instead of an alias,
> you can manually copy the last 128K of the BIOS into the last 128K of
> pc.rom.
>
> Some adjustment will be necessary in order to support migration (perhaps
> creating two 128K regions pc.rom and pc.rom.mirror), but for a proof of
> concept the above should be enough.
I will try solution based on address spaces as stated above. It is 
cleaner and more generic.
>
> Paolo
>
Vasily

  reply	other threads:[~2015-07-17  9:51 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-16  8:35 [Qemu-devel] [PATCH 0/3] PAM emulation improvement Efimov Vasily
2015-07-16  8:35 ` [Qemu-devel] [PATCH 1/3] memory: make function invalidate_and_set_dirty public Efimov Vasily
2015-07-16  8:35 ` [Qemu-devel] [PATCH 2/3] memory: make function memory_access_is_direct public Efimov Vasily
2015-07-16  8:35 ` [Qemu-devel] [PATCH 3/3] PAM: make PAM emulation closer to documentation Efimov Vasily
2015-07-16  9:05   ` Paolo Bonzini
2015-07-16 10:51     ` Ефимов Василий
2015-07-16 11:10       ` Paolo Bonzini
2015-07-16 14:41         ` Ефимов Василий
2015-07-16 17:52           ` Paolo Bonzini
2015-07-17  9:50             ` Ефимов Василий [this message]
2015-07-17 10:10               ` Paolo Bonzini

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=55A8CFFF.30101@ispras.ru \
    --to=real@ispras.ru \
    --cc=batuzovk@ispras.ru \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.