mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-23 13:36:05 +00:00
Fix Coverity #261967, Infinite loop
Coverity has identified that the __aeabi_imod function will loop forever if the denominator is not a power of 2, which is probably not the desired behaviour. The functions in the rest of the file are compiler implementations of division if ARMv7 does not implement division which is permitted by the spec. However, while most of the functions in the file are documented and referenced in other places online, __aeabi_uimod and __aeabi_imod are not. For this reason, these functions have been removed from the code base, which also removes the Coverity error. Change-Id: I20066d72365329a8b03a5536d865c4acaa2139ae Signed-off-by: Justin Chadwell <justin.chadwell@arm.com>
This commit is contained in:
parent
fc6b626c6b
commit
9624c0a9e0
1 changed files with 0 additions and 47 deletions
|
@ -33,13 +33,11 @@ static void uint_div_qr(unsigned int numerator, unsigned int denominator,
|
||||||
unsigned int __aeabi_uidivmod(unsigned int numerator, unsigned int denominator);
|
unsigned int __aeabi_uidivmod(unsigned int numerator, unsigned int denominator);
|
||||||
|
|
||||||
unsigned int __aeabi_uidiv(unsigned int numerator, unsigned int denominator);
|
unsigned int __aeabi_uidiv(unsigned int numerator, unsigned int denominator);
|
||||||
unsigned int __aeabi_uimod(unsigned int numerator, unsigned int denominator);
|
|
||||||
|
|
||||||
/* returns in R0 and R1 by tail calling an asm function */
|
/* returns in R0 and R1 by tail calling an asm function */
|
||||||
signed int __aeabi_idivmod(signed int numerator, signed int denominator);
|
signed int __aeabi_idivmod(signed int numerator, signed int denominator);
|
||||||
|
|
||||||
signed int __aeabi_idiv(signed int numerator, signed int denominator);
|
signed int __aeabi_idiv(signed int numerator, signed int denominator);
|
||||||
signed int __aeabi_imod(signed int numerator, signed int denominator);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* __ste_idivmod_ret_t __aeabi_idivmod(signed numerator, signed denominator)
|
* __ste_idivmod_ret_t __aeabi_idivmod(signed numerator, signed denominator)
|
||||||
|
@ -106,15 +104,6 @@ unsigned int __aeabi_uidiv(unsigned int numerator, unsigned int denominator)
|
||||||
return qr.q;
|
return qr.q;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int __aeabi_uimod(unsigned int numerator, unsigned int denominator)
|
|
||||||
{
|
|
||||||
struct qr qr = { .q_n = 0, .r_n = 0 };
|
|
||||||
|
|
||||||
uint_div_qr(numerator, denominator, &qr);
|
|
||||||
|
|
||||||
return qr.r;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned int __aeabi_uidivmod(unsigned int numerator, unsigned int denominator)
|
unsigned int __aeabi_uidivmod(unsigned int numerator, unsigned int denominator)
|
||||||
{
|
{
|
||||||
struct qr qr = { .q_n = 0, .r_n = 0 };
|
struct qr qr = { .q_n = 0, .r_n = 0 };
|
||||||
|
@ -145,42 +134,6 @@ signed int __aeabi_idiv(signed int numerator, signed int denominator)
|
||||||
return qr.q;
|
return qr.q;
|
||||||
}
|
}
|
||||||
|
|
||||||
signed int __aeabi_imod(signed int numerator, signed int denominator)
|
|
||||||
{
|
|
||||||
signed int s;
|
|
||||||
signed int i;
|
|
||||||
signed int j;
|
|
||||||
signed int h;
|
|
||||||
struct qr qr = { .q_n = 0, .r_n = 0 };
|
|
||||||
|
|
||||||
/* in case modulo of a power of 2 */
|
|
||||||
for (i = 0, j = 0, h = 0, s = denominator; (s != 0) || (h > 1); i++) {
|
|
||||||
if (s & 1) {
|
|
||||||
j = i;
|
|
||||||
h++;
|
|
||||||
}
|
|
||||||
s = s >> 1;
|
|
||||||
}
|
|
||||||
if (h == 1)
|
|
||||||
return numerator >> j;
|
|
||||||
|
|
||||||
if (((numerator < 0) && (denominator > 0)) ||
|
|
||||||
((numerator > 0) && (denominator < 0)))
|
|
||||||
qr.q_n = 1; /* quotient shall be negate */
|
|
||||||
|
|
||||||
if (numerator < 0) {
|
|
||||||
numerator = -numerator;
|
|
||||||
qr.r_n = 1; /* remainder shall be negate */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (denominator < 0)
|
|
||||||
denominator = -denominator;
|
|
||||||
|
|
||||||
uint_div_qr(numerator, denominator, &qr);
|
|
||||||
|
|
||||||
return qr.r;
|
|
||||||
}
|
|
||||||
|
|
||||||
signed int __aeabi_idivmod(signed int numerator, signed int denominator)
|
signed int __aeabi_idivmod(signed int numerator, signed int denominator)
|
||||||
{
|
{
|
||||||
struct qr qr = { .q_n = 0, .r_n = 0 };
|
struct qr qr = { .q_n = 0, .r_n = 0 };
|
||||||
|
|
Loading…
Add table
Reference in a new issue