[Spice-devel] [PATCH spice-server] Use (u)intptr_t for virtual addresses

Frediano Ziglio fziglio at redhat.com
Sun Aug 11 12:12:20 UTC 2019


> Hi
> On 7/23/19 11:22 AM, Frediano Ziglio wrote:

> > When to Say "a" or "an" | Pronunciation | EnglishClub
> 
> > https://www.englishclub.com/pronunciation/a-an.htm
> 
> > On LLP64 platforms (like Windows) a virtual address cannot
> 
> > be represented by a "unsigned long" type, so use uintptr_t
> 
> > which is defined as a integral type large like a pointer.
> 

> This sentence sounds a bit odd to me

> should be integer?
C/C++ documentation classify these types as integral, not integer. 

> also s/a/an
fixed, thanks 

> > "address_delta" is a difference of pointers so use same
> 
> > type size.
> 

> Not a big deal but wouldn't be preferable to be consistent with addr_delta?
It sounds reasonable, although the value came from "addr_delta" field of QXLDevMemSlot 
which is part of SPICE ABI (so cannot be changed). 

> Snir.

> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com> ---
> 
> > server/memslot.c       | 22 ++++++++++++----------
> 
> > server/memslot.h       | 20 ++++++++++----------
> 
> > server/red-parse-qxl.c |  2 +-
> 
> > server/spice-qxl.h     |  4 ++--
> 
> > 4 files changed, 25 insertions(+), 23 deletions(-)
> 

> > diff --git a/server/memslot.c b/server/memslot.c
> 
> > index 2a1771b02..182d2b7e9 100644
> 
> > --- a/server/memslot.c
> 
> > +++ b/server/memslot.c
> 
> > @@ -21,7 +21,7 @@
> 
> > 
> 
> > #include "memslot.h"
> 
> > 
> 
> > -static unsigned long __get_clean_virt(RedMemSlotInfo *info, QXLPHYSICAL
> > addr)
> 
> > +static uintptr_t __get_clean_virt(RedMemSlotInfo *info, QXLPHYSICAL addr)
> 
> > {
> 
> > return addr & info->memslot_clean_virt_mask;
> 
> > }
> 
> > @@ -37,7 +37,8 @@ static void print_memslots(RedMemSlotInfo *info)
> 
> > !info->mem_slots[i][x].virt_end_addr) {
> 
> > continue;
> 
> > }
> 
> > -            printf("id %d, group %d, virt start %lx, virt end %lx,
> > generation %u, delta %lx\n",
> 
> > +            printf("id %d, group %d, virt start %" PRIxPTR ", virt end %"
> > PRIxPTR ", generation %u,"
> 
> > +                   " delta %" PRIxPTR "\n",
> 
> > x, i, info->mem_slots[i][x].virt_start_addr,
> 
> > info->mem_slots[i][x].virt_end_addr, info->mem_slots[i][x].generation,
> 
> > info->mem_slots[i][x].address_delta);
> 
> > @@ -46,7 +47,7 @@ static void print_memslots(RedMemSlotInfo *info)
> 
> > }
> 
> > 
> 
> > /* return 1 if validation successfull, 0 otherwise */
> 
> > -int memslot_validate_virt(RedMemSlotInfo *info, unsigned long virt, int
> > slot_id,
> 
> > +int memslot_validate_virt(RedMemSlotInfo *info, uintptr_t virt, int
> > slot_id,
> 
> > uint32_t add_size, uint32_t group_id)
> 
> > {
> 
> > MemSlot *slot;
> 
> > @@ -60,8 +61,9 @@ int memslot_validate_virt(RedMemSlotInfo *info, unsigned
> > long virt, int slot_id,
> 
> > if (virt < slot->virt_start_addr || (virt + add_size) >
> > slot->virt_end_addr)
> > {
> 
> > print_memslots(info);
> 
> > spice_warning("virtual address out of range"
> 
> > -              "    virt=0x%lx+0x%x slot_id=%d group_id=%d\n"
> 
> > -              "    slot=0x%lx-0x%lx delta=0x%lx",
> 
> > +              "    virt=0x%" G_GINTPTR_MODIFIER "x+0x%x slot_id=%d
> > group_id=%d\n"
> 
> > +              "    slot=0x%" G_GINTPTR_MODIFIER "x-0x%" G_GINTPTR_MODIFIER
> > "x"
> 
> > +              " delta=0x%" G_GINTPTR_MODIFIER "x",
> 
> > virt, add_size, slot_id, group_id,
> 
> > slot->virt_start_addr, slot->virt_end_addr, slot->address_delta);
> 
> > return 0;
> 
> > @@ -69,9 +71,9 @@ int memslot_validate_virt(RedMemSlotInfo *info, unsigned
> > long virt, int slot_id,
> 
> > return 1;
> 
> > }
> 
> > 
> 
> > -unsigned long memslot_max_size_virt(RedMemSlotInfo *info,
> 
> > -                                    unsigned long virt, int slot_id,
> 
> > -                                    uint32_t group_id)
> 
> > +uintptr_t memslot_max_size_virt(RedMemSlotInfo *info,
> 
> > +                                uintptr_t virt, int slot_id,
> 
> > +                                uint32_t group_id)
> 
> > {
> 
> > MemSlot *slot;
> 
> > 
> 
> > @@ -91,7 +93,7 @@ void *memslot_get_virt(RedMemSlotInfo *info, QXLPHYSICAL
> > addr, uint32_t add_size
> 
> > {
> 
> > int slot_id;
> 
> > int generation;
> 
> > -    unsigned long h_virt;
> 
> > +    uintptr_t h_virt;
> 
> > 
> 
> > MemSlot *slot;
> 
> > 
> 
> > @@ -171,7 +173,7 @@ void memslot_info_destroy(RedMemSlotInfo *info)
> 
> > }
> 
> > 
> 
> > void memslot_info_add_slot(RedMemSlotInfo *info, uint32_t slot_group_id,
> > uint32_t slot_id,
> 
> > -                           uint64_t addr_delta, unsigned long virt_start,
> > unsigned long virt_end,
> 
> > +                           uint64_t addr_delta, uintptr_t virt_start,
> > uintptr_t virt_end,
> 
> > uint32_t generation)
> 
> > {
> 
> > spice_assert(info->num_memslots_groups > slot_group_id);
> 
> > diff --git a/server/memslot.h b/server/memslot.h
> 
> > index 00728c4b6..45381feb9 100644
> 
> > --- a/server/memslot.h
> 
> > +++ b/server/memslot.h
> 
> > @@ -25,9 +25,9 @@
> 
> > 
> 
> > typedef struct MemSlot {
> 
> > int generation;
> 
> > -    unsigned long virt_start_addr;
> 
> > -    unsigned long virt_end_addr;
> 
> > -    long address_delta;
> 
> > +    uintptr_t virt_start_addr;
> 
> > +    uintptr_t virt_end_addr;
> 
> > +    intptr_t address_delta;
> 
> > } MemSlot;
> 
> > 
> 
> > typedef struct RedMemSlotInfo {
> 
> > @@ -39,8 +39,8 @@ typedef struct RedMemSlotInfo {
> 
> > uint8_t memslot_id_shift;
> 
> > uint8_t memslot_gen_shift;
> 
> > uint8_t internal_groupslot_id;
> 
> > -    unsigned long memslot_gen_mask;
> 
> > -    unsigned long memslot_clean_virt_mask;
> 
> > +    uintptr_t memslot_gen_mask;
> 
> > +    uintptr_t memslot_clean_virt_mask;
> 
> > } RedMemSlotInfo;
> 
> > 
> 
> > static inline int memslot_get_id(RedMemSlotInfo *info, uint64_t addr)
> 
> > @@ -53,11 +53,11 @@ static inline int memslot_get_generation(RedMemSlotInfo
> > *info, uint64_t addr)
> 
> > return (addr >> info->memslot_gen_shift) & info->memslot_gen_mask;
> 
> > }
> 
> > 
> 
> > -int memslot_validate_virt(RedMemSlotInfo *info, unsigned long virt, int
> > slot_id,
> 
> > +int memslot_validate_virt(RedMemSlotInfo *info, uintptr_t virt, int
> > slot_id,
> 
> > uint32_t add_size, uint32_t group_id);
> 
> > -unsigned long memslot_max_size_virt(RedMemSlotInfo *info,
> 
> > -                                    unsigned long virt, int slot_id,
> 
> > -                                    uint32_t group_id);
> 
> > +uintptr_t memslot_max_size_virt(RedMemSlotInfo *info,
> 
> > +                                uintptr_t virt, int slot_id,
> 
> > +                                uint32_t group_id);
> 
> > void *memslot_get_virt(RedMemSlotInfo *info, QXLPHYSICAL addr, uint32_t
> > add_size,
> 
> > int group_id);
> 
> > 
> 
> > @@ -68,7 +68,7 @@ void memslot_info_init(RedMemSlotInfo *info,
> 
> > uint8_t internal_groupslot_id);
> 
> > void memslot_info_destroy(RedMemSlotInfo *info);
> 
> > void memslot_info_add_slot(RedMemSlotInfo *info, uint32_t slot_group_id,
> > uint32_t slot_id,
> 
> > -                           uint64_t addr_delta, unsigned long virt_start,
> > unsigned long virt_end,
> 
> > +                           uint64_t addr_delta, uintptr_t virt_start,
> > uintptr_t virt_end,
> 
> > uint32_t generation);
> 
> > void memslot_info_del_slot(RedMemSlotInfo *info, uint32_t slot_group_id,
> > uint32_t slot_id);
> 
> > void memslot_info_reset(RedMemSlotInfo *info);
> 
> > diff --git a/server/red-parse-qxl.c b/server/red-parse-qxl.c
> 
> > index eb2c0b538..01fd60580 100644
> 
> > --- a/server/red-parse-qxl.c
> 
> > +++ b/server/red-parse-qxl.c
> 
> > @@ -1335,7 +1335,7 @@ static bool red_get_message(QXLInstance
> > *qxl_instance,
> > RedMemSlotInfo *slots, in
> 
> > {
> 
> > QXLMessage *qxl;
> 
> > int memslot_id;
> 
> > -    unsigned long len;
> 
> > +    uintptr_t len;
> 
> > uint8_t *end;
> 
> > 
> 
> > /*
> 
> > diff --git a/server/spice-qxl.h b/server/spice-qxl.h
> 
> > index 2f47910b9..5349d9275 100644
> 
> > --- a/server/spice-qxl.h
> 
> > +++ b/server/spice-qxl.h
> 
> > @@ -187,8 +187,8 @@ struct QXLDevMemSlot {
> 
> > uint32_t slot_group_id;
> 
> > uint32_t slot_id;
> 
> > uint32_t generation;
> 
> > -    unsigned long virt_start;
> 
> > -    unsigned long virt_end;
> 
> > +    uintptr_t virt_start;
> 
> > +    uintptr_t virt_end;
> 
> > uint64_t addr_delta;
> 
> > uint32_t qxl_ram_size;
> 
> > };
> 

Frediano 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20190811/a29aa5bc/attachment-0001.html>


More information about the Spice-devel mailing list