Commit 59d9413094d7295d74926e63d7df4963399ab53a
1 parent
0516ede0
target-mips: CP0 Random register improvements
- Use a LFSR to generate the random value - Make sure to not return the same value twice Based on a patch by Hervé Poussineau. Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6233 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
8 additions
and
3 deletions
hw/mips_timer.c
| ... | ... | @@ -7,10 +7,15 @@ |
| 7 | 7 | /* XXX: do not use a global */ |
| 8 | 8 | uint32_t cpu_mips_get_random (CPUState *env) |
| 9 | 9 | { |
| 10 | - static uint32_t seed = 0; | |
| 10 | + static uint32_t lfsr = 1; | |
| 11 | + static uint32_t prev_idx = 0; | |
| 11 | 12 | uint32_t idx; |
| 12 | - seed = seed * 314159 + 1; | |
| 13 | - idx = (seed >> 16) % (env->tlb->nb_tlb - env->CP0_Wired) + env->CP0_Wired; | |
| 13 | + /* Don't return same value twice, so get another value */ | |
| 14 | + do { | |
| 15 | + lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xd0000001u); | |
| 16 | + idx = lfsr % (env->tlb->nb_tlb - env->CP0_Wired) + env->CP0_Wired; | |
| 17 | + } while (idx == prev_idx); | |
| 18 | + prev_idx = idx; | |
| 14 | 19 | return idx; |
| 15 | 20 | } |
| 16 | 21 | ... | ... |