|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 4/4] x86/HVM: __hvm_copy()'s size parameter is an unsigned quantity
> -----Original Message-----
> From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of Jan
> Beulich
> Sent: 03 March 2020 10:20
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>; Roger Pau Monné
> <roger.pau@xxxxxxxxxx>; Wei Liu
> <wl@xxxxxxx>; Paul Durrant <paul@xxxxxxx>
> Subject: [EXTERNAL][Xen-devel] [PATCH v5 4/4] x86/HVM: __hvm_copy()'s size
> parameter is an unsigned
> quantity
>
> CAUTION: This email originated from outside of the organization. Do not click
> links or open
> attachments unless you can confirm the sender and know the content is safe.
>
>
>
> There are no negative sizes. Make the function's parameter as well as
> that of its derivates "unsigned int". Similarly make its local "count"
> variable "unsigned int", and drop "todo" altogether. Don't use min_t()
> anymore to calculate "count". Restrict its scope as well as that of
> other local variables of the function.
>
> While at it I've also noticed that {copy_{from,to},clear}_user_hvm()
> have been returning "unsigned long" for no apparent reason, as their
> respective "size" parameters have already been "unsigned int". Adjust
> this as well as a slightly wrong comment there at the same time.
>
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Paul Durrant <pdurrant@xxxxxxxx>
> ---
> v5: New.
>
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -3249,14 +3249,9 @@ enum hvm_translation_result hvm_translat
> #define HVMCOPY_phys (0u<<2)
> #define HVMCOPY_linear (1u<<2)
> static enum hvm_translation_result __hvm_copy(
> - void *buf, paddr_t addr, int size, struct vcpu *v, unsigned int flags,
> + void *buf, paddr_t addr, unsigned int size, struct vcpu *v, unsigned int
> flags,
> uint32_t pfec, pagefault_info_t *pfinfo)
> {
> - gfn_t gfn;
> - struct page_info *page;
> - p2m_type_t p2mt;
> - int count, todo = size;
> -
> ASSERT(is_hvm_vcpu(v));
>
> /*
> @@ -3275,12 +3270,14 @@ static enum hvm_translation_result __hvm
> return HVMTRANS_unhandleable;
> #endif
>
> - while ( todo > 0 )
> + while ( size > 0 )
'while ( size )'
ought to do.
> {
> + struct page_info *page;
> + gfn_t gfn;
> + p2m_type_t p2mt;
> enum hvm_translation_result res;
> unsigned int pgoff = addr & ~PAGE_MASK;
> -
> - count = min_t(int, PAGE_SIZE - pgoff, todo);
> + unsigned int count = min((unsigned int)PAGE_SIZE - pgoff, size);
>
> res = hvm_translate_get_page(v, addr, flags & HVMCOPY_linear,
> pfec, pfinfo, &page, &gfn, &p2mt);
> @@ -3336,7 +3333,7 @@ static enum hvm_translation_result __hvm
> addr += count;
> if ( buf )
> buf += count;
> - todo -= count;
> + size -= count;
> put_page(page);
> }
>
> @@ -3344,21 +3341,21 @@ static enum hvm_translation_result __hvm
> }
>
> enum hvm_translation_result hvm_copy_to_guest_phys(
> - paddr_t paddr, void *buf, int size, struct vcpu *v)
> + paddr_t paddr, void *buf, unsigned int size, struct vcpu *v)
> {
> return __hvm_copy(buf, paddr, size, v,
> HVMCOPY_to_guest | HVMCOPY_phys, 0, NULL);
> }
>
> enum hvm_translation_result hvm_copy_from_guest_phys(
> - void *buf, paddr_t paddr, int size)
> + void *buf, paddr_t paddr, unsigned int size)
> {
> return __hvm_copy(buf, paddr, size, current,
> HVMCOPY_from_guest | HVMCOPY_phys, 0, NULL);
> }
>
> enum hvm_translation_result hvm_copy_to_guest_linear(
> - unsigned long addr, void *buf, int size, uint32_t pfec,
> + unsigned long addr, void *buf, unsigned int size, uint32_t pfec,
> pagefault_info_t *pfinfo)
> {
> return __hvm_copy(buf, addr, size, current,
> @@ -3367,7 +3364,7 @@ enum hvm_translation_result hvm_copy_to_
> }
>
> enum hvm_translation_result hvm_copy_from_guest_linear(
> - void *buf, unsigned long addr, int size, uint32_t pfec,
> + void *buf, unsigned long addr, unsigned int size, uint32_t pfec,
> pagefault_info_t *pfinfo)
> {
> return __hvm_copy(buf, addr, size, current,
> @@ -3375,7 +3372,7 @@ enum hvm_translation_result hvm_copy_fro
> PFEC_page_present | pfec, pfinfo);
> }
>
> -unsigned long copy_to_user_hvm(void *to, const void *from, unsigned int len)
> +unsigned int copy_to_user_hvm(void *to, const void *from, unsigned int len)
> {
> int rc;
>
> @@ -3389,7 +3386,7 @@ unsigned long copy_to_user_hvm(void *to,
> return rc ? len : 0; /* fake a copy_to_user() return code */
> }
>
> -unsigned long clear_user_hvm(void *to, unsigned int len)
> +unsigned int clear_user_hvm(void *to, unsigned int len)
> {
> int rc;
>
> @@ -3400,10 +3397,11 @@ unsigned long clear_user_hvm(void *to, u
> }
>
> rc = hvm_copy_to_guest_linear((unsigned long)to, NULL, len, 0, NULL);
> - return rc ? len : 0; /* fake a copy_to_user() return code */
> +
> + return rc ? len : 0; /* fake a clear_user() return code */
> }
>
> -unsigned long copy_from_user_hvm(void *to, const void *from, unsigned len)
> +unsigned int copy_from_user_hvm(void *to, const void *from, unsigned int len)
> {
> int rc;
>
> --- a/xen/include/asm-x86/hvm/guest_access.h
> +++ b/xen/include/asm-x86/hvm/guest_access.h
> @@ -1,8 +1,8 @@
> #ifndef __ASM_X86_HVM_GUEST_ACCESS_H__
> #define __ASM_X86_HVM_GUEST_ACCESS_H__
>
> -unsigned long copy_to_user_hvm(void *to, const void *from, unsigned len);
> -unsigned long clear_user_hvm(void *to, unsigned int len);
> -unsigned long copy_from_user_hvm(void *to, const void *from, unsigned len);
> +unsigned int copy_to_user_hvm(void *to, const void *from, unsigned int len);
> +unsigned int clear_user_hvm(void *to, unsigned int len);
> +unsigned int copy_from_user_hvm(void *to, const void *from, unsigned int
> len);
>
> #endif /* __ASM_X86_HVM_GUEST_ACCESS_H__ */
> --- a/xen/include/asm-x86/hvm/support.h
> +++ b/xen/include/asm-x86/hvm/support.h
> @@ -70,9 +70,9 @@ enum hvm_translation_result {
> * address range does not map entirely onto ordinary machine memory.
> */
> enum hvm_translation_result hvm_copy_to_guest_phys(
> - paddr_t paddr, void *buf, int size, struct vcpu *v);
> + paddr_t paddr, void *buf, unsigned int size, struct vcpu *v);
> enum hvm_translation_result hvm_copy_from_guest_phys(
> - void *buf, paddr_t paddr, int size);
> + void *buf, paddr_t paddr, unsigned int size);
>
> /*
> * Copy to/from a guest linear address. @pfec should include PFEC_user_mode
> @@ -96,10 +96,10 @@ typedef struct pagefault_info
> } pagefault_info_t;
>
> enum hvm_translation_result hvm_copy_to_guest_linear(
> - unsigned long addr, void *buf, int size, uint32_t pfec,
> + unsigned long addr, void *buf, unsigned int size, uint32_t pfec,
> pagefault_info_t *pfinfo);
> enum hvm_translation_result hvm_copy_from_guest_linear(
> - void *buf, unsigned long addr, int size, uint32_t pfec,
> + void *buf, unsigned long addr, unsigned int size, uint32_t pfec,
> pagefault_info_t *pfinfo);
>
> /*
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |