All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] target_phys_addr_t vs ram_addr_t
@ 2011-09-02  6:08 Sinha, Ani
  2011-09-03 11:26 ` Blue Swirl
  0 siblings, 1 reply; 4+ messages in thread
From: Sinha, Ani @ 2011-09-02  6:08 UTC (permalink / raw)
  To: qemu-devel; +Cc: Sinha, Ani

Hi Folks :

I am trying to write a virtio driver and towards this end I am looking at
the qemu code. I am a little confused about a few things. Unfortunately,
the few comments in the code does not make it clear for me. So I am
wondering if any kind person on this mailing list would be able to help.

First off, what is the difference between target_phys_addr_t and
ram_addr_t? I believe the former is a virtual address within the guest but
what is the later? The comment says "address in ram (different from
physical address)" but is this the virtual address or the physical
address? Is this for guest or for host?

Secondly, in function cpu_physical_memory_map(), why is the length
parameter an address? If I look at the function virtqueue_map_sg(), the
sg.iov_len is defined as type size_t, which sounds like right. However,
this value is assigned to variable len which is of type
target_phys_addr_t. Is len an address or just a scalar value?

Lastly, in qemu_ram_ptr_length(), what is the length value? What does it
signify?

One more thing. It would really help guys like me if someone can add
comments regarding the various apis, what they do and what the parameters
mean in the code. I thought I'd suggest.

I am not in the mailing list. So please do a reply-all when responding.

Thanks in advance for help,
Ani


============================================================
The information contained in this message may be privileged
and confidential and protected from disclosure. If the reader
of this message is not the intended recipient, or an employee
or agent responsible for delivering this message to the
intended recipient, you are hereby notified that any reproduction,
dissemination or distribution of this communication is strictly
prohibited. If you have received this communication in error,
please notify us immediately by replying to the message and
deleting it from your computer. Thank you. Tellabs
============================================================

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] target_phys_addr_t vs ram_addr_t
  2011-09-02  6:08 [Qemu-devel] target_phys_addr_t vs ram_addr_t Sinha, Ani
@ 2011-09-03 11:26 ` Blue Swirl
  2011-09-03 13:14   ` Peter Maydell
  0 siblings, 1 reply; 4+ messages in thread
From: Blue Swirl @ 2011-09-03 11:26 UTC (permalink / raw)
  To: Sinha, Ani; +Cc: qemu-devel

On Fri, Sep 2, 2011 at 6:08 AM, Sinha, Ani <Ani.Sinha@tellabs.com> wrote:
> Hi Folks :
>
> I am trying to write a virtio driver and towards this end I am looking at
> the qemu code. I am a little confused about a few things. Unfortunately,
> the few comments in the code does not make it clear for me. So I am
> wondering if any kind person on this mailing list would be able to help.
>
> First off, what is the difference between target_phys_addr_t and
> ram_addr_t? I believe the former is a virtual address within the guest but
> what is the later? The comment says "address in ram (different from
> physical address)" but is this the virtual address or the physical
> address? Is this for guest or for host?

target_phys_addr_t is used for guest physical addresses. For example,
i386 guest with PAE would need 36 bits which makes this 64 bit type
(regardless of host address sizes). Devices should usually only use
this type.

ram_addr_t (uintptr_t) is linked to the size of host virtual address
space. Because of how RAM is implemented, we can't give 64 bit guests
more than 4 GB of RAM on a 32 bit host, so in that case it would be 32
bits. On a 64 bit host this can be 64 bits. It can be considered as a
subset of target_phys_addr_t. Normally devices need it only if there
are RAM areas, like frame buffers.

target_ulong is used for guest CPU registers and guest virtual
addresses. In the i386 guest with PAE case, this would remain 32 bits.
For a 64 bit guest, this is a 64 bit type. Normal devices may not use
this since it breaks the layering.

In your virtio case things are a bit more complicated since guest and
host share the same architecture. Paravirtualized devices may break
these rules with caution.

> Secondly, in function cpu_physical_memory_map(), why is the length
> parameter an address? If I look at the function virtqueue_map_sg(), the
> sg.iov_len is defined as type size_t, which sounds like right. However,
> this value is assigned to variable len which is of type
> target_phys_addr_t. Is len an address or just a scalar value?

size_t depends on host address size. Devices can map larger than 4G
physical areas even on a 32 bit host, so target_phys_addr_t must be
used.

> Lastly, in qemu_ram_ptr_length(), what is the length value? What does it
> signify?

The length of the RAM area. RAM can be non-contiguous and base address
may be nonzero.

> One more thing. It would really help guys like me if someone can add
> comments regarding the various apis, what they do and what the parameters
> mean in the code. I thought I'd suggest.

Patches are welcome :)

> I am not in the mailing list. So please do a reply-all when responding.

For many reasons it is a poor idea to develop code in-house without
constant communication to upstream developers, so please keep us
informed of your development (RFC patches etc.) if you intend to
submit it one day.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] target_phys_addr_t vs ram_addr_t
  2011-09-03 11:26 ` Blue Swirl
@ 2011-09-03 13:14   ` Peter Maydell
  2011-09-07 19:25     ` Sinha, Ani
  0 siblings, 1 reply; 4+ messages in thread
From: Peter Maydell @ 2011-09-03 13:14 UTC (permalink / raw)
  To: Blue Swirl; +Cc: Sinha, Ani, qemu-devel

On 3 September 2011 12:26, Blue Swirl <blauwirbel@gmail.com> wrote:
> On Fri, Sep 2, 2011 at 6:08 AM, Sinha, Ani <Ani.Sinha@tellabs.com> wrote:
>> First off, what is the difference between target_phys_addr_t and
>> ram_addr_t? I believe the former is a virtual address within the guest but
>> what is the later? The comment says "address in ram (different from
>> physical address)" but is this the virtual address or the physical
>> address? Is this for guest or for host?
>
> target_phys_addr_t is used for guest physical addresses. For example,
> i386 guest with PAE would need 36 bits which makes this 64 bit type
> (regardless of host address sizes). Devices should usually only use
> this type.
>
> ram_addr_t (uintptr_t) is linked to the size of host virtual address
> space. Because of how RAM is implemented, we can't give 64 bit guests
> more than 4 GB of RAM on a 32 bit host, so in that case it would be 32
> bits. On a 64 bit host this can be 64 bits. It can be considered as a
> subset of target_phys_addr_t. Normally devices need it only if there
> are RAM areas, like frame buffers.

To add to this and point out some particular wrinkles:
Even if on the guest machine RAM doesn't start at physical address
0, the first bit of RAM will generally be at a zero ram_addr_t.
If the guest machine has some RAM that is mapped at two physical
addresses, then both those target_phys_addr_t values will map to
the same ram_addr_t. This is why you can't just cast a ram_addr_t
to a target_phys_addr_t or vice-versa. (This kind of situation
doesn't happen on the PC but does on some of the embedded boards
qemu models.)

I think of ram_addr_t as being "offset into a big lump of host
memory which we have parcelled out to use as guest RAM".

-- PMM

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] target_phys_addr_t vs ram_addr_t
  2011-09-03 13:14   ` Peter Maydell
@ 2011-09-07 19:25     ` Sinha, Ani
  0 siblings, 0 replies; 4+ messages in thread
From: Sinha, Ani @ 2011-09-07 19:25 UTC (permalink / raw)
  To: Peter Maydell; +Cc: Blue Swirl, qemu-devel

Thanks guys for the explanations. I'd try and add some comments to the code explaining the apis once I have a better understanding of the code. Right now I am still digesting the undocumented apis.

ani

On Sep 3, 2011, at 6:14 AM, Peter Maydell wrote:

> On 3 September 2011 12:26, Blue Swirl <blauwirbel@gmail.com> wrote:
>> On Fri, Sep 2, 2011 at 6:08 AM, Sinha, Ani <Ani.Sinha@tellabs.com> wrote:
>>> First off, what is the difference between target_phys_addr_t and
>>> ram_addr_t? I believe the former is a virtual address within the guest but
>>> what is the later? The comment says "address in ram (different from
>>> physical address)" but is this the virtual address or the physical
>>> address? Is this for guest or for host?
>>
>> target_phys_addr_t is used for guest physical addresses. For example,
>> i386 guest with PAE would need 36 bits which makes this 64 bit type
>> (regardless of host address sizes). Devices should usually only use
>> this type.
>>
>> ram_addr_t (uintptr_t) is linked to the size of host virtual address
>> space. Because of how RAM is implemented, we can't give 64 bit guests
>> more than 4 GB of RAM on a 32 bit host, so in that case it would be 32
>> bits. On a 64 bit host this can be 64 bits. It can be considered as a
>> subset of target_phys_addr_t. Normally devices need it only if there
>> are RAM areas, like frame buffers.
>
> To add to this and point out some particular wrinkles:
> Even if on the guest machine RAM doesn't start at physical address
> 0, the first bit of RAM will generally be at a zero ram_addr_t.
> If the guest machine has some RAM that is mapped at two physical
> addresses, then both those target_phys_addr_t values will map to
> the same ram_addr_t. This is why you can't just cast a ram_addr_t
> to a target_phys_addr_t or vice-versa. (This kind of situation
> doesn't happen on the PC but does on some of the embedded boards
> qemu models.)
>
> I think of ram_addr_t as being "offset into a big lump of host
> memory which we have parcelled out to use as guest RAM".
>
> -- PMM
>


============================================================
The information contained in this message may be privileged
and confidential and protected from disclosure. If the reader
of this message is not the intended recipient, or an employee
or agent responsible for delivering this message to the
intended recipient, you are hereby notified that any reproduction,
dissemination or distribution of this communication is strictly
prohibited. If you have received this communication in error,
please notify us immediately by replying to the message and
deleting it from your computer. Thank you. Tellabs
============================================================

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-09-07 19:26 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-09-02  6:08 [Qemu-devel] target_phys_addr_t vs ram_addr_t Sinha, Ani
2011-09-03 11:26 ` Blue Swirl
2011-09-03 13:14   ` Peter Maydell
2011-09-07 19:25     ` Sinha, Ani

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.