From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LKzvT-00035u-Gk for qemu-devel@nongnu.org; Thu, 08 Jan 2009 13:48:15 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LKzvS-00035H-JG for qemu-devel@nongnu.org; Thu, 08 Jan 2009 13:48:15 -0500 Received: from [199.232.76.173] (port=52177 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LKzvS-000356-7c for qemu-devel@nongnu.org; Thu, 08 Jan 2009 13:48:14 -0500 Received: from savannah.gnu.org ([199.232.41.3]:53037 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LKzvR-00073A-FY for qemu-devel@nongnu.org; Thu, 08 Jan 2009 13:48:13 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LKzvR-0004C8-0x for qemu-devel@nongnu.org; Thu, 08 Jan 2009 18:48:13 +0000 Received: from aurel32 by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LKzvQ-0004C4-OO for qemu-devel@nongnu.org; Thu, 08 Jan 2009 18:48:12 +0000 MIME-Version: 1.0 Errors-To: aurel32 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Aurelien Jarno Message-Id: Date: Thu, 08 Jan 2009 18:48:12 +0000 Subject: [Qemu-devel] [6233] target-mips: CP0 Random register improvements Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6233 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6233 Author: aurel32 Date: 2009-01-08 18:48:12 +0000 (Thu, 08 Jan 2009) Log Message: ----------- 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?\195?\169 Poussineau. Signed-off-by: Aurelien Jarno Modified Paths: -------------- trunk/hw/mips_timer.c Modified: trunk/hw/mips_timer.c =================================================================== --- trunk/hw/mips_timer.c 2009-01-08 16:01:33 UTC (rev 6232) +++ trunk/hw/mips_timer.c 2009-01-08 18:48:12 UTC (rev 6233) @@ -7,10 +7,15 @@ /* XXX: do not use a global */ uint32_t cpu_mips_get_random (CPUState *env) { - static uint32_t seed = 0; + static uint32_t lfsr = 1; + static uint32_t prev_idx = 0; uint32_t idx; - seed = seed * 314159 + 1; - idx = (seed >> 16) % (env->tlb->nb_tlb - env->CP0_Wired) + env->CP0_Wired; + /* Don't return same value twice, so get another value */ + do { + lfsr = (lfsr >> 1) ^ (-(lfsr & 1u) & 0xd0000001u); + idx = lfsr % (env->tlb->nb_tlb - env->CP0_Wired) + env->CP0_Wired; + } while (idx == prev_idx); + prev_idx = idx; return idx; }