diff --git a/src/tests/system/kernel/mtrr_power_test.c b/src/tests/system/kernel/mtrr_power_test.c new file mode 100644 index 0000000000..b95a7e6793 --- /dev/null +++ b/src/tests/system/kernel/mtrr_power_test.c @@ -0,0 +1,85 @@ +#include +#include + +#define uint64 long long unsigned +#define int64 long long + +static void +nearest_powers(uint64 value, uint64 *lower, uint64 *upper) +{ + uint64 power = 1UL << 12; + if (lower) + *lower = power; + while (value >= power) { + if (lower) + *lower = power; + power <<= 1; + } + if (upper) + *upper = power; +} + + +int64 sols[5]; +int solCount; +int64 props[5]; + +static void +find_nearest(uint64 value, int iteration) +{ + if (iteration > 4 || (iteration + 1) >= solCount) + return; + uint64 down, up; + int i; + nearest_powers(value, &down, &up); + props[iteration] = down; + if (value - down < 0x100000) { + for (i=0; i<=iteration; i++) + sols[i] = props[i]; + solCount = iteration + 1; + return; + } + find_nearest(value - down, iteration + 1); + props[iteration] = -up; + if (up - value < 0x100000) { + for (i=0; i<=iteration; i++) + sols[i] = props[i]; + solCount = iteration + 1; + return; + } + find_nearest(up - value, iteration + 1); +} + +int +main() +{ + uint64 length = 0xbfee0000; // 0xdfee0000; // 0x9ffb0000; //0xa7f00000; //0x70000000; //0xbfee0000; + uint64 base = 0; + solCount = 5; + find_nearest(length, 0); + printf("sols "); + int i; + for (i=0; i