From: Oliver Kurth Date: Fri, 2 Aug 2019 18:07:20 +0000 (-0700) Subject: Common header file change not applicable to open-vm-tools. X-Git-Tag: stable-11.1.0~286 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3ee98ec57068779dbe8459aeeaeee8ac36e00d89;p=thirdparty%2Fopen-vm-tools.git Common header file change not applicable to open-vm-tools. --- diff --git a/open-vm-tools/lib/include/clamped.h b/open-vm-tools/lib/include/clamped.h index 1051fd352..3e878857b 100644 --- a/open-vm-tools/lib/include/clamped.h +++ b/open-vm-tools/lib/include/clamped.h @@ -1,5 +1,5 @@ /********************************************************* - * Copyright (C) 2009-2017 VMware, Inc. All rights reserved. + * Copyright (C) 2009-2019 VMware, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published @@ -43,6 +43,7 @@ #include "vm_basic_types.h" #include "vm_assert.h" +#include "vm_basic_defs.h" #if defined __cplusplus extern "C" { @@ -352,6 +353,49 @@ Clamped_URoundUpBits32(uint32 *out, // OUT } +/* + *----------------------------------------------------------------------------- + * + * Clamped_UMul64 -- + * + * Unsigned 64-bit multiplication. + * + * Results: + * On success, returns TRUE. If the result would have overflowed + * and we clamped it to MAX_UINT64, returns FALSE. + * + *----------------------------------------------------------------------------- + */ + +static INLINE Bool +Clamped_UMul64(uint64 *out, // OUT + uint64 a, // IN + uint64 b) // IN +{ + uint32 aL = a & MASK64(32); + uint32 aH = a >> 32; + uint32 bL = b & MASK64(32); + uint32 bH = b >> 32; + + if (aH > 0 && bH > 0) { + *out = MAX_UINT64; + return FALSE; + } else { + uint64 s1 = (aH * (uint64)bL) << 32; + uint64 s2 = (aL * (uint64)bH) << 32; + uint64 s3 = (aL * (uint64)bL); + uint64 sum; + Bool clamped = FALSE; + + clamped |= !Clamped_UAdd64(&sum, s1, s2); + clamped |= !Clamped_UAdd64(&sum, sum, s3); + + *out = sum; + return !clamped; + } +} + + #if defined __cplusplus } // extern "C" #endif