x86/boot: Simplify size calculations in move_memory()

While both src and dst are similar, src is mapped only accounting for src's
size, while dst is mapped based on the minimum of both.  This means that in
some cases, an overly large mapping is requested for src.

Rework the sz calcuation to be symmetric, and leave an explanation of how
logic works.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Daniel P. Smith <dpsmith@apertussolutions.com>
This commit is contained in:
Andrew Cooper committed 2024-10-23 10:27:36 +01:00
1 parent c960871c7c
commit 2c3294775e
1 file changed
+10 -11
+10 -11
View File
@@ -492,23 +492,22 @@ static void __init move_memory(
while ( size )
{
unsigned int end /* mapsz */;
unsigned int soffs = src & mask;
unsigned int doffs = dst & mask;
unsigned int sz;
void *d, *s;
end = soffs + size;
if ( end > blksz )
end = blksz;
sz = end - soffs;
s = bootstrap_map_addr(src, src + sz);
/*
* We're copying between two arbitrary buffers, as they fall within
* 2M-aligned regions with a maximum bound of blksz.
*
* For [ds]offs + size <= blksz, sz = size.
* For [ds]offs + size > blksz, sz = blksz - [ds]offs.
*/
sz = max(soffs, doffs);
sz = min(sz + size, blksz) - sz;
end = doffs + size;
if ( end > blksz )
end = blksz;
if ( sz > end - doffs )
sz = end - doffs;
s = bootstrap_map_addr(src, src + sz);
d = bootstrap_map_addr(dst, dst + sz);
memmove(d, s, sz);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.